【发布时间】:2017-01-07 11:56:48
【问题描述】:
我正在学习如何从 osdev 制作引导加载程序。我正在使用 NASM 来组装我的代码,并使用 x86 机器来运行我的引导加载程序。这是一小段代码,它打印一个字符并进入一个无限循环:
BITS 16
xor ax, ax
mov ah, 0x0E
mov al, 0x41
int 0x10
jmp $
times 510-($-$$) db 0x00
db 0x55
db 0xAA
我的问题是:为什么当我注释 'xor ax, ax' 指令时代码没有运行?在上面的代码中可以看到,修改了ax的值是为了存储中断参数,所以代码应该在没有xor指令的情况下运行...
补充说明:
我正在使用以下命令在 Xubuntu 下组装代码: nasm -f bin -o main.bin main.asm
我正在使用以下命令将 512 字节的机器代码存储到笔式驱动器中: sudo dd if=main.bin of=/dev/sdb
我的电脑可以从笔式驱动器启动
非常感谢。
【问题讨论】:
-
通常你会在引导加载程序文件的顶部有
org 0x7c00,在xor ax, ax之后你将它复制到DS寄存器和ES如有必要(不会受到伤害),在xor ax, ax之后使用mov ds, ax和mov es, ax。xor ax, ax与将 AX 归零几乎相同。由于您在xor ax,ax完成与否之后立即覆盖 AH 和 AL 并不重要。你确定有没有它的工作方式不同吗?还应该考虑设置SS:SP(栈段和指针) -
唯一的另一种可能性是您的 BIOS 正在(盲目地)覆盖它认为的 BPB,该 BPB 经常出现在引导加载程序的开头(通常在 JMP 指令之后)。如果它盲目地更新您的引导加载程序,则可能是 BIOS 在您的代码加载到 RAM 后所做的修改导致您的代码行为不正常。
-
我建议您考虑在 int 10h/ah=0eh 之前执行
xor bx, bx,因为 BH 应该是要写入的页码(将其设置为 0)。 -
更多关于 BIOS 参数块的信息可以在here 找到。
xor ax,ax在正常工作的引导加载程序中根本不需要。真正的硬件有一些奇怪的怪癖,这些怪癖在 bochs、qemu、virtualbox 等虚拟环境中通常是看不到的。 -
@RyanB :见彼得的回答。他做到了。在 IRC 聊天中也提到过。当我提到“真正的硬件有一些奇怪的怪癖,你在 bochs、qemu、virtualbox 等虚拟环境中通常看不到的时候,我暗示了这个想法。”但作为提示可能有点迟钝。
标签: x86 nasm bootloader