1、內中斷的產生
當 CPU
的內部發生某些需要立即處理的的事情時,就會發出內部中斷信息。
除法錯誤,比如執行 div 指令產生的除法溢出;
單步執行;
執行 info 指令;
執行 int 指令。
CPU
要進行不同的處理,首先要知道中斷信息的來源,所以中斷信息必須包含識別來源的編碼,我們稱為中斷類型碼,8086
CPU
中斷類型碼為一個字節型數據,可以表示 256
種中斷信息的來源,簡稱中斷源。在 8086
CPU
中,上述的 4
種中斷源表示如下:
除法錯誤:0
單步執行:1
執行 info 指令:4
執行 int 指令,該指令的格式為 int n ,指令中的 n 為字節型立即數,是提供給 CPU 的中斷類型嗎。
2、中斷向量表
8086
CPU
接收到中斷信息后,用 8
位的中斷類型碼通過中斷向量表找到相應的中斷處理程序入口地址;中斷向量表在內存中存放著,對于 8086 PC
機,中斷向量表指定放在內存地址 0
處,從內存 0000:0000
到 0000:03FF
的 1024
個 單元中存放著中斷向量表,中斷向量表只能放在這里。
那么在中斷向量表中,一個表項存放著一個中斷向量,也就是一個中斷處理程序的入口地址,這個入口地址包括段地址和偏移地址,所以一個表項占兩個字,高地址字存放段地址,低地址存放偏移地址。
中斷過程大致如下:
(1)取得中斷類型碼
(2)pushf 標志寄存器入棧
(3)tf = 0, if = 0 設置標志寄存器的第 8 位和第 9 位的值為 0
(4)push cs CS 入棧
(5)push ip IP 入棧
(6)(ip) = (n*4), (cs) = (n*4+2) 從內存地址為中斷類型碼?4 中和中斷類型碼?4+2 的兩個字單元中讀取中斷處理程序的入口地址。
(7)執行中斷程序
例:重新編寫一個 0
號中斷處理程序,它的功能是在屏幕中間顯示 overfliw!
然后返回到操作系統
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do0 ;設置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;設置 es:di 指向目的地址
mov cx,offset do0end-offset do0 ;設置 CS 為傳輸長度
cld ;設置傳輸方向為正
rep movsb
mov ax,4c00h
int 21h
do0:jmp short do0start
db "overflow!"
do0start: mov ax,cs
mov ds,ax
mov si,202h ;設置 ds:si 指向字符串
mov ax,0b800h
mov es,ax
mov di,12*160+36*2 ;設置 es:di 指向顯存空間的中間位置
mov cx,9 ;設置 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
為中斷類型碼,上面已有提及過,執行過程如下
(1)取中斷類型碼 n;
(2)標記寄存器入棧,if = 0,tf = 0;
(3)CS、IP 入棧;
(4)(IP)=(n*4),(CS)=(n*4+2)
(5)執行 n 號中斷處理程序