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 答案,其中包含一些可能有用的 。
我正在看书 编写一个简单的操作系统 — 来自 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 答案,其中包含一些可能有用的