簡體   English   中英

為什么這些實模式代碼可在虛擬機上運行但不能在我的真實機上運行?

[英]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, [...]使用dspush ...使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM