8086匯編 中斷
中斷:CPU不再接着(剛執行完的指令)向下執行,而是轉去處理中斷信息。
- 內中斷:由CPU內部發生的事件而引起的中斷
- 外中斷:由外部設備發生的事件引起的中斷
8086的內中斷
CPU內部產生的中斷
- 除法錯誤,比如:執行div指令產生的除法溢出
- 單步執行
- 執行into指令
- 執行int 指令
8086的中斷類型碼
- (1)除法錯誤:0
- (2)單步執行:1
- (3)執行 into 指令:4
- (4)執行 int n指令 ,立即數 n 為中斷類型碼。

assume cs:codesg, ss:stacksg, ds:datasg stacksg segment db 200h dup (0) stacksg ends datasg segment ; ‘$': 9 退出顯示的格式 ; 13,10:回車換行 szmsg db 13,10,'hello world!',13,10,'$' datasg ends codesg segment start: mov ax,datasg mov ds,ax lea dx, szmsg ; ah寄存器為9:終端號 9 顯示信息、顯示ds為段地址 dx 位偏移地址的包含信息 ; 會取上面 szmsg 符號的 hello worold! 字符 mov ah,9 int 21h ; ah寄存器為4c:則退出程序,為Dos狀態 mov ax,4c00h int 21h codesg ends end start
中斷過程
中斷過程由CPU的硬件自動完成;
用中斷類型碼找到中斷向量,並用它設置CS和IP
8086CPU的中斷過程
(1)從中斷信息中取得中斷類型碼
(2)標志寄存器的值入棧——中斷過程中要改變標志寄存器的值,需要先行保護
(3)設置標志寄存器的第8位TF 和第9位IF的值為0
(4)CS的內容入棧;
(5)IP的內容入棧;
(6)從中斷向量表讀取中斷處理程序的入口地址,設置IP和CS。
編制中斷處理程序
(1)取得中斷類型碼N;
(2) pushf
(3) TF = 0,IF = 0
TF(Trap Flag): 陷阱標志,用於單步調試;
IF(Interrupt Flag):中斷標志;
(4) push CS
(5) push IP
(6)(IP) = (N*4),(CS) = (N*4+2)
CPU隨時都可能檢測到中斷信息,所以中斷處理程序必須常駐內存(一直存儲在內存某段空間之中)。
中斷處理程序的入口地址,即中斷向量,必須存儲在對應的中斷向量表表項中(0000:0000-0000:03FF)。
單步中斷
兩個和中斷相關的寄存器標志位
TF-陷阱標志(Trap flag):用於調試時的單步方式操作。當TF=1時,每條指令執行完后產生陷阱,由系統控制計算機;當TF=0時,CPU正常工作,不產生陷阱。
IF-中斷標志(Interrupt flag):當IF=1時,允許CPU響應可屏蔽中斷請求;當IF=0時,關閉中斷。
CPU在執行完一條指令之后,如果檢測到標志寄存器的TF位為1,則產生單步中斷(中斷類型碼為1),引發中斷過程,執行中斷處理程序。
中斷過程
(1)取得中斷類型碼1;
(2)標志寄存器入棧,TF、IF設置為0;
(3) CS、IP入棧;
(4)(IP)=(1*4),(CS)=(1*4+2)。
• 中斷處理程序也由一條條指令組成的。
• 如果在執行中斷處理程序之前,TF=1,則CPU在執行完中斷處理程序的第一條指令后,又要產生單步中斷,轉去執行單步中斷的中斷處理程序的第一條指令……
• 上面的過程將陷入一個永遠不能結束的循環,CPU永遠執行單步中斷處理程序的第一條指令。
• 所以,在進入中斷處理程序之前,設置TF=0。
應用:中斷不響應的情況
一般情況下,CPU在執行完當前指令后,如果檢測到中斷信息,就響應中斷,引發中斷過程。
在有些情況下,CPU 在執行完當前指令后,即便是發生中斷,也不會響應。
例:在執行完向 ss寄存器傳送數據的指令后,即便是發生中斷,CPU 也不會響應。
原因:ss:sp聯合指向棧頂,而對它們的設置應該連續完成。
以此保證對棧的正確操作!
注:棧段 與 棧頂指針 必須連續起來去做。
由int指令引發的中斷
int n引起的中斷
- CPU內部產生的中斷信息
- 除法錯誤
- 單步執行
- 執行into指令
- 執行int 指令
int格式: int n,n為中斷類型碼
功能:引發中斷過程
CPU 執行int n指令,相當於引發一個 n號中斷的中斷過程,執行過程如下:
(1)取中斷類型碼n;
(2)標志寄存器入棧,IF = 0,TF = 0;
(3)CS、IP入棧;
(4)(IP) = (n*4),(CS) = (n*4+2)。 —從此處轉去執行n號中斷的中斷處理程序。
• int 指令的最終功能和call指令相似,都是調用一段程序。
• 一般情況下,系統將一些具有一定功能的子程序,以中斷處理程序的方式提供給應用程序調用。
BIOS和DOS中斷處理
BIOS,是在系統板的ROM中存放着一套程序
- 容量:8KB
- 地址:從FE000H開始
BIOS中的主要內容
(1)硬件系統的檢測和初始化程序
(2)外部中斷和內部中斷的中斷例程
(3)用於對硬件設備進行I/O操作的中斷例程
(4)其他和硬件系統相關的中斷例程
使用BIOS功能調用,程序員不用了解硬件操作細節,直接使用指令設置參數,並中斷調用BIOS例
程,即可完成相關工作!
使用BIOS功能調用:(1)方便編程;(2)能寫出簡潔、可讀性好、易於移植的程序。
一、在屏幕的5行12列顯示3個紅底高亮閃爍綠色的'a'
用BIOS的10h中斷
(ah)=2時,調用第10h中斷例程的2號子程序,設置光標位置
(ah)=9時,調用第10h中斷例程的9號子程序,在光標位置顯示字符

assume cs:code code segment mov ah,2 ;置光標功能 mov bh,0 ;第0頁 mov dh,5 ;dh中放行號 mov dl,12 ;dl中放列號 int 10h mov ah,9 ;顯示字符功能 mov al,'a' ;字符 mov bl,11001010b;顏色屬性 mov bh,0 ;第0頁 mov cx,3 ;字符重復個數 int 10h mov ax,4c00h int 21h code ends end