2011-10-06 108 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