内存引用和汇编程序中的标签使用由BIOS加载到内存作为引导扇区

时间:2017-08-06 11:43:47

标签: assembly x86 nasm bios

我正在研究操作系统开发的book by Nick Blundell。它有一个关于第3章引导扇区编程(16位实模式)的例子,如下所示:

0x58

在书中,提到:

  

如果我们运行该程序,我们会看到只有第二次尝试成功打印   'X'。

嗯,这不是我得到的结果:

0x7c00

我的结果是:

enter image description here

暗示我的QEMU BIOS仅在第三次尝试时打印“X”。我没有修改书中的例子,我想知道我错过了什么。

更新

我的二进制代码的对象转储显示“X”的十六进制ASCII代码,即0x001d位于内存地址0x7c1d + $ od -t x1 -A x BOOK_EXAMPLE.bin 000000 b4 0e b0 1d cd 10 a0 1d 00 cd 10 bb 1d 00 81 c3 000010 00 7c 8a 07 cd 10 a0 1e 7c cd 10 eb fe 58 00 00 000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa 000200 = mov al, [0x7c1d ]

{{1}}

因此我用以下内容替换了一个代码行:

{{1}}

现在输出符合预期:

enter image description here

1 个答案:

答案 0 :(得分:4)

最后一个使用的是固定地址。由于您的代码如何汇编,X可能不会在该地址结束。您可以使用-l nasm选项要求提供商家信息,并亲眼看看。在这里,我得到:

23                                  the_secret :
24 0000001D 58                              db "X" 

您可以看到地址0x1d而不是0x1e。本书的汇编程序可能使用了前面的jmp $的3字节跳转,因此1字节差异。您可以将其更改为jmp near $,然后代码将按预期工作。你也可以修改当然的地址。

PS:让ds未初始化是个坏主意,你永远不知道bios如何设置它。常见的可能性是0x7c00,此代码仅适用于后一种情况。如果ds=0x7c0只显示第二个X

相关问题