为什么这些实模式代码可以在虚拟机中运行,但不能在我的真机上运行?
why these real-mode code works in virtual machine but not working on my real machine?
我正在尝试将 assemble 代码写入 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 处理器,我做错了什么吗?
用
之类的东西初始化段寄存器
xor ax, ax ;Initialize seg regs with 0
mov ss, ax
mov ds, ax
指令 mov al, [...]
使用 ds
而 push ...
使用 ss
.
确保它们相等。
我没有提到它,但正如 正确指出的那样,更新时必须小心 SS
。
SS:SP
对必须根据中断原子地 更新,否则在初始化中途触发的中断将使用不完全有效的 SS:SP
对。
最简单的方法是在 ss
初始化 之后更新 sp
mov bp, 0x8000
mov ss, ax
mov sp, bp
因为 CPU 在 mov ss, ...
之后禁止整个指令的中断。
否则,您可以显式地将初始化代码包装在 cli
sti
对中。
我正在尝试将 assemble 代码写入 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 处理器,我做错了什么吗?
用
之类的东西初始化段寄存器xor ax, ax ;Initialize seg regs with 0
mov ss, ax
mov ds, ax
指令 mov al, [...]
使用 ds
而 push ...
使用 ss
.
确保它们相等。
我没有提到它,但正如 SS
。
SS:SP
对必须根据中断原子地 更新,否则在初始化中途触发的中断将使用不完全有效的 SS:SP
对。
最简单的方法是在 ss
sp
mov bp, 0x8000
mov ss, ax
mov sp, bp
因为 CPU 在 mov ss, ...
之后禁止整个指令的中断。
否则,您可以显式地将初始化代码包装在 cli
sti
对中。