我想我開始明白怎麼回事,但現在我已經花年齡試圖理解爲什麼下面不工作:訪問此字符串常量的此程序集有什麼問題?
org 0x7C00
mov ax,0x0000
mov ds,ax
mov si, HelloWorld
HelloWorld db 'Hello World',13,10,0
什麼我期待的是,mov si, HelloWorld
指令將將0x7C08
的值設置爲si
(即0x7c00
+ HelloWorld
的偏移量),準備好像lodsb
之類的值。
當我建立這個(使用NASM),並運行它(使用Bochs的)我找到了該結束的指令,實際上是這樣的:
mov si, 0x8400
這是爲什麼,而其中的值是0x8400
來自?
更新:我發現,在數據段將HelloWorld
產生預期的輸出:
section .data
HelloWorld db 'Hello World',13,10,0
這是爲什麼?
FYI用於構建該命令是nasm -f bin input.asm -o output.bin
更新2我突然意識到0x8400
是0x7c00 + 0x0800
,其中8是從輸出開始偏移的HelloWorld
- 我注意到這一點,當我發現當使用org 0
時,使用的地址是0x0800
。
我仍然不明白髮生了什麼 - 雖然發現這只是讓我更加困惑!
按照要求,使用ndisasm
拆解:
00000000 B80000 mov ax,0x0
00000003 8ED8 mov ds,ax
00000005 BE0084 mov si,0x8400
00000008 48 dec ax
00000009 656C gs insb
0000000B 6C insb
0000000C 6F outsw
0000000D 20576F and [bx+0x6f],dl
00000010 726C jc 0x7e
00000012 640D0A00 fs or ax,0xa
你如何建立和運行它?以下是我所看到的: 'mov si,07C08' – 2011-05-06 16:12:03
您是否在nasm命令行上使用了任何特殊標誌?當我通過nasm運行上面的代碼時,我得到了你期望的。 – Aaron 2011-05-06 16:14:46
是的,給我們完整的'nasm'命令行來重現這一點。 – NPE 2011-05-06 16:19:03