1边苹、內(nèi)中斷的產(chǎn)生
當 CPU
的內(nèi)部發(fā)生某些需要立即處理的的事情時,就會發(fā)出內(nèi)部中斷信息杜顺。
除法錯誤财搁,比如執(zhí)行 div 指令產(chǎn)生的除法溢出;
單步執(zhí)行躬络;
執(zhí)行 info 指令妇拯;
執(zhí)行 int 指令。
CPU
要進行不同的處理洗鸵,首先要知道中斷信息的來源,所以中斷信息必須包含識別來源的編碼仗嗦,我們稱為中斷類型碼膘滨,8086
CPU
中斷類型碼為一個字節(jié)型數(shù)據(jù),可以表示 256
種中斷信息的來源稀拐,簡稱中斷源火邓。在 8086
CPU
中,上述的 4
種中斷源表示如下:
除法錯誤:0
單步執(zhí)行:1
執(zhí)行 info 指令:4
執(zhí)行 int 指令德撬,該指令的格式為 int n 铲咨,指令中的 n 為字節(jié)型立即數(shù),是提供給 CPU 的中斷類型嗎蜓洪。
2纤勒、中斷向量表
8086
CPU
接收到中斷信息后,用 8
位的中斷類型碼通過中斷向量表找到相應(yīng)的中斷處理程序入口地址隆檀;中斷向量表在內(nèi)存中存放著摇天,對于 8086 PC
機,中斷向量表指定放在內(nèi)存地址 0
處恐仑,從內(nèi)存 0000:0000
到 0000:03FF
的 1024
個 單元中存放著中斷向量表泉坐,中斷向量表只能放在這里。
那么在中斷向量表中裳仆,一個表項存放著一個中斷向量腕让,也就是一個中斷處理程序的入口地址,這個入口地址包括段地址和偏移地址歧斟,所以一個表項占兩個字纯丸,高地址字存放段地址偏形,低地址存放偏移地址。
中斷過程大致如下:
(1)取得中斷類型碼
(2)pushf 標志寄存器入棧
(3)tf = 0, if = 0 設(shè)置標志寄存器的第 8 位和第 9 位的值為 0
(4)push cs CS 入棧
(5)push ip IP 入棧
(6)(ip) = (n*4), (cs) = (n*4+2) 從內(nèi)存地址為中斷類型碼?4 中和中斷類型碼?4+2 的兩個字單元中讀取中斷處理程序的入口地址液南。
(7)執(zhí)行中斷程序
例:重新編寫一個 0
號中斷處理程序壳猜,它的功能是在屏幕中間顯示 overfliw!
然后返回到操作系統(tǒng)
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do0 ;設(shè)置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;設(shè)置 es:di 指向目的地址
mov cx,offset do0end-offset do0 ;設(shè)置 CS 為傳輸長度
cld ;設(shè)置傳輸方向為正
rep movsb
mov ax,4c00h
int 21h
do0:jmp short do0start
db "overflow!"
do0start: 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,9 ;設(shè)置 CX 為字符串長度
s:mov al,[si]
mov es:[di],al
inc si
loop s
mov ax,4c00h
int 21h
do0end:nop
code ends
end start
3、int 指令
int
指令的指令格式為:int n
滑凉,n
為中斷類型碼统扳,上面已有提及過,執(zhí)行過程如下
(1)取中斷類型碼 n;
(2)標記寄存器入棧畅姊,if = 0咒钟,tf = 0;
(3)CS、IP 入棧若未;
(4)(IP)=(n*4)朱嘴,(CS)=(n*4+2)
(5)執(zhí)行 n 號中斷處理程序