[英]why these real-mode code works in virtual machine but not working on my real machine?
我正在嘗試將匯編代碼寫入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
。
確保它們相等。
我沒有提到它,但是正如Michael正確指出的那樣,在更新SS
時必須要小心。
對SS:SP
必須相對於中斷進行原子更新,否則在初始化過程中觸發的中斷將使用SS:SP
對不完全有效。
最簡單的方法是在初始化ss
之后立即更新sp
mov bp, 0x8000
mov ss, ax
mov sp, bp
因為CPU在mov ss, ...
之后禁止整個指令的中斷。
否則,你可以明確地包裹在初始化代碼cli
sti
對。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.