我正在关注编写一个简单的操作系统 - 来自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'但我得到的是角色'
输出:
我猜标签test
无效,但我不知道为什么
答案 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答案。