一段时间以来,我一直在尝试在计算机(即物理机)上测试一个简单的引导程序,但我遇到了一些非常奇怪的行为。
我的引导程序位于名为“ boot.asm”的文件中,并包含以下代码:
[ORG 0x7c00]
start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x9000
mov si, mesg1
call print
mov ax, 0x0201 ;ah=0x02, al=0x01
mov bx, 0x5000 ;address = 0x5000 (I have also attempted this at 0x8000)
mov cx, 0x0002 ;ch=0x00, cl=0x02
mov dh, 0x0
int 0x13
mov si, mesg2
call print
jmp $
print:
pusha
mov ah, 0xe
xor bl, bl
.loop:
lodsb
test al, al
jz .end
int 0x10
jmp .loop
.end:
popa
ret
mesg1 db "Msg1", 0x0
mesg2 db "Tst1", 0x0
times 510 - ($ - $$) db 0x0
db 0x55, 0xaa
我用一个包含以下命令的makefile对其进行编译(kernel.asm除了垃圾外仅包含其他内容,仅用于较早的测试):
nasm -f bin -o bin/boot.bin src/boot.asm
nasm -f bin -o bin/kernel.bin src/kernel.asm
cat bin/boot.bin bin/kernel.bin > boot.img
当我在Virtualbox中以软盘启动“ boot.img”时,在屏幕上会得到预期的输出:
Msg1Tst1
当我尝试在物理计算机上运行此问题时,会出现问题。我使用以下命令将启动映像复制到闪存驱动器:
sudo dd if=boot.img of=/dev/sdb
然后我重新启动计算机,并且得到了最奇怪的输出:
Msg1Msg1
无论我怎么努力,我都不知道发生了什么。稍作修改后,我发现如果我移动代码,
mov si, mesg2
call print
在读取操作之前,它将给出预期的输出。有人可以向我解释我在做什么错吗?我已经待了一天,但我无法弄清楚问题所在。