2

我正在尝试将汇编代码写入 mbr 以使用 BIOS ISR。我将以下代码写入 mbr,期望将字符“ABCD”打印在屏幕上:

mov ah,0x0e
mov bp,0x8000
mov sp,bp

push 'A' 
push 'B'
push 'C'
push 'D'

mov al, [0x7ffe]
int 0x10

mov al, [0x7ffc]
int 0x10

mov al, [0x7ffa]
int 0x10

mov al, [0x7ff8]
int 0x10

; infinite loop
jmp $

; padding 0s and set the  magic number to make it bootable
times 510 -( $ - $$ ) db 0     
dw 0xaa55

这些代码在 bochs 或 qemu 模拟器上运行良好,但是当我写入我的真实磁盘并使用它启动时,什么都没有打印。我已经测试直接将 %al 寄存器设置为 chars ,并且打印效果很好。我正在使用 AMD PhenomII 955 处理器,我做错了什么吗?

4

1 回答 1

5

用类似的东西初始化段寄存器

xor ax, ax       ;Initialize seg regs with 0
mov ss, ax 
mov ds, ax 

该指令mov al, [...]使用dswhilepush ...使用ss
确保它们相等。


我没有提到它,但正如迈克尔正确指出的那样,更新时必须小心SS
该对SS:SP必须针对中断自动SS:SP更新,否则在初始化过程中触发的中断将使用不完全有效的对。

最简单的方法是在初始化sp 之后更新ss

mov bp, 0x8000
mov ss, ax
mov sp, bp

因为 CPU 在 之后禁止整个指令的中断mov ss, ...
否则,您可以将初始化代码显式包装成一cli sti对。

于 2016-09-13T12:24:16.320 回答