NASM bin 文件中的初始化数据似乎不起作用

NASM initialized data in bin files seems not working

我正在看书 编写一个简单的操作系统 — 来自 Nick Blundell 的 Scratch。我正在尝试完成第 21 页上的任务。我编写了一个简单的程序来测试初始化​​数据如何在 bin 文件中工作。这是程序:

hello.asm

section .data

test:   db      'A'

section .text


        mov     ah,0x0e
        mov     al,[test]
        int     0x10

        jmp     $


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

然后编译我这样做:

nasm hello.asm -f bin -o hello.bin

到运行:

qemu-system-i386 hello.bin

问题是,预期的输出是字符 'A' 但我得到的是字符 'S'

输出:

我猜是标签test没有正常工作,但我不知道为什么

当使用 NASM-f bin 选项时,.text 部分将出现在 [=13 之前的平面二进制文件中=] 部分。因此,如果您编译代码,前 512 个字节将包含代码 (.text) 段,并且数据将出现在前 512 个字节之后。在像这样的引导加载程序中使用它时,您希望数据在前 512 个字节中。对于 -f bin 和引导加载程序,最好的做法是删除 .data 部分并将数据放在代码之后但引导加载程序签名之前。

您还应该使用 ORG 指令设置原点。引导加载程序加载到内存中的物理地址 0x07c00 或 0x0000:0x7c00 的 CS:IP(或其他等效的 segment offset pairs)。最简单的方法是在代码顶部使用 org 0x7c00。这将生成相对于 0x7c00 的偏移量和标签。 NASM 使用 -f bin 选项的默认设置是使用原点 0x0000.

如果使用 org 0x7c00,则需要使用 DS 段寄存器值为零才能正确访问内存中的数据。

您的代码可能如下所示:

org 0x7c00

section .text

        xor     ax,ax
        mov     ds,ax      ; DS = AX = 0
        mov     ah,0x0e
        mov     al,[test]
        int     0x10

        jmp     $

test:   db      'A'

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

通常也设置一个堆栈是个好主意。我有一个 Whosebug 答案,其中包含一些可能有用的