對一個中斷程序比較詳細(xì)的說明
8086的中斷由中斷控制器芯片8259A控制,其內(nèi)部結(jié)構(gòu)如下圖:

CPU與8259的連接如下圖:

要特別注意,8259由引腳INT向CPU發(fā)出中斷請求,CPU則通過INTA引腳響應(yīng)這個請求。
下面是一個中斷程序,這個程序是顯示10遍字符串‘A 8259A Interrupt’:

上圖是定義字符串

上圖是保存原中斷向量表中的8號中斷源的地址,調(diào)用了INT 21H的35H號功能。

上圖是將自己編寫的中斷程序new08的入口地址放入中斷向量表類型8的存儲單元中,調(diào)用了INT 21H的25H號功能。

由于上圖的中斷向量表是系統(tǒng)設(shè)定的,只能臨時更改,所以要把類型8中斷的向量地址保存下來。

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

主程序運行到這里以后,就在這里循環(huán)等待中斷程序的中斷請求。

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

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


上面兩個圖是從字符串‘A 8259A Interrupt’逐個取出字符,并調(diào)用int10h進行顯示,其中的BX表示字符顯示的位置和顏色,AH是int10h的功能號。
中斷程序每調(diào)用一次,就顯示一次字符串,每次運行完以后都要恢復(fù)圖3中保存的原中斷向量表中的8號中斷源的地址。
最后要恢復(fù)圖4中保存的原中斷類型8在向量表中的地址和圖7中保存的原中斷屏蔽寄存器IMR中的內(nèi)容。
上面程序這個編程思路可以概括如下:
1:開始編寫程序的時候,我們要有圖2的大概印象,即8259和8086是通過中斷引腳INT和INTR連接的,我們編寫的這個程序,是要響應(yīng)8259通過INT引腳向CPU發(fā)出的中斷請求的,這個中斷請求可以是一個5V的高電平。
2:8259每隔一段時間(比如1秒鐘)才發(fā)出一次請求。
3:8086響應(yīng)一次中斷請求就執(zhí)行一次中斷程序new08。
4:由于8259A1秒鐘才發(fā)出一次請求,而CPU執(zhí)行指令的時間則非??欤{秒級),那么,CPU多余的時間怎么辦呢?因此,主程序中必須有一個循環(huán)等待指定(圖8),也就是說,當(dāng)CPU響應(yīng)一次中斷即執(zhí)行完一次中斷程序以后,多余的時間就執(zhí)行循環(huán)指令,等待下一次中斷請求的到來。
5:必須把主程序和中斷程序區(qū)分開來,主程序肯定會被CPU執(zhí)行,中斷程序則只有當(dāng)INT引腳出現(xiàn)8259的中斷請求以后才會被執(zhí)行。