Assembly 平面二进制格式

Assembly 平面二进制格式,assembly,binary,Assembly,Binary,我对bin格式有点困惑,我使用的是nasm汇编程序,我不太明白segments和BBS值是如何被编码到bin中的。执行时,系统如何加载此格式 非常感谢bin没有保留任何结构或片段。所有代码和数据都按原样进行,没有特殊的标题或描述符。bin忽略bss内容,resb/resw/resd/etc应用作占位符 示例代码: bits 16 section .text org 100h ; copy hw[] to copy[] mov si, hw mov di, copy mov cx, 15 cld

我对bin格式有点困惑,我使用的是nasm汇编程序,我不太明白segments和BBS值是如何被编码到bin中的。执行时,系统如何加载此格式


非常感谢

bin
没有保留任何结构或片段。所有代码和数据都按原样进行,没有特殊的标题或描述符。
bin
忽略bss内容,resb/resw/resd/etc应用作占位符

示例代码:

bits 16
section .text
org 100h

; copy hw[] to copy[]
mov si, hw
mov di, copy
mov cx, 15
cld
rep movsb

; print copy[]
mov dx, copy
mov ah, 9
int 21h
ret

section .bss

blah db "0123456789abcdef" ; data will be ignored, nasm will warn here

copy resb 15 ; reserve 15 bytes for the text string

section .data

hw db "Hello Wrold!",13,10,"$"
汇编:

C:\>nasm nsm.asm -fbin -onsm.com
nsm.asm:20: warning: attempt to initialise memory in a nobits section: ignored
拆卸:

C:\>ndisasm -b 16 -o 100h nsm.com
00000100  BE1401            mov si,0x114
00000103  BF3401            mov di,0x134
00000106  B90F00            mov cx,0xf
00000109  FC                cld
0000010A  F3A4              rep movsb
0000010C  BA3401            mov dx,0x134
0000010F  B409              mov ah,0x9
00000111  CD21              int 0x21
00000113  C3                ret
00000114  48                dec ax ; this is hw db "Hello Wrold!",13,10,"$"
00000115  656C              gs insb
00000117  6C                insb
00000118  6F                outsw
00000119  205772            and [bx+0x72],dl
0000011C  6F                outsw
0000011D  6C                insb
0000011E  64210D            and [fs:di],cx
00000121  0A24              or ah,[si]
在Windows XP(或DOS)上运行:

OS希望DOS.COM风格的程序没有特殊的结构,文件的第一个字节包含必须执行的第一条指令


有关详细信息,请参阅NASM文档。我相信您可以在那里找到所有问题的答案。

平面二进制格式的目的不是为了不包含任何这些内容并完全避免链接加载步骤吗?我认为执行只是从二进制文件的字节
0
开始,然后你就可以自立了。是的,我知道是这样的。但我只是想知道如何放置不同的段,以及BSS段是否在bin文件中实际填充了零。谢谢!这真的把事情弄清楚了。但这是否意味着对于BIN,段寄存器纯粹用于寻址(实模式?)而不是段控制(保护模式)?@user982401:Nasm的二进制格式的节/段实际上是无用的,您可以在源文件中包含它们,但在输出二进制中几乎没有它们的踪迹。如果您将源文件组装成其他输出格式,例如obj、coff/aout、elf、win32,则节/段将使其成为输出文件,链接器将能够使用它们执行一些有意义的工作(为操作系统创建一个适当的可执行文件,并将其标记为代码(可执行)、数据(不可执行)等)。仅在obj格式中,节/段表示x86段。@用户:在实模式中,段仅用于添加大小调整,它们实际上是允许在16位计算机中访问1MB的黑客,否则只能访问64KB。
C:\>nsm.com
Hello Wrold!