除法中斷錯誤的自定義處理 王爽《組合語言》

2021-06-12 17:37:20 字數 1797 閱讀 7204

對於80x86 cpu 執行div 等除法指令的時候,如果發生了除法溢位錯誤,將產生中斷型別碼為0的中斷資訊,cpu將檢測到這個資訊,然後引發中斷過程,轉去執行0號中斷所對應的中斷處理程式。

中斷處理程式 inter.asm 如下:

assume cs:code

code segment

main:

mov ax,cs

mov ds,ax

mov ax,offset print

mov si,ax ;設定中斷處理程式的源位址

mov ax,0020h

mov es,ax

mov di,0 ;設定安全記憶體位址空間的位址

mov cx,offset pend - offset print ;設定傳輸資訊的長度

cld ;設定傳輸方向為正

rep movsb ;迴圈傳輸字元cx次

mov ax,0 ;設定中斷向量表(幫助:80x86cpu中規定向量表存放在0000:0000到0000:03e8的1000個記憶體單元中,乙個表項佔4個位元組)

mov es,ax

mov word ptr es:[0*4],200h ;低位址存放ip

mov word ptr es:[0*4+2],0h ;高位址存放cs

mov ax,4c00h

int 21h

print: push ax

push cx

push si

push di

push es

jmp short s ;要跳過自定義的資料區,否則會被cpu解析為**執行的!

adr:db 'error:division overflow!',0 ;自定義顯示資訊

s: mov ax,0b800h+1*160+20*2 ;視訊記憶體開始位置b800:0000

mov es,ax

mov di,0

mov si,ax

mov ax,cs

mov ds,ax

mov ax,0

mov ah,24h

mov cx,0

s0:

mov cl,ds:[si]

jcxz ok

mov es:[di],cl

mov es:[di+1],ah

inc si

add di,2

jmp short s0

ok:

pop es

pop di

pop si

pop cx

pop ax

mov ax,4c00h ;如果換用iret的話,中斷處理完後,原程式會從產生中斷的語句處繼續執行,在此程式中,則會陷入死迴圈

int 21h

pend: nop

code ends

end main

測試程式 test.asm 如下:

assume cs:code

code segment

main: mov ax,1000h

mov bl,1

div bl ;因為是8位除數,所以進行8位的除法運算。即ax中為被除數。其結果ah存放餘數,al存放商。

mov ax,4c00h

int 21h

code ends

end main

測試結果如下圖所示:

自定義錯誤頁面處理

配置類 configuration public class errorpageconfig implements errorpageregistrar controller 前後端不分離 controller public class maincontroller or 前後端分離 restcon...

在Windows CE增加自定義中斷處理

isq interrupt id 邏輯中斷號 event物件。當中斷發生時,isr 中斷服務例程 返回該中斷號對應的邏輯中斷號,然後盡可能快地返回 隨後ce就set該邏輯中斷號對應的event物件 如果有的話 以喚醒在該event等待的ist 中斷服務執行緒 大部分工作都是由ist來完成。一般來說i...

在Windows CE增加自定義中斷處理

在windows ce增加自定義中斷處理 isq interrupt id 邏輯中斷號 event 物件。當中斷發生時,isr 中斷服務例程 返回該中斷號對應的邏輯中斷號,然後盡可能快地返回 隨後ce就 set該邏輯中斷號對應的 event 物件 如果有的話 以喚醒在該 event 等待的ist 中...