2011-10-06 77 views
0

我对bin格式有点困惑,我使用的是nasm汇编程序,我不太了解segements和BBS值是如何编码到BIN中的。系统在执行时如何加载此格式?平面二进制格式

非常感谢

+0

平面二进制格式的目的不是没有任何这种功能,并完全避免链接加载步骤?我认为执行只是从二进制文件的字节'0'开始,并且从那里你自己。 –

+0

是的,我意识到这是这样的。但我只是想知道如何放置不同的段,以及如果BSS段实际上在bin文件中填充了零。 – jimmyzmli

回答

2

bin不保留任何结构,也不段。所有的代码和数据都是一样的,没有特殊的头文件或描述符。 .bss内容将被忽略,因为bin和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 "abcdef" ; 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 

Disassemblying:

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):

C:\>nsm.com 
Hello Wrold! 

操作系统预计DOS .COM风格的程序没有特殊的结构,文件的第一个字节包含必须执行的第一条指令。

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

+0

谢谢!这真的解决了问题。但是这是否意味着与BIN的段寄存器纯粹是为了寻址(实模式?)而不是段控制(保护模式)? – jimmyzmli

+0

@ user982401:Nasm的二进制格式的段/段几乎没用,你可以将它们放在源文件中,但是在输出二进制文件中几乎没有它们的踪迹。如果您将源文件组合为其他输出格式,例如obj,coff/aout,elf,win32,那么这些部分/段将使其进入输出文件,并且链接器将能够与他们做一些有意义的工作(为OS创建一个合适的可执行文件,并标记为代码(可执行文件),数据(不可执行文件)等)。只有obj格式的段/段代表x86段。 –

+0

@user:在真实模式下,分段仅用于地址,它们实际上是一种黑客,允许在16位机器上访问1MB,否则只能访问64KB。 – ninjalj