文章目錄
8.1 中斷
8.1.1 中斷概念和分類
1.中斷的定義和功能
中斷定義:計算機在執行正常程序過程中,暫時中止當前程序的運行,轉到中斷處理程序去處理臨時發生的事件,處理完後又恢復原來程序的運行,這個過程稱爲中斷(Interrupt
)。
中斷功能:
- 使CPU和外設在部分時間內並行工作,大大提高CPU的利用率;
- 在實時控制系統中,現場數據可及時接收處理,避免丟失;
- 故障的處理,如電源掉電、奇偶校驗錯、運算中溢出錯等;
- 利用中斷指令,直接調用大量系統已編寫好的中斷服務程序,實現對硬件的控制。
2.中斷源和中斷分類
引起中斷的原因或能發出中斷請求的來源稱爲中斷源。
8086有兩種中斷源,中斷分爲兩大類:
1)外部中斷或硬件中斷,從不可屏蔽中斷引腳 NMI
和可屏蔽中斷引腳 INTR
引入;
2)內部中斷或軟件中斷,是爲解決CPU運行過程中出現的一些意外事件或便於程序調試而設置的。
我們這門課,學習 8259A
主要是處理 INTR
。
圖8.1 IBM PC機中 8086
的中斷分類和中斷源
1)外部中斷
不可屏蔽中斷NMI,處理較緊急的情況,如存儲器或I/O校驗錯、掉電、協處理器異常中斷請求等,不受中斷標誌IF的影響。
可屏蔽中斷由 8259A
的 INT
引腳輸出,連到CPU的INTR上。只有當CPU的 FLAGS
的 IF=1
時,才允許響應此類中斷請求。
8259A的輸入引腳 IR0~IR7
可引入 8
級中斷:時鐘、鍵盤、串行通信口COM1和COM2、硬盤、軟盤、打印機。經芯片內部判別後,將優先級高的中斷請求信號送到 INT
引腳。
2)內部中斷
(1) 除法錯中斷
執行除法運算指令時,如除數爲0或商超過了結果寄存器能容納的範圍,則產生除法錯中斷。
(2) 單步中斷
單步標誌 TF
置1,指令執行完後,產生單步中斷。結果是將CPU的內部寄存器和有關存儲器的內容顯示出來,便於跟蹤程序的執行過程,實現動態排錯。
8086沒有直接使TF標誌置1或清0的指令,如何使 TF
標誌置1或清0?使TF標誌置1的程序段:
PUSHF ;標誌寄存器FLAGS入棧
POP AX ;AX←FLAGS內容
OR AX, 0100H ;使AX(即標誌寄存器)的
;D8=1,其餘位不變
PUSH AX ;AX入棧
POPF ;FLAGS寄存器←AX
用類似方法將標誌寄存器與 FEFFH
相與,可使 TF
標誌清0,從而禁止單步中斷。
(3) 溢出中斷
溢出標誌 =1
,則可由溢出中斷指令 INTO
產生中斷類型號爲 4
的溢出中斷。若OF=0
,不會產生中斷。
帶符號數加、減指令後應安排一條 INTO
指令,一旦溢出就能及時向CPU提出中斷請求,CPU響應中斷後可進行相應的處理。
(4) 軟件中斷指令 INT n
中斷類型號 n=0~255
。它可以安排在程序的任何位置上。
(5) 斷點中斷
程序運行到斷點時便產生中斷,像單步中斷一樣,查看各寄存器和有關存儲單元的內容。
斷點可設在程序任何地方並可以設多個斷點,設置的方法是插入一條 INT 3
指令。利用斷點中斷可以調試一段程序,比單步中斷的調試速度快得多。
3. 中斷向量表
(1)中斷響應和返回
- CPU響應中斷時,首先要把
CS、IP
寄存器的值(斷點)以及標誌寄存器FLAGS
的值推入堆棧保護。 - 然後找到中斷服務程序的入口地址(中斷向量),轉去執行相應的中斷服務程序。
- 中斷服務程序結束時,執行中斷返回指令
IRET
返回正常程序繼續執行。
如何尋找中斷服務程序的入口地址,是中斷處理過程中的一個重要環節。
(2)中斷向量表
中斷向量表用來存放中斷服務程序的入口地址。
- 8086可處理
256
(0~FFH
)類中斷,每類中斷有一個入口地址(中斷向量),包含CS
和IP
,共4
個字節。因此存儲256
個地址,需要佔用1K
字節,它們位於內存00000~003FFH
的區域中(早年的8086/8088)。 - 將中斷類型號
n
乘以4
就能找到規定類型的中斷向量,規定IP
在前,CS
在後。 - 類型號爲
0~4
的專用中斷:0
-除法錯中斷、1
-單步中斷、2
-不可屏蔽(NMI
)中斷、3
-斷點中斷和4
-溢出中斷,它們的中斷向量分別存放在00H
、04H
、08H
、0CH
和10H
開始的4
個連續單元中。
舉例說明中斷類型號n與中斷向量表的關係。
例8.1 類型號 n=44H
的中斷服務程序的入口地址爲 3600:2000H
,它們在中斷向量表中應如何存放?
分析:中斷類型號 n=44H=01000100B
,它的中斷服務程序的入口地址應放在 44H*4
開始的4個字節單元中。44H*4=01 0001 0000B= 0110H
。從0110H開始存放 3600:2000H
。
例8.2 若在中斷向量表中,(0040H)=240BH
,而 (0042H)=D169H
,如圖8.4所示,試問這4個單元中的內容對應的中斷類型號 n=
?該中斷服務程序的起始地址是什麼?
分析:中斷服務程序的入口地址從 0040H
單元開始存放,其類型號n=40H/4=10H
(右移 2
位)。由圖可知,中斷類型號爲 10H
的中斷服務程序的入口地址=D169:240BH
。
4.中斷優先級和中斷嵌套
(1) 中斷優先級
按中斷源的重要性和實時性,排出響應中斷的次序,這種次序稱爲中斷優先級。 在8086中,中斷優先級從高到低的次序爲:
除法錯、INT n、INTO ;最高級,同一行的有同等優先級
NMI ;次高級
INTR ;較低級(由8259A引入)
單步中斷 ;最低級
(2) 中斷嵌套
CPU響應中斷時,一般先響應優先級高的,後響應優先級低的中斷請求。如CPU正在執行中斷服務程序時,有優先級較高的中斷源提出請求,則將正在處理的中斷暫時掛起,先爲高級中斷服務,服務完後再返回較低級中斷,稱爲中斷嵌套。
如何實現中斷嵌套?
- 機器進入中斷服務程序後,硬件會自動關中斷
CLI
。 - 只有程序員手動用
STI
指令將中斷打開後,才允許高級中斷進入,實現中斷嵌套。 - 中斷服程序結束前,必須用
EOI
命令結束該級中斷,並用IRET
指令返回到中斷前的斷點處去繼續執行原程序。
8.1.2 中斷的響應與處理過程
1.中斷響應過程
可屏蔽中斷的響應和處理流程如圖:
每條指令執行完,CPU都要查 NMI
和 INTR
腳上是否有中斷請求,若無,繼續取下一條指令執行。如有則響應中斷,硬件自動完成關閉中斷和保護斷點操作,將下條要執行指令的 CS
和 IP
(即斷點)推入堆棧;然後尋找中斷服務程序的入口地址,找到後就轉入相應的中斷服務程序。最後,恢復現場,開中斷,返回斷點。
2.8086的中斷響應與處理
1)中斷查詢
CPU在執行完每條指令後,會順序檢查是否有 軟中斷、NMI、INTR和單步中斷
,如有,則進入中斷響應週期。
2)中斷響應
根據不同的中斷源形成不同的中斷類型碼n
,再在中斷向量表中,根據 n
找到各自的中斷服務程序的入口地址,轉入相應的中斷處理程序。
例如 n=2
,則形成中斷類型碼 2
,再在中斷向量表中找到 n*4=2*4=8
開始的連續4個字節單元,從中取出 CS:IP
,轉去執行可屏蔽中斷。
重點介紹從 INTR
引腳引入的可屏蔽中斷的類型碼是如何形成的。CPU響應 INTR
中斷後,要執行兩個連續的中斷響應 INTA
總線週期,其時序圖如圖:
第一個 週期,CPU使數據線 D7~D0
浮空,T2~T4
期間向 8259A
發第1箇中斷響應信號 ,表示CPU已響應此中斷,禁止其它總線控制器競爭總線。
第二個 週期,8259A
收到第二個 信號後,將中斷類型號 n
置於數據總線上,由此找到中斷服務程序的入口地址。
從 8259A
的 IR7~IR0
上可引入 8
級中斷,形成 8
個 8
位中斷類型碼,其中高 5
位 D7~D3
由用戶通過對8259A編程來確定,在 PC/XT
機中爲 00001
;低 3
位 D2~D0
由 IR7~IR0
的序號來決定, 見表8.1。高5位確定後,8
級中斷類型碼就確定了。
3)中斷處理和返回
(1) 由硬件自動完成以下工作
FLAGS
的內容入棧;- 保護單步標誌
TF
; - 清
IF
標誌,關中斷,中斷處理過程中禁止其它中斷進入; - 清
TF
標誌,使CPU不會以單步形式執行中斷處理程序; - 保護斷點,
CS:IP
入棧。
(2) 進入中斷服務
進入中斷處理後,若在處理過程中又有 NMI
進入,NMI
中斷處理後,會清除CPU中鎖存的 NMI
請求信號,使加在CPU上的 NMI
只會被CPU識別一次;
接下來執行用戶編寫的中斷服務程序,包含保護現場,中斷處理和恢復現場程序。
(3) 執行用戶編寫的中斷返回指令 IRET
CS:IP
出棧,恢復斷點,恢復 FLAGS
的內容,返回主程序,繼續執行下一條指令。
8.2 可編程中斷控制器8259A的工作原理
8.2.1 8259A的引腳信號和內部結構
中斷控制器8259A的引腳:
可接收 8
級中斷,經 4
個 8
位寄存器判別後,優先級最高的中斷請求信號從 INT
腳輸出,送CPU的 INTR
腳請求可屏蔽中斷。
內部結構:(1根地址,說明只佔用了兩個端口地址;D7-D0
8位數據)
-
中斷請求寄存器 (
Interrupt Request Register
)- 外部8級中斷請求信號從
IR7~IR0
腳上引入,有請求時相應位置1
。例如IR7、IR5、IR2
上有請求, 將置成10100100
; - 中斷響應時相應位清
0
; - 中斷請求信號可爲高電平或上升沿觸發,編程定義。
- 外部8級中斷請求信號從
-
中斷屏蔽寄存器 (
Interrupt Mask Register
)
存放中斷屏蔽信息,每1
位與1
個IR
位對應,置1
禁止對應中斷請求進入系統。用來有選擇地禁止某些設備請求中斷。 -
中斷服務寄存器 (
Interrupt Service Register
)
保存正處理的中斷請求。任一中斷被響應而執行其服務程序時,相應位置1
,直到處理結束。多重中斷情況下,會有多個位置1
。 -
優先級判決器(
Priority Resolver
)- 判別請求寄存器 裏中斷的優先級,把優先級最高的中斷請求選進服務寄存器 中去。
- 多重中斷出現時, 判定新出現的中斷能否去打斷正在處理的中斷,優先服務更高的中斷級別。
-
控制電路
包含一組初始化命令字寄存器ICW1~ICW4
和一組操作命令字寄存器OCW1~OCW3
,管理8259A
的全部工作。- 根據 設置和 判定,發控制信號。
- 從
INT
腳向CPU發中斷請求信號,接收CPU或總線控制器8288送來的中斷響應信號 ; - 中斷響應時 相應位置
1
,併發送中斷類型號n
,經數據總線緩衝器送到D7~D0
; - 中斷服務程序結束時,按編程規定方式結束中斷。
-
數據總線緩衝器
是8259A
與CPU的接口,CPU經它向8259A
寫控制字,接收8259A
送出的中斷類型號,還可從中讀出狀態字(中斷請求、屏蔽、服務寄存器的狀態)和中斷查詢字。 -
讀/寫控制電路
接收CPU的 、 、地址、片選 。一片8259A
只佔兩個I/O地址,XT機中A0
接地址A0
,口地址爲20H、21H
。與8086連時,A0
腳接地址A1
,A0
的0/1選偶/奇地址口。 -
級聯緩衝器/比較器
- 一片
8259A
最多引入8
級中斷,超過8
級要用多片8259A
構成主從關係,級聯使用。
從片輸出INT
接主片IRi
。主從片的3
條級聯信號線CAS2~CAS0
並接。 - :主從定義/緩衝器方向;雙功能;
- 緩衝方式:輸出,控制緩衝器傳送方向;
- 非緩衝方式:輸入;定義主從片,1:主片,0:從片
- 多片時,
8259A
必須經驅動器與數據總線相連,工作於緩衝方式;少量8259A
系統中,8259A
可直接與數據總線相連,工作於非緩衝方式。
- 一片
8.2.2 8259A的工作方式
寫入初始化命令字 ICW
和控制命令字 OCW
,對 8259A
設置不同的工作方式。
1. 設置優先級方式
1)全嵌套方式
最基本方式,初始化後自動進入。
- 從各
IRi
腳引入的中斷請求具有固定優先級,IR0~IR7
依次降低,IR0
最高。8259A
初始化後自動進入此方式。 - 中斷響應後,中斷服務寄存器 的對應位
ISn
置1
,並保持到中斷結束,類型號n
出現在DB
上,然後進入中斷處理。 - 由CPU發
EOI
命令結束中斷,使ISn
復位;也可發自動結束中斷命令AEOI
。 - 處理過程中,高級中斷打斷低級中斷,禁止低級或同級中斷進入。
2)特殊全嵌方式
同全嵌套方式,但允許同級中斷進入。
例8.3 同級中斷舉例。圖中,從片 INT
腳接主片的 IR2
,主片角度看,從片的 8
級中斷爲同級中斷。若正在處理 IR3
,則允許 IR0~IR2
進入, 即允許同級中斷進入。必須在 IR3
中斷處理程序中,用 STI
指令開中斷,才允許從片中斷嵌套。但全嵌套方式禁止同級中斷進入。
3)優先級自動循環方式
各中斷請求優先級相同,IRi
服務完後成爲最低級,IRi+1
成最高級。初始優先級從高到低爲 IR0~IR7
。
例8.4 參看下圖的優先級自動循環方式示意圖。
- 圖(a):初始狀態
IR0
爲最高級,若IR1、IR3、IR6
同時請求中斷,則 的IR1、IR3、IR6
均置1
。 - 圖(b):
IR1
先被服務,之後IS1=0
,IR1
成最低級,IR2
爲最高級,優先級順序:IR2->IR7、IR0、IR1
。爲IR3
服務後IS3=0
,IR3
最低,IR4
最高,依次類推。
4)優先級特殊循環方式
也稱爲設置最低優先級方式,與優先級自動循環方式類似,只是最低優先級由程序設置,並非 IR7
最低。IRi
設爲最低後,IRi+1
便是最高。
2.中斷屏蔽方式
可用 CLI
指令關中斷,禁止可屏蔽中斷進入;開中斷情況下,可將中斷屏蔽寄存器 的相應位置1,來屏蔽某一級或某幾級中斷。有兩種屏蔽方式:
1)普通屏蔽方式
將 中的某 1
位或某幾位置 1
,就可將相應的中斷請求屏蔽。例如,令 ,則 IR5
和 IR2
上的中斷請求被屏蔽。
2)特殊屏蔽方式
僅屏蔽本級中斷,高級或低級中斷都允許進入。(關於優先級的改變)
3.結束中斷方式
中斷響應後, 的相應位 ISn
置 1
,中斷結束後應將 ISn
清 0
,表示結束中斷。
2
種結束中斷方式:自動和非自動,後者又分普通結束和特殊結束(EOI和SEOI)。
1)自動結束中斷方式—AEOI
IRi
上中斷響應後, 相應位置 1
,在CPU發來的中斷響應信號 的第 2
週期結束時,相應位自動清 0
,結束中斷。
AEOI
方式,中斷結束時(中斷服務程序)不用對 8259A
發任何命令,通常在只有一片 8259A
,多箇中斷不會嵌套的情況下使用。
2)普通結束中斷方式—EOI(End of Interrupt)
是常用的結束中斷方式,用於全嵌套方式。當CPU處理完 1
箇中斷請求時,需向 8259A
發 EOI
命令,8259A
收到 EOI
後,將 寄存器中優先級最高的中斷,也就是剛服務過的中斷的 ISn
清零,從而結束中斷。
3)特殊結束中斷方式—SEOI
在非完全嵌套方式下,用 寄存器無法確定當前正在處理哪級中斷,也無法確定哪級中斷是最後響應和處理的,不能用 EOI
方式結束中斷,要用特殊方式。這時要用 OCW2
命令中的 L2~L0
來指定將 寄存器的哪 1
位清 0
。
4.中斷查詢方式-POLL
使用一條 IN
指令讀取中斷查詢字,就可查到 8259A
是否有中斷請求以及哪個優先級最高。下圖是中斷查詢字格式:
8.2.3 8259A的命令字及編程
爲使 8259A
按預定方式工作,必須對它編程,由CPU向其控制寄存器發各種控制命令。控制命令有兩類:
- 初始化命令字
ICW1~ICW4
,對8259A
初始化; - 操作命令字
OCW1~OCW3
,定義操作方式。
在操作過程中,允許重設置操作命令字,動態改變 8259A
的控制方式。兩類命令字被寫入 8259A
的兩個端口,一個爲偶地址口,8259A
的 A0=0
,另一個爲奇地址口,A0=1
。在 XT
機中,偶/奇地址口爲 20H
和21H
。
1. 初始化命令字ICW
初始化命令字 ICW1~ICW4
順序寫入控制口,設置 8259A
初始狀態。8086系統中 ICW1
、ICW2
和 ICW4
必須要有,ICW3
只在級聯時用。
(1) ICW_1 初始化命令字
① A0=0,ICW1
寫入偶地址口;D4=1
標誌位;IC4=1
需要設 ICW4
(8086必須寫 ICW4
);
② 單片時 SNGL=1
, 不要寫入ICW3
;級聯時 SNGL=0
,要寫入 ICW3
;
③ LIMT=1
從 IRi
引入中斷爲電平觸發,0
邊沿觸發;
④ A7~A5
及 ADI
位用於8位CPU。
(2) ICW_2 中斷類型碼初始化
ICW2
緊跟 ICW1
寫入,A0=1
,寫入奇地址口,無標誌位。T7~T3
位用於確定中斷類型碼 n
的高 5
位,低 3
位 D2~D0
則由 8259A
根據從 IR_i
上引入中斷的引腳序號自動填入,從 IR0~IR7
的序號依次爲 000~111
,其初值可以置爲 0
。
ICW2
的高 5
位內容是可以任選的,一旦高 5
位確定,一塊芯片的 8
箇中斷請求信號 IR0~IR7
的中斷類型號也就確定了。
例8.4 在 PC/XT
機中,ICW2的高 5
位 T7~T3=00001B
,若從 IR5
上引入中斷請求,則其中斷類型碼 n=
? 如何設置 ICW2
?
分析:從 IR5
上引入的中斷類型號的低 3
位 D2~D0=101B
,由於高 5
位是 00001B
,所以從 IR5
上引入的中斷類型碼 n=00001 101B=0DH
,表示是硬盤中斷請求。設置 ICW2
的指令爲:
MOV AL, 00001000B
OUT 21H, AL
據此可知,若 ICW2
的高 5
位爲 01110B
,則該 8259A
引入的 8
級中斷的中斷類型號 n = 01110000B ~ 01110111B = 70H~ 77H
,這是爲 PC/AT
機設置的 ICW2
。
(3) ICW_3 級聯初始化
ICW3
只在級聯時使用。圖8.15是 ICW3
的格式和 8259A
主從結構連接圖。
(a) 主片 ICW3
格式。Si=0
,IRi
上未接從片;Si=1
接有從片。
(b) 從片 ICW3
格式。低 3
位指明從片接主片哪個引腳,ID2~ID0 = 000~111
表示 IR0~IR7
引腳。
例8.5 用 3
片 8259A
按主從結構連接,如圖8.15(c)。主片口地址爲 20H/21H
, 從片1口地址爲 A0H/A1H
,從片 2
爲 B0/B1H
。試求出 3
片 8259A
的 ICW3
,並編程將 ICW3
寫入各芯片的奇地址口中。
分析:
- 主片
IR2
、IR7
接從片,故主片ICW3=10000100B=84H
- 從片
1
接主片IR2
,故從片1
的ICW3=00000010B=02H
- 從片
2
接主片IR7
,故從片2
的ICW3=00000111B=07H
對各芯片寫入初始化命令字 ICW3
:
MOV AL, 84H ;主片程序
OUT 21H, AL
MOV AL, 02H ;從片1程序
OUT 0A1H, AL
MOV AL, 07H ;主片2程序
OUT 0B1H, AL
如圖中所示的級聯繫統:
- 主片的
ICW3=24H
;00100100
- 從片
1
的ICW3=02H
;00000010
- 從片
2
的ICW3=05H
;00000101
只有 A
有申請(與單片系統相同):
- 從片1:
- 從片2:
- 主片: ,,收到 ,主片 ,送
IR6
的類型號。
A、B、C
同時申請:
- 從片1:
- 從片2:
- 主片:、、 同時爲1, (轉發
IR2
的請求) - 過程:
- 第1個 ,主片 並送
IR2
的級聯代碼;從片2
與自己的識別碼比較不同,無操作;從片1
:相同, - 第
2
個 :從片1
送出IR7
的類型號,主片不送 - 最後,送兩個
EOI
命令,給主片送EOI
的條件——從片
- 第1個 ,主片 並送
(4) ICW4
8086系統 ICW4
必須設置,寫入奇地址口。無級聯時 ICW4
應在 ICW2
後寫入,級聯時它在 ICW3
後寫入。圖8.16 ICW4
的格式:
ICW4
各位的含義:
D7~D5=000
,爲標誌位;SFNM=1
,設置特殊全嵌套方式(Special Fully Nested Mode
),否則爲一般全嵌套方式;BUF
和M/S
配合使用決定緩衝或非緩衝方式等;AEOI=1
,選擇AEOI
方式,即自動結束中斷方式;
AEOI=0
,爲非AEOI
(非自動結束中斷)方式,須在中斷服務程序中安排操作命令字OCW2
,選擇所需的方式結束中斷;- ,選擇8086系統。
整個初始化流程如下:
例8.6 在 PC/XT
機中,只使用一片 8259A
,ROM BIOS
中對 8259A
進行初始化的程序爲:
MOV AL, 00010011B ;ICW1:邊沿觸發,
;單級,要ICW4
OUT 20H, AL
MOV AL, 00001000B ;ICW2:中段類型號
;基值爲08H
OUT 21H, AL
MOV AL, 00001001B ;ICW4:全嵌套,
;緩衝,非AEOI
OUT 21H, AL
2. 操作命令字OCW
8259A
工作期間,可寫入操作命令,讓它按需要方式工作。
- 可寫入
3
個操作命令字OCW1~OCW3
,用來發非AEOI
方式結束中斷的命令、優先級循環命令、中斷查詢命令,還可設置或撤銷AEOI
循環命令、設置或撤銷特殊屏蔽方式、讀內部寄存器的狀態,功能比較複雜,尤其是OCW2
。 OCW
在應用程序內部設置,沒有規定寫入順序,但寫入的端口地址有規定:OCW1
必須寫入奇地址口,OCW2
和OCW3
要求寫入偶地址口。
(1) OCW1 中斷屏蔽字
OCW1
也稱中斷屏蔽字,直接對中斷屏蔽寄存器 的各位進行置 1
或清 0
。當 Mi
位置 1
,相應 IRi
的中斷請求將被屏蔽,清 0
則允許中斷。
屏蔽某個 IRi
中斷,並不影響其它腳上的中斷請求。允許隨時讀出 的內容,供CPU分析。
例8.7 某系統只允許鍵盤(IR1
)中斷,其餘位均屏蔽,8259A
口地址 20H/21H
,試寫入中斷屏蔽字。如系統中要新增鍵盤中斷,其餘屏蔽位不變,如何設置屏蔽字。
只允許鍵盤中斷的程序段爲:
MOV AL, 11111101B ;D1=0,IR1沒被屏蔽,
;其餘均被屏蔽
OUT 21H, AL
新增鍵盤中斷的程序段爲:
IN AL, 21H ;用IN指令讀屏蔽字
AND AL, 11111101B ;僅D1清0,其餘位不變
OUT 21H, AL ;寫入修改後的屏蔽字
(2) OCW2 優先級循環和中斷結束
OCW2
設置優先級循環方式和中斷結束方式的命令字:
OCW2
各位有單獨的含義:
D4D3=00
,是OCW2
的標誌位。和ICW1
進行區分。R
(Rotate
) :R=1
,優先級按循環方式設置,否則爲非循環方式。SL
(Specific Level
):SL=1
,OCW2
中的L2~L0
有效,否則無效。EOI
(End of Interrupt
) :結束中斷命令。EOI=1
,當前 寄存器相應位清0
。當ICW4
中的AEOI=0
,即非自動結束中斷時,可用它來結束中斷。L2~L0
在SL=1
時,配合R
、SL
、EOI
設置來確定一箇中斷優先級的編碼,L2~L0
的編碼000~111
,分別與IR0~IR7
相對應。
R、SL、EOI
組合設置,具有不同的意義:
(1) R SL EOI=001
,發 EOI
命令
在中斷服務程序結束時,IRET
指令前,發 EOI
命令結束中斷,將服務寄存器中剛服務過的 ISn
位清 0
,結束中斷。設置命令的方法是將 00100000B=20H
輸出到 8259A
的偶地址口中。EOI
命令是最常用的中斷結束命令。
例8.9 在PC機的中斷服務程序中設置中斷結束命令,使相應的 ISn
清 0
。程序段如下:
MOV AL, 20H ;OCW2的EOI命令
OUT 20H, AL ;發EOI命令
(2) R SL EOI=011
,發 SEOI
命令
在中斷服務程序結束時,發特殊結束中斷命令 SEOI
,到底結束哪一級中斷由 L2~L0
指定,將相應的 ISn
清 0
。
例8.10 發特殊結束中斷 SEOI
命令,結束 5
級中斷。
MOV AL, 01100101B ;OCW2的SEOI命令, L2~L0=101
OUT 20H, AL ;將IS5清0, 結束5級中斷
(3) R SL EOI=101
,發 EOI
循環命令
採用 EOI
方式結束中斷,將剛服務過的優先級最高的 ISn
清 0
,同時將剛結束的中斷請求 IRi
的優先級設爲最低級,使 IRi+1
置爲最高級,將優先級置爲自動循環方式。
(4)R SL EOI=100
,設置 AEOI
循環命令
使 8259A
採用自動結束中斷方式結束中斷,CPU響應中斷時,在中斷總線週期的第二個 脈衝結束時,將 寄存器的相應位清 0
,並使優先級置爲自動循環方式。
(5) R SL EOI=000
,發清除 AEOI
循環方式命令
(6) R SL EOI=111
,發 SEOI
循環命令
採用特殊結束中斷方式結束中斷,使 寄存器中由 L2~L0
指定的相應 ISn
位清 0
,並置優先級爲自動循環方式。
例8.11 發 OCW2
命令,結束 2
級中斷,並置優先級爲自動循環方式。
MOV AL, 11100010B ;OCW2的SEOI循環命令,
;L2~L0=010
OUT 20H, AL ;IS2=0結束2級中斷, 優先級
;IR2最低, IR3爲最高
(7) R SL EOI=110
,設置最低優先級循環命令
將 L2~L0
指定的中斷請求 IRi
設置爲最低優先級,其餘按循環方式給出。(對應優先級特殊循環)
例8.12 要求發OCW2命令,使IR3設爲最低優先級,優先權按循環方式給出。
MOV AL, 11000011B ;將IR3置爲最低優先級, IR4置爲最高優先級
OUT 20H, AL
(8) R SL EOI=010
無效命令字
(3) OCW3 特殊屏蔽和中斷查詢
OCW3
的格式如圖所示。(下圖的 D7
其實是 0
不是 R
)
OCW3
命令字含義:
D4D3位=01
是OCW3
的標誌位(20H
端口,標誌爲進行區分)。D6D5=11
,設置特殊屏蔽方式,D6D5=10
時撤銷該方式。P
位是中斷查詢(Poll
)位,若P=1
向8529A
發中斷查詢命令,緊接着用IN
指令讀取中斷查詢字。查詢字格式見圖。RR
位爲讀寄存器,RR=1
,允許讀 或 寄存器的內容。進一步查看RIS
;若RIS=0
,下次IN
指令讀取 內容;若RIS=1
,則讀取 內容。RR=0
爲無效命令。
例8.13 編寫讀取中斷屏蔽字 (21H
)、中斷查詢字(20H
)及中斷服務寄存器的程序段。
讀取中斷屏蔽字的程序段:
IN AL, 21H ;從奇地址口讀IMR, 獲得中斷屏蔽字
讀取中斷查詢字的程序段:
MOV AL, 00001100B ;OCW3, P=1, 發查詢命令
OUT 20H, AL ;OCW3寫入偶地址口
IN AL, 20H ;AL←中斷查詢字。若AL=
;10000110B,表示有中斷請求, 且IR6上的優先級最高
讀取中斷服務寄存器 的程序段:
MOV AL 00001011B ;OCW3, RR-RIS=11,
;下次讀ISR
OUT 20H, AL ;OCW3寫入偶地址口
IN AL, 20H ;AL←ISR內容
特定屏蔽方式(開放高級和低級中斷)設置方法(在某一箇中斷的中斷服務程序中設置的,把我的中斷優先級屏蔽掉,允許中斷嵌套;設置後一直有效,直到清除):
① 用 OCW1
屏蔽當前中斷
② 用 OCW3
設置特定屏蔽方式
清除方法:
① 用 OCW3
清除特定屏蔽方式
② 用 OCW1
開放當前中斷
如在 IR3
的服務程序中使用,IR0-2
開放,IR3-7
關閉。比 IR3
優先級低的中斷的服務程序必須送指定 EOI
。
... ;IR0-2開放,IR3-7關閉; 下面設置特殊屏蔽方式
CLI ;關中斷
IN AL, 21H ;讀入中斷屏蔽字
OR AL, 08H ;屏蔽第3個引腳 0000_1000
OUT 21H, AL ;送出去
MOV AL, 68H ;0_11_01_0_00特殊屏蔽字
OUT 20H, AL ;發特殊屏蔽字
STI ;開中斷
... ;IR0-2開放,IR4-7開放,IR3關閉
CLI ;關中斷; 下面關閉特殊屏蔽方式
MOV AL, 48H ;0_10_01_0_00
OUT 20H, AL ;清除特殊屏蔽方式
IN AL, 21H ;讀入中斷屏蔽字
AND AL, 0F7H ;開放自己,IMR3=0
OUT 21H, AL ;送出去
STI ;開中斷
...
MOV AL, 20H ;EOI命令
OUT 20H, AL
RET
8.3 8259A應用舉例
早期PC機——單片系統端口地址:20H、21H
;
- 邊沿觸發;
- 完全嵌套;
- 固定優先級;
- 非緩衝;
- 中斷類型號:
08H~0FH
初始化編程:
MOV AL, 13H
OUT 20H, AL ;ICW1
MOV AL, 08H
OUT 21H, AL ;ICW2
MOV AL, 01H
OUT 21H, AL ;ICW4
286以上PC機——雙片級聯繫統:
- 從片連在主片的
IR2
上,主從級聯信號互連 - 端口地址,主片:
20H、21H
;從片:0A0H、0A1H
- 邊沿觸發;
- 完全嵌套;
- 固定優先級;
- 非緩衝;
- 中斷類型號,主片:08H~0FH;從片:70H~77H
初始化編程(主)
MOV AL, 11H ;000_1_0_0_01
OUT 20H, AL
MOV AL, 08H
OUT 21H, AL
MOV AL, 04H
OUT 21H, AL
MOV AL, 01H
OUT 21H, AL
初始化編程(從)
MOV AL, 11H
OUT 0A0H, AL
MOV AL, 70H
OUT 0A1H, AL
MOV AL, 02H
OUT 0A1H, AL
MOV AL, 01H
OUT 0A1H, AL