一、中斷的概念
1.中斷:一種使cpu中止正在執(zhí)行的程序而轉(zhuǎn)去處理特殊事件的操作。
2.中斷源:引起中斷的事件。
(1)內(nèi)部中斷源,由程序中安排的中斷指令int產(chǎn)生的中斷,或由cpu的某些錯(cuò)誤操作結(jié)果產(chǎn)生的中斷。
① 溢出中斷指令 into
② 中斷指令int n產(chǎn)生的中斷
③ cpu錯(cuò)誤引起的中斷
④ 為debug設(shè)置的中斷:?jiǎn)尾街袛?,斷點(diǎn)中斷
(2)外部中斷源
由外部設(shè)備隨機(jī)引起的一般由中斷控制器控制的中斷或某些處理器(8087/80287)引起的中斷。
二、80x86 cpu的中斷源.
如下圖所示。
三、8086的中斷分類
1.軟件中斷(內(nèi)中斷)
1)中斷指令int引起的中斷:cpu執(zhí)行完一條int n (n不能為0、1、2、4的類型號(hào))指令后,會(huì)立即產(chǎn)生中斷,并且調(diào)用系統(tǒng)中相應(yīng)的中斷處理程序來完成中斷功能。
2)處理cpu某些錯(cuò)誤的中斷(為處理運(yùn)算結(jié)果的錯(cuò)誤而設(shè)置)
3)除法錯(cuò)中斷:中斷類型為0。又稱為除數(shù)為0中斷。
4)溢出中斷:中斷類型為4。用into指令來中斷發(fā)生溢出的算術(shù)操作,并把控制交給操作系統(tǒng)(此時(shí)要求of=1并執(zhí)行into指令)。如果未發(fā)生溢出,此時(shí)of=0,則into不會(huì)引起中斷,繼續(xù)執(zhí)行下面的一條指令。
5)為調(diào)試程序(debug)設(shè)置的中斷
單步中斷:當(dāng)標(biāo)志位tf置為1時(shí),每條指令執(zhí)行后,cpu自動(dòng)產(chǎn)生類型1的中斷——單步中斷。
斷點(diǎn)中斷:中斷類型為3。通常調(diào)試程序時(shí),把程序按功能分成幾段,然后每段設(shè)一個(gè)斷點(diǎn)。當(dāng)cpu執(zhí)行到斷點(diǎn)時(shí)便產(chǎn)生中斷,這時(shí)程序員可以檢查各寄存器及有關(guān)存儲(chǔ)單元的內(nèi)容。
軟終端過程
2.硬件中斷(外中斷):外中斷來自處理機(jī)的隨機(jī)發(fā)生的外部條件。
外中斷源:有非屏蔽中斷(nmi腳)和可屏蔽中斷(intr腳)兩大類。
外中斷與cpu的連接
非屏蔽中斷接至8086/8088 cpu的nmi腳(17腳)。
可屏蔽中斷通過8259a可編程中斷控制器接至8086/8088 cpu的intr腳(18腳)。
3.cpu響應(yīng)可屏蔽外中斷(intr)的條件
if=1才響應(yīng)intr請(qǐng)求的中斷。
intr未被8259a的中斷屏蔽寄存器(imr)屏蔽。
imr的i/o端口地址為21h。其8位對(duì)應(yīng)8個(gè)外設(shè)的中斷請(qǐng)求。
某位為0允許該外設(shè)中斷,某位為1則禁止該外設(shè)中斷。
4.cpu響應(yīng)非屏蔽外中斷(nmi)是無條件的。該中斷類型號(hào)為2。
8259a的中斷結(jié)束命令eoi及中斷命令寄存器(ocw2)
8259a的中斷命令寄存器的端口地址為20h。其內(nèi)容為:
中斷結(jié)束命令eoi是使8259a的中斷命令寄存器的第5位(eoi位)置1,清除當(dāng)前中斷服務(wù)寄存器isr中對(duì)應(yīng)的isn位,以告訴8259a該中斷已結(jié)束。
四、中斷向量表
1.中斷類型號(hào):每個(gè)中斷都被安排一個(gè)以示區(qū)別的8位的類型編號(hào)稱為中斷類型號(hào)。80x86中斷系統(tǒng)能處理256種類型的中斷,類型號(hào)為0~0ffh。
2.中斷向量表:各個(gè)中斷類型的處理子程序的入口地址表。存放于00000~003ffh的1kb單元中。低兩位字節(jié)存放中斷處理程序的偏移地址,高兩位存放段地址。每個(gè)類型的中斷向量地址占用4個(gè)字節(jié)的存儲(chǔ)單元。
3.內(nèi)部中斷的操作步驟
(1)取中斷類型號(hào);
(2)計(jì)算中斷向量地址;
(3)取中斷向量:偏移地址→(ip),段地址→(cs);
(4)轉(zhuǎn)入執(zhí)行中斷處理程序;
(5)中斷返回到int指令的下一條指令。
4.設(shè)置中斷向量:在檢查或設(shè)置任何中斷向量時(shí),總是避免直接使用中斷向量的絕對(duì)地址,而是使用dos系統(tǒng)功能調(diào)用(21h)存取中斷向量。
1)設(shè)置中斷向量:把由al指定的中斷類型的中斷向量ds:dx放置到中斷向量表中。
預(yù)置:ah=25h
al=中斷類型號(hào)
ds:dx=中斷向量
執(zhí)行:int21h
2)取中斷向量:把由al指定的中斷類型的中斷向量從中斷向量表中取到es:bx中。
預(yù)置:ah=35h
al=中斷類型號(hào)
執(zhí)行:int21h;中斷向量作為出口信息已在es:bx中
5.中斷過程:當(dāng)中斷發(fā)生時(shí),由中斷機(jī)構(gòu)自動(dòng)完成下列動(dòng)作:
(1)取中斷類型號(hào)n
(2)標(biāo)志寄存器(flags)內(nèi)容入棧
(3)當(dāng)前代碼段寄存器(cs)內(nèi)容入棧
(4)當(dāng)前指令計(jì)數(shù)器(ip)內(nèi)容入棧
(5)禁止外部中斷和單步中斷( if=0,tf=0 )
(6)從中斷向量表中取(4×n)中的字節(jié)內(nèi)容送ip,取(4×n+2)中的字節(jié)內(nèi)容送cs
(7)轉(zhuǎn)中斷處理程序。中斷處理程序需注意:
1)如在執(zhí)行中斷處理程序中還允許中斷,可用sti置if=1來開中斷;
2)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng);
3)中斷處理程序返回時(shí)使用iret指令。
6.中斷優(yōu)先級(jí)和中斷嵌套
2)ibm pc的可屏蔽中斷(intr)的優(yōu)先級(jí)由高到低為:ir0,ir1,ir2,ir3,ir4,ir5,ir6,ir7。但是可以由8259a的中斷命令寄存器(ocw2)的最高兩位d7、d6位
3)置為循環(huán)的優(yōu)先級(jí)。
4)中斷嵌套:正在運(yùn)行的中斷處理程序又被中斷稱為中斷嵌套。
一般是高級(jí)中斷嵌套低級(jí)中斷,此時(shí)要求低級(jí)中斷的處理程序中要有開中斷指令sti。被同級(jí)或低級(jí)中斷源嵌套,除了使if=1外,還要求向8259a發(fā)中斷結(jié)束命令eoi。
7.中斷處理程序
1)中斷準(zhǔn)備:在主程序中設(shè)置。
設(shè)置中斷向量
設(shè)置設(shè)備的中斷屏蔽位
設(shè)置cpu的中斷允許位if (開中斷)
2)中斷響應(yīng):由硬件自動(dòng)完成。
外設(shè)接口送中斷請(qǐng)求給cpu
當(dāng)前指令執(zhí)行完后,cpu送中斷響應(yīng)信號(hào)給外設(shè)接口
cpu接收中斷類型號(hào)
當(dāng)前的flags,cs和ip保存入棧
清除tf和if
中斷向量送ip和cs
3)中斷處理程序的編寫方法與標(biāo)準(zhǔn)子程序類似,編寫步驟如下:
保護(hù)現(xiàn)場(chǎng),即保存寄存器內(nèi)容
如允許中斷嵌套,則開中斷(sti) 使if=1
處理中斷內(nèi)容
關(guān)中斷
送中斷結(jié)束命令(eoi)給8259a的中斷命令寄存器(ocw2)以清除8259a的isr中對(duì)應(yīng)的isn位
恢復(fù)現(xiàn)場(chǎng),即恢復(fù)寄存器的內(nèi)容
返回被中斷的程序(iret,中斷返回)