# 80X86中斷系統
- 能夠處理256個中斷
- 用中斷向量號0~255區別
- 可屏蔽中斷還需要借助專用中斷控制器Intel 8259A實現優先權管理
### 1、中斷的分類
中斷可以分為內部中斷和外部中斷。
(1)內部中斷
- 除法錯中斷
- 指令中斷
- 溢出中斷
- 單步中斷
- 斷點中斷
(2)外部中斷
- 非屏蔽中斷
- 可屏蔽中斷
如果覺得上面的分類太抽象,那么下面的圖會給你直觀的印象。
[](http://img.blog.csdn.net/20160101224459374)
通過這張圖,我們可以明白,內部中斷是在處理器內部產生。外部中斷是通過兩個信號線(NMI和INTR)引入處理器內部的。
### 2.內部中斷
### (1)除法錯中斷
在執行除法指令時,若除數為0或商超過了寄存器所能表達的范圍,則產生一個向量號為0的內部中斷,稱為除法錯中斷。
例如:
mov bl,0
idiv bl ;除數BL=0,產生除法錯中斷
再比如:
mov ax,200h
mov bl,1
div bl ;商=200H,不能用AL表達,產生除法錯中斷
### (2)指令中斷
在執行中斷調用指令INT n時產生的一個向量號為n(0 ~ 255)的內部中斷,稱為指令中斷。
### (3)溢出中斷
在執行溢出中斷指令INTO時,若溢出標志OF為1,則產生一個向量號為4的內部中斷,被稱為溢出中斷。
### (4)單步中斷
CPU在執行完一條指令之后,如果檢測到標志寄存器的TF位為1,則產生單步中斷,單步中斷的向量號為1.
### (5)斷點中斷
主要用在程序調試中,向量號為3,利用“int3(指令機器碼為0xcc)”這條指令設置斷點,目的是顯示斷點前程序的執行結果。
**注意:內部中斷不受標志寄存器IF位的影響。**
### 3.外部中斷
### (1)非屏蔽中斷
通過非屏蔽中斷請求信號向微處理器提出的中斷請求,微處理器無法禁止,將在當前指令執行結束予以響應,這個中斷被稱為非屏蔽中斷。
非屏蔽中斷的向量號為2,非屏蔽中斷請求信號為NMI
非屏蔽中斷主要用于處理系統的意外或故障。例如:電源掉電前的數據保護,存儲器讀寫錯誤的處理。
### (2)可屏蔽中斷
通過INTR引腳引入CPU,只有當中斷允許標志位IF=1時,才能被CPU響應。通過8259A,一個系統中可有多個可屏蔽中斷。
### 4.實模式下的中斷向量表
### (1)中斷向量
中斷向量就是中斷服務程序的入口地址。它有兩部分組成:
- 中斷服務程序所在段的段基址(2個字節)
- 中斷服務程序入口的偏移地址(2個字節)
### (2)中斷向量表
每個中斷向量占4個字節,256種中斷向量總共占用1024字節。在8086系統中,所有的中斷向量按類型碼存放于內存的最低地址(00000H~003FFH)的1K單元中。存放中斷向量的這1K單元稱為中斷向量表。
**中斷向量在中斷向量表中的位置=中斷類型號×4**
**N*4的字單元存放偏移地址;**
**N*4+2的字單元存放段基址。**
### 5.中斷類型號的獲取
(1)對于除法出錯,單步中斷,不可屏蔽中斷NMI,斷點中斷和溢出中斷,CPU分別自動提供中斷類型號0~4。
(2)對于用戶自己確定的軟件中斷INT n,類型號由n決定。
(3)對外部可屏蔽中斷INTR,CPU從可編程中斷控制器8259A中獲得中斷類型號。
說明:
8086有兩個引腳可以接收外部的中斷請求:INTR和NMI
- 當NMI(非屏蔽中斷請求)引腳上出現上升沿信號時,CPU立即無條件(不執行中斷響應周期,不受標志寄存器IF位的影響)地轉入"2號中斷處理程序"。
- 當INTR(可屏蔽中斷請求)引腳上出現高電平信號時,若IF=0,CPU不響應中斷請求。若IF=1,CPU響應中斷請求。CPU響應中斷時,首先執行"中斷響應周期",以便從中斷控制器8259獲得中斷類型碼,然后根據中斷類型碼轉入相應的中斷處理程序。
中斷響應周期由兩個總線周期構成
1.第一個總線周期
CPU向外設發出一個低電平的中斷應答信號INTA*,表示已經接受申請,要求外設傳送中斷向量號
2.第二個總線周期
外設傳送中斷向量號,CPU在T4的下降沿采樣數據總線,讀入外設傳送來的中斷向量號(如下圖)
[](http://img.blog.csdn.net/20160101224502851)
### 6.中斷過程
(1)中斷請求
中斷源向CPU發出請求中斷信號。中斷信號將被鎖存,直到CPU響應中斷后,中斷請求信號才被清除。
(2)中斷響應
CPU在執行每條指令的最后一個時鐘周期檢測中斷請求信號。若發現中斷請求信號有效,在允許中斷的條件下,CPU響應中斷。
響應中斷的過程可以總結為:
- 取得中斷類型碼N;
- pushf
- TF=0,IF=0
- push CS
- push IP
- IP=N*4, CS=N*4+2,;轉中斷服務程序
### 7.中斷處理程序和iret指令
中斷處理程序的編寫方法和子程序比較相似,下面是常規的步驟:
(1)保存用到的寄存器
(2)處理中斷
注意:由于IF標志被設置為0,在中斷處理中,處理器將不再響應硬件中斷。如果希望更高優先級的中斷嵌套,可以在編寫中斷處理程序時,適時用sti指令開放中斷。
(3)恢復用到的寄存器
(4)用iret指令返回
iret指令的功能可以用匯編語法描述為:
pop IP
pop CS
popf
需要說明的是:中斷向量表的建立和初始化工作是由BIOS在計算機啟動時完成的。BIOS為每個中斷號填寫入口地址,因為它不知道多數中斷處理程序的位置,所以一律將它們指向同一個入口地址,在那里只有一條指令:iret. 也就是說,當這些中斷發生時,只做一件事情——立即返回。當計算機啟動后,操作系統和用戶程序再根據自己的需要,修改某些中斷的入口地址,使它指向自己的代碼。