NASM初始化bin文件中的数据似乎无法正常工作

时间:2016-03-14 08:50:58

标签: assembly nasm qemu bootloader x86-16

我正在关注编写一个简单的操作系统 - 来自Scratch 的Nick Blundell。我正在尝试在第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'但我得到的是角色'

输出:

enter image description here

我猜标签test无效,但我不知道为什么

1 个答案:

答案 0 :(得分:0)

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

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

建立堆栈通常也是个好主意。我有一个可能有用的general bootloader tips的Stackoverflow答案。