我想我开始明白怎么回事,但现在我已经花年龄试图理解为什么下面不工作:访问此字符串常量的此程序集有什么问题?
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