天天看點

對一個中斷程式比較詳細的說明

#頭條群星9月榜#

8086的中斷由中斷控制器晶片8259A控制,其内部結構如下圖:

對一個中斷程式比較詳細的說明

圖1

CPU與8259的連接配接如下圖:

對一個中斷程式比較詳細的說明

圖2

要特别注意,8259由引腳INT向CPU發出中斷請求,CPU則通過INTA引腳響應這個請求。

下面是一個中斷程式,這個程式是顯示10遍字元串‘A 8259A Interrupt’:

對一個中斷程式比較詳細的說明

圖3

上圖是定義字元串

對一個中斷程式比較詳細的說明

圖4

上圖是儲存原中斷向量表中的8号中斷源的位址,調用了INT 21H的35H号功能。

對一個中斷程式比較詳細的說明

圖5

上圖是将自己編寫的中斷程式new08的入口位址放入中斷向量表類型8的存儲單元中,調用了INT 21H的25H号功能。

對一個中斷程式比較詳細的說明

圖6

由于上圖的中斷向量表是系統設定的,隻能臨時更改,是以要把類型8中斷的向量位址儲存下來。

對一個中斷程式比較詳細的說明

圖7

注意圖1和圖2中8259有8個中斷采集引腳IR0-IR8,但在某個具體的程式中,不一定要全部用到,是以可以通過中斷屏蔽寄存器IMR設定哪些引腳生效。上圖是保證IR0引腳有效,用于接收定時器8253的中斷請求。

對一個中斷程式比較詳細的說明

圖8

主程式運作到這裡以後,就在這裡循環等待中斷程式的中斷請求。

對一個中斷程式比較詳細的說明

從上圖開始進入中斷程式。

對一個中斷程式比較詳細的說明

注意counter是中斷程式和主程式進行交流的變量。

對一個中斷程式比較詳細的說明
對一個中斷程式比較詳細的說明

上面兩個圖是從字元串‘A 8259A Interrupt’逐個取出字元,并調用int10h進行顯示,其中的BX表示字元顯示的位置和顔色,AH是int10h的功能号。

對一個中斷程式比較詳細的說明

中斷程式每調用一次,就顯示一次字元串,每次運作完以後都要恢複圖3中儲存的原中斷向量表中的8号中斷源的位址。

對一個中斷程式比較詳細的說明

最後要恢複圖4中儲存的原中斷類型8在向量表中的位址和圖7中儲存的原中斷屏蔽寄存器IMR中的内容。

上面程式這個程式設計思路可以概括如下:

1:開始編寫程式的時候,我們要有圖2的大概印象,即8259和8086是通過中斷引腳INT和INTR連接配接的,我們編寫的這個程式,是要響應8259通過INT引腳向CPU發出的中斷請求的,這個中斷請求可以是一個5V的高電平。

2:8259每隔一段時間(比如1秒鐘)才發出一次請求。

3:8086響應一次中斷請求就執行一次中斷程式new08。

4:由于8259A1秒鐘才發出一次請求,而CPU執行指令的時間則非常快(納秒級),那麼,CPU多餘的時間怎麼辦呢?是以,主程式中必須有一個循環等待指定(圖8),也就是說,當CPU響應一次中斷即執行完一次中斷程式以後,多餘的時間就執行循環指令,等待下一次中斷請求的到來。

5:必須把主程式和中斷程式區分開來,主程式肯定會被CPU執行,中斷程式則隻有當INT引腳出現8259的中斷請求以後才會被執行。