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 ................
看起來前幾個字節被覆蓋。有任何想法嗎?
這個問題似乎正是你所說的。執行從數據開始。我把它移到了bootsector簽名之前的文件底部,現在看起來很好。謝謝。 – sduplooy 2012-01-07 14:10:02