2012-01-06 75 views
0
創建常量時

考慮以下彙編代碼部分引導加載程序:奇怪的內存佈局在NASM

bits 16 
org 0x7C00 

msg_init db 'Initializing...', 0Ah, 0Dh, 0 
msg_completed db 'Completed', 0Ah, 0Dh, 0 

jmp start 

start: 
    xor ax, ax    
    mov ds, ax    
    mov es, ax    

    mov si, msg_init   
    call print    

    mov si, msg_completed 
    call print    

    mov al, '*' 
    mov bx, 0 
    mov ah, 0Eh 
    int 10h 

    cli 
    hlt 

print: 
    lodsb     ; al = [ds:si] - char to write 
    or al, al    ; set zero flag if al=0 
    jz return    ; jump to return if zero flag set 
    mov bx, 0    ; bh = page #, bl = color 
    mov ah, 0Eh    ; function = teletype output 
    int 10h    ; video interrupt 
    jmp print    ; print next char if not zero 

return: 
    ret     ; return 

times 510-($-$$) db 0 
dw 0xAA55 

內存佈局是這樣的:

0000: 49 6e 69 74 69 61 6c 69-7a 69 6e 67 2e 2e 2e 0a Initializing.... 
0010: 0d 00 43 6f 6d 70 6c 65-74 65 64 0a 0d 00 e9 00 ..Completed..... 
0020: 00 31 c0 8e d8 8e c0 be-00 7c e8 11 00 be 12 7c .1.......|.....| 
0030: e8 0b 00 b0 2a bb 00 00-b4 0e cd 10 fa f4 ac 08 ....*........... 
0040: c0 74 09 bb 00 00 b4 0e-cd 10 eb f2 c3 00 00 00 .t.............. 

當我改變msg_completed常數「已啓用」即msg_completed db 'Enabled', 0Ah, 0Dh, 0的內存佈局更改爲:

0000: 00 f0 e3 fe 00 00 2e 0a-00 00 15 7c 00 00 57 2a ...........|..W* 
0010: 0d 00 45 6e 61 62 6c 65-64 0a 0d 00 e9 00 00 31 ..Enabled......1 
0020: c0 8e d8 8e c0 be 00 7c-e8 11 00 be 12 7c e8 0b .......|.....|.. 
0030: 00 b0 2a bb 00 00 b4 0e-cd 10 fa f4 ac 08 c0 74 ..*............t 
0040: 09 bb 00 00 b4 0e cd 10-eb f2 c3 00 00 00 00 00 ................ 

看起來前幾個字節被覆蓋。有任何想法嗎?

回答

1

我沒有觀察到這種行爲(在Windows XP上試過「2003年6月13日編譯的版本0.98.36」和2011年7月15日編譯的版本2.09.10)。所有4個二進制文件都有「初始化」。

你確定你沒有改變任何東西嗎?第二種情況下的二進制文件是NASM輸出的內容,而不是你從媒體上讀回的內容?

順便說一句,你的代碼不會工作。 CPU從一開始就從db 'Initializing...', 0Ah, 0Dh, 0開始執行引導扇區。這是數據,而不是代碼。

而且,這將是一件好事,以確保CS=0IP>=0x7C00代碼早期(某些BIOS跳到0x7C0:0而不是0:0x7C00),並明確FLAGS.DFCLD之前LODSB

+0

這個問題似乎正是你所說的。執行從數據開始。我把它移到了bootsector簽名之前的文件底部,現在看起來很好。謝謝。 – sduplooy 2012-01-07 14:10:02