中斷的概念
中斷是指在程序執行過程中,出現某種緊急事件,CPU暫停執行現行程序,轉去執行處理該事件的程序——中斷服務程序,執行完后再返回到被暫停的程序繼續執行,這一過程稱為中斷。
中斷源
引起中斷的設備或事件稱為中斷源。
-
分類:
可籠統地分為兩類:CPU內產生的,稱為內部中斷;其他的稱為外部中斷。
- 內部中斷包括:由CPU本身產生的中斷、由控制器產生的中斷、由程序源安排的中斷指令引起的中斷。
- 外部中斷由根據中斷事件的緊迫程序將中斷源划分為可屏蔽中斷和不可屏蔽中斷。
- 可屏蔽中斷:指可以延時處理的事件。例如打印機的輸入輸出中斷請求,如果CPU正在處理更加緊急的事件,打印機的中斷請求就會被暫時屏蔽。被屏蔽的中斷請求保存再中斷寄存器中,當屏蔽接觸后,仍然能夠得到響應和處理。
- 不可屏蔽中斷:指事件異常緊急,必須馬上處理。例如掉電、RAM奇偶校驗錯誤等引起的中斷。
外部硬件中斷主要有以下幾種:
一、I/O設備:如顯示器、鍵盤、打印機等。
二、數據通道:軟盤、硬盤、光盤等。
三、實時時鍾:如外部的定時電路等。
四、硬件故障:如電源掉電、RAM奇偶校驗錯誤等。
產生於CPU內部的軟件中斷源有幾種:
一、由CPU得運行結果產生:如除數為0、結果溢出、單步執行等。
二、執行中斷指令INT:INT3
三、非法操作或指令引起異常處理、地址越界。
中斷處理的基本過程
中斷處理的基本過程包括中斷請求、中斷判優、中斷響應、中斷服務 和中斷返回等五個階段。
1.中斷請求
(1)發生在CPU內部的中斷,不需要中斷請求,CPU內部的中斷控制邏 輯直接接收處理。
(2)外部中斷請求由中斷源提出。外部中斷源利用CPU的中斷輸入引腳 輸入中斷請求信號。一般CPU設有兩個中斷請求輸入引腳:可屏蔽中斷請求輸入引腳(INTR)和不可屏蔽中斷請求輸入引腳(NMI)。
中斷請求觸發器
每個中斷源發中斷請求信號的時間是不確定的,而CPU在何時響應中斷也 是不確定的。所以,每個中斷源都有一個中斷請求觸發器,鎖存自己的中 斷請求信號,並保持到CPU響應這個中斷請求之后才將其清除。
中斷允許觸發器
在CPU內部有一個中斷允許觸發器,當其為“1”時,允許CPU響應中斷, 稱為開中斷。若其為“0”,不允許CPU響應中斷,中斷被屏蔽,稱為關 中斷。
通常,當CPU復位時,中斷允許觸發器也復位為“0”,即不允許CPU響應中斷。當 CPU中斷響應時,CPU自動關閉中斷,禁止接受另一個新的中斷。
2. 中斷判優
CPU一次只能接受一個中斷源的請求,當多個中斷源同時向CPU提出 中斷請求時,CPU必須找出中斷優先級最高的中斷源,這一過程稱為 中斷判優。中斷判優可以采用硬件方法,也可采用軟件方法
(1)軟件判優
CPU檢測到中斷請求后,首先讀取中斷請求寄存器的內容,逐位檢測它 們的狀態,檢測到某一位為1,就確定對應的中斷源有中斷請求,轉去 執行它的中斷服務程序。只要某一位為1,INTR就會顯示高電平,否則低電平。先檢測哪一個,哪一個的優先級就高,后檢測 哪一個,哪一個優先級就低,檢測的順序就是各中斷源的優先級順序。
圖中輸入端口地址為87FFH。查詢程序:
MOV DX, 87FFH
IN AL, DX ;讀中斷請求寄存器內容
SHR AL, 1
JC IR0 ;IRQ0有請求,轉IR0
SHR AL,1
JC IR1 ;IRQ1有請求,轉IR1
SHR AL,1
JC IR2 ;IRQ2有請求,轉IR2
……
軟件判優耗時較長。如果中斷源很多,中斷的實時性就很差,但是軟 件判優優先權安排靈活。
(2)硬件判優
利用專門的硬件電路確定中斷源的優先級,有兩種常見的方式:菊花 鏈判優電路和中斷控制器判優。
菊花鏈判優電路
基本設計思想:每個中斷源都有一個中斷邏輯電路,所有的中斷邏輯電路 連成一條鏈,形如菊花鏈。排在鏈前端的中斷源優先級最高,越靠后的設 備優先級越低。
中斷控制器判優
中斷控制器,如Intel8259A,可以以多種方式設置中斷源的中斷優先級。 中斷控制器中有一個中斷優先級判別器,它自動判別出目前提出中斷請求 的優先級最高的中斷源,並將它的中斷向量碼送到數據總線,CPU接收中 斷向量碼並據此找到它的中斷服務程序。
3. 中斷響應
中斷響應時,CPU向中斷 源發出中斷響應信號,同時:
① 保護硬件現場;
② 關中斷,不允許CPU響應中斷了;
③ 保護斷點;
④ 獲得中斷服務程序的入口地址。
4. 中斷服務
中斷服務程序的一般結構為:
(1)保護現場。在中斷服務程序的起始部分安排若干條入棧指令,將各 寄存器的內容壓入堆棧保存。
(2)開中斷。在中斷服務程序執行期間允許級別更高的中斷請求中斷現 行的中斷服務程序,實現中斷嵌套。
(3)中斷服務。完成中斷源的具體要求。
(4)恢復現場。中斷服務程序結束前,必須恢復主程序的中斷現場。通 常是將保存在堆棧中的現場信息彈出到原來的寄存器中。
(5)中斷返回。返回到原程序的斷點處,繼續執行原程序。
5. 中斷返回
返回到原程序的斷點處,恢復硬件現場,繼續執行原程序。中斷返回 操作是中斷響應操作的逆過程。
中斷向量和中斷向量表
CPU的中斷系統可以處理256種中斷。每種中斷都有對應的中斷服務程序。中斷服務程序的入口地址稱為中斷向量。256種中斷向量存儲在內存中構成一張表,稱為中斷向量表。
每個中斷向量都包括兩部分:段基址和偏移地址。因此,存放1個中斷向量需要4個內存單元,256種中斷向量共需要1K個內存單元。
中斷向量表位於內存起始地址00000~003FFH的存儲區內。從地址00000H開始,每4個單元存放一個中斷向量,其中低地址的兩個單元存放中斷向量的偏移地址,高地址的兩個單元存放中斷向量的段基址。256種中斷向量按中斷向量碼從0到255的順序依次存入中斷向量表中。
8086/8088CPU的全部256種中斷類型中0~31是微處理器專用中斷,從類型32開始直到255作為用戶中斷類型。用戶中斷向量由用戶填寫到中斷向量表中,中斷服務程序也由用戶編寫 。
Intel保留前32(031)個中斷向量為Intel各種微處理器系列成員專用,其中,類型04的中斷向量在8086~Pentium的所有Intel系列微處理器中都相同,其他中斷向量預留下來給80286及以上的高檔微處理器組成的系統中。這些專用中斷向量對應的中斷服務程序由系統設置。
- 中斷向量在中斷向量表中的存放首地址稱為向量地址,其值為:中斷類型碼×4。
- 當CPU調用中斷類型碼為n的中斷服務程序時,首先把n乘以4,得到它的向量地址4n,然后把4n+1:4n兩個單元的內容取出並裝入IP寄存器;再把(4n+3:4n+2)兩個單元的內容取出並裝入CS寄存器,CPU就獲得了n的中斷服務程序的入口地址,進而轉去執行中斷服務程序。
- CS:IP 兩個寄存器指示了 CPU 當前將要讀取的指令的地址,其中 CS 為代碼段寄存器,而 IP 為指令指針寄存器 。 當讀取完指令后,CS:IP 將會自動的改變,基本上是改變 IP ,從而指向下一條要讀取的指 令。
8086/8088CPU的5個專用中斷類型
-
類型0 除法錯中斷,除法運算結果溢出或是除以0時發生,屏幕出現錯誤提示。
-
類型1 單步中斷,也稱為陷阱中斷。如果TF標志位為1,CPU每執行 一條指令后,就停下來等待,並提示CPU內部各寄存器的值和一些附 帶信息
TF—陷阱標志,為程序調試而設的。當設置TF=1,CPU處於單步執行指令的方式;當設置TF=0時,CPU正常執行程序。
單步中斷使用戶可以逐條執行程序,讓程序員能夠精確了解程序的執行情 況,給用戶調試程序提供方便
注:在8086中,沒有專門設置TF清0或置1的指令,要使TF清0或置1,需 要通過執行一段程序實現。
例如,使TF標志位置1:
PUSHF ;FLAG標志寄存器壓棧
POP AX ;FLAG內容彈出到AX
OR AX, 0100H ;使AX中對應TF的位置為1
PUSH AX
POPF
-
類型2 非屏蔽中斷,該中斷不能被軟件禁止。非屏蔽中斷由CPU之外 的硬件產生,通過CPU的NMI引腳輸入中斷請求信號,上升沿觸發。 該中斷用於處理緊急事件,如奇偶校驗錯、電源掉電等
內部中斷的中斷向量碼都是由微處理器直接給出的,但中斷類型2雖然屬於外部中斷,但是它的中斷向量碼還是由微處理器直接給 出。
-
類型3 斷點中斷,由一個單字節指令INT3引起的中斷,指令代碼為 0CCH。它的中斷服務程序將該指令所處的位置作為程序斷點保存起來。 在調試程序時用這條指令設置斷點。
-
類型4 溢出中斷,INTO指令的專用向量。如果溢出標志位OF為1,則 INTO指令中斷正在執行的程序。如果OF為0,則INTO指令不執行任 何操作,就像不存在一樣,程序繼續執行下一條指令。例:
MOV BL,126 MOV AL,5 ADD AL,BL ;OF=1 INTO ;執行溢出中斷服務程序
硬件中斷
8086/8088CPU芯片有兩個硬件中斷請求信號輸入引腳:NMI和INTR,用來接收外部中斷源產生的中斷請求。NMI引腳接收非屏蔽中斷請求,INTR引腳接收可屏蔽中斷請求。
(1)非屏蔽中斷
非屏蔽中斷不能被軟件禁止,即不受IF標志位控制。NMI采用上升沿觸發,中斷類型碼為2,由CPU內部譯碼產生。優先級高於可屏蔽中斷。CPU響應這種類型的中斷時,將所有內部寄存器存於使用電池的備份存儲器或EEPROM中。非屏蔽中斷用於處理緊急事件,如存儲器奇偶錯、電源掉電等
(2)可屏蔽中斷
采用電平觸發方式,高電平有效。
CPU收到中斷請求信號后,檢測中斷允許標志位IF,若IF=1,CPU響應INTR請求;若IF=0時,CPU屏蔽INTR請求。被屏蔽的中斷請求信號可一直保持高電平,直到CPU接收。
中斷允許標志位IF可以用指令STI和CLI進行設置。
CPU響應INTR請求時,啟動中斷響應總線周期,發中斷應答信號(INTA) ̅。系統連續產生2個(INTA) ̅脈沖,用於從數據總線接收中斷控制器送出的中斷類型碼。
8088/8086中斷的處理流程
- 如果有一個或多個中斷條件出現,CPU響應中斷。
- 如果檢測到內部中 斷或非屏蔽中斷,CPU從內部獲得中斷類型碼;
- 如果檢測到可屏蔽中 斷請求,CPU進一步測試IF標志位,如果IF=1,CPU就進入中斷響應 總線周期,從中斷控制器獲取中斷類型碼。
- 獲得中斷類型碼之后,各種中斷的處理過程相同。CPU將中斷類型碼 放入暫存器保存,以下動作順序發生:
- 標志寄存器的內容入棧,堆棧指針 SP減2;
- 清除中斷標志IF和TF;
- 主程序斷點CS的內容入棧,堆棧指針SP再減2;
- 主程序斷點IP的內容入棧,堆棧指針SP再減2;
- 根據中斷類型碼,在中斷向量表中取出中斷向量裝入IP和CS;
- 執行中斷服務程序;
- 中斷返回,執行IRET指令,從堆棧中彈出IP、 CS和Flags,堆棧指針SP+6。