1. 中斷
CPU 不再接著(剛執(zhí)行完的指令)向下執(zhí)行,而是轉(zhuǎn)去處理這個特殊信息。
2. 8086CPU 產(chǎn)生中斷的4種情況
(1)出發(fā)錯誤 比如 div指令產(chǎn)生的除法溢出 中斷類型碼:0
(2)單步執(zhí)行 中斷類型碼:1
(3)執(zhí)行 into 指令 中斷類型碼:4
(4)執(zhí)行 int 指令 該指令的格式位 int n ,指令中的n為立即數(shù),是提供給 CPU的 中斷類型碼
3. 中斷向量表
- CPU 通過中斷向量表找到中斷程序的入口地址。
- 8086CPU 中 中斷向量表就必須存放在 0000:0000 ~ 0000:03FF 中。
- 中斷向量表中 一個表項存放一個中斷向量,包括段地址 和 偏移地址。占兩個字,高地址字存放段地址 低地址字存放偏移地址。
4. 8086CPU 收到中斷信息后,引發(fā)的中斷過程
(1)從中斷信息中,取得中斷類型碼 取得中斷類型碼 N
(2)標(biāo)志寄存器的值入棧(因為在中斷過程中要改變標(biāo)志寄存器的值,所以先將其值保存在棧中) pushf
(3)設(shè)置標(biāo)志寄存器的第8為 TF 和 第9為 IF 的值為 0 TF=0 IF=0
(4)CS 的內(nèi)容入棧 push cs
(5)IP 的內(nèi)容入棧 push ip
(6)從內(nèi)存地址為 中斷類型碼 4 和 中斷類型碼4+2 的兩個字單元中讀取中斷處理程序的入口地址設(shè)置 IP 和 CS。 (ip)=(N4), (cs)=(N4+2)**
4. 中斷處理程序 和 iret 指令
中斷處理的常規(guī)步驟
(1)保存用到的寄存器
(2)處理中斷
(3)恢復(fù)用到的寄存器
(4)用 iret 指令返回iret指令執(zhí)行的操作是:
pop IP
pop CS
popf
在中斷過程中 寄存器入棧的順序是 標(biāo)志寄存器 cs ip
iret的出棧順序是 ip cs 標(biāo)志寄存器 正好一一對應(yīng)。
5. 編寫 0 號中斷處理程序,在除法溢出發(fā)生時,在屏幕中間顯式字符串 “divide error??!”,然后返回到 dos
assume cs:codesg
codesg segment
start: ;do0 安裝程序
mov ax,cs ;設(shè)置 ds:si 指向源地址
mov ds,ax
mov si,offset do0
mov ax,0 ;設(shè)置 es:di 指向目的地址
mov es,ax
mov di,200h
mov cx,offset do0end - offset do0 ;設(shè)置 cx 傳輸長度
cld ;設(shè)置 傳輸方向為正
rep movsb
;設(shè)置中斷向量表
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
mov ax,1000h
mov bh,1
div bh
mov ax,4c00h
int 21h
do0: jmp short do0start
db "divide error!!"
do0start: ;顯示字符串"divide error!!"
mov ax,cs
mov ds,ax
mov si,202h ;設(shè)置 ds:si 指向字符串
mov ax,0b800h
mov es,ax
mov di,12*160+36*2 ;設(shè)置 es:di 指向顯存空間的中間位置
mov cx,14
s: mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],2
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end: nop
codesg ends
end start