RT,我也是看了王爽的匯編語言入門,在撰寫除法溢位內中斷處理的時候寫了這樣一個程式(test.asm):
assume cs:code
code segment
start:
mov ax, 0ffffh
mov bx, 1
div bl
mov ax, 4c00h
int 21h
code ends
end start
在DOSBox下跑,程式一直在運行,不退出,我用debug逐步除錯,發現CPU默認的除法溢位處理程式是個死回圈……
如下:

當我先運行內中斷的裝載程式后,再運行test.exe,就會正常的進行中斷處理。
內中斷裝載程式(main.asm)如下:
assume cs:code
code segment
start:
mov ax, cs
mov ds, ax
mov si, offset do0
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset do0end - offset do0
cld
rep movsb
mov ax, 0
mov es, ax
mov word ptr es:[0*4], 200h
mov word ptr es:[0*4+2], 0
mov ax, 4c00h
int 21h
do0:
mov ax, cs
mov ds, ax
mov si, offset data - offset do0 + 200h
mov ax, 0b800h
mov es, ax
mov di, 12*160+36*2
mov cx, 9
s:
mov al, [si]
mov es:[di], al
inc si
add di, 2
loop s
mov ax, 4c00h
int 21h
data:
db "overflow!"
do0end:
nop
code ends
end start
請問,為什么DOSBox模擬出的16位環境下,系統自帶的除法溢位處理會導致死回圈?
(我是Win10 64位 企業版 2004,OS內部版本19041.450,搭建了VS Code開發環境,其中用到了masm-code這個插件)
uj5u.com熱心網友回復:
更奇怪的是,在不加載中斷處理的情況下,我把test.asm改成直接呼叫int 0h,程式可以正常結束,但不列印任何字串uj5u.com熱心網友回復:
DOSBox 只是提供個簡單的 dos虛擬環境,它的那些中斷好像都是假的;而且 #DIV/0 這個例外,在除錯軟體里也可能會被除錯軟體接管。uj5u.com熱心網友回復:
從指令編碼看,FE 38似乎應該是inc bh,不知道為什么debug沒識別uj5u.com熱心網友回復:
可是21號中斷可以用啊?
uj5u.com熱心網友回復:
是可以運行,但不是用來琢磨系統底層具體內容的,好像看到過很多的中斷向量都是一樣的,這顯然是不可能的,再隨便看看些個入口,代碼也不似通常的那樣的;所以,我覺得它的這些也是虛擬的,和其它虛擬機 Virtual PC 或 VMWare 之類的不一樣的。再提個例子吧,以前個老的 dos 的三國的游戲,加密的、用軟盤的,抓了軟盤映像,VPC 就運行失敗,VMWare 就可以,這個可能就是 VPC 虛擬得還不如 VMW 真實。現在看來,DosBox 就更虛擬了。uj5u.com熱心網友回復:
Debug到資料區有好多這種???,是不是都是Debug不認,還是說沒有對應的指令?uj5u.com熱心網友回復:
有道理
uj5u.com熱心網友回復:
DosBox也可以建磁盤鏡像,在其中安裝真正的DOS,兼容性會更好。實際上, DosBox是支持 DOS、win 3.x最好的虛擬機軟體(可以支持到win 98),能支持高解析度顯示模式、聲卡、CDROM、串并口,比VirtualBox、VMWare要強,當然并非VirtualBox、VMWare做不到,而是它們不太關注過于低端的系統虛擬化。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/13269.html
標籤:匯編語言
