第八章-中斷及異常-4_第1頁
第八章-中斷及異常-4_第2頁
第八章-中斷及異常-4_第3頁
第八章-中斷及異常-4_第4頁
第八章-中斷及異常-4_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

中斷程序設(shè)計一、中斷向量的保存、設(shè)置和恢復(fù)二、軟中斷程序設(shè)計三、可屏蔽硬中斷程序設(shè)計四、問題討論一、中斷向量的保存、設(shè)置和恢復(fù)1.保存中斷向量(35H功能)入口參數(shù)AL=要保存向量的中斷類型號N功能號AH=35H類型號21H出口參數(shù)BX=(0:N×4)

ES=(0:N×4+2)實(shí)現(xiàn)功能將類型號N的中斷向量保存在ES、BX中方法一:用堆棧保存中斷向量MOVAL,09H;取中斷向量

MOVAH,35HINT21HPUSHES;用堆棧保存PUSHBX

例1保存09H類型的中斷向量 (如何保存(ES),(BX))方法二:用變量保存中斷向量save_csDW? ;定義變量save_ipDW?

MOVAX,SEGsave_csMOVDS,AXMOVAL,09H ;取中斷向量MOVAH,35HINT21HMOVsave_cs,ES ;用變量保存MOVsave_ip,BX

入口參數(shù)AL=要設(shè)置向量的中斷類型號NDS:DX=中斷子程的入口地址(中斷向量)功能號AH=25H類型號21H出口參數(shù)無

實(shí)現(xiàn)功能將類型N的中斷向量設(shè)置在向量表中,即(0:N×4)=類型N中斷子程入口地址的偏移值(0:N×4+2)=類型N中斷子程入口地址的段值2.設(shè)置中斷向量(25H功能)例2設(shè)置中斷子程Sound的中斷向量,類型號為60HcodeSEGMENTASSUMECS:codestart:MOVAX,SEGsoundMOVDS,AXMOVDX,OffsetsoundMOVAL,60HMOVAH,25HINT21H

MOVAH,4CHINT21H;中斷子程soundPROC

IRETsoundENDPcodeENDSENDstart二、軟中斷程序設(shè)計軟中斷子程與子程序的編寫類似,其不同點(diǎn)在于:1.子程用CALL指令調(diào)用;中斷子程用INT指令調(diào)用2.子程用RET指令返回;中斷子程用IRET指令返回3.CALL指令直接用過程名做操作數(shù),即由過程名提供子程的入口地址INT指令由類型號N到中斷向量表中固定的單元獲得中斷子程的入口地址

對比軟中斷程序與子程序的編寫其不同點(diǎn)在于:1.應(yīng)在主程中將中斷子程的入口地址(中斷向量)放入中斷向量表中。(可用25H系統(tǒng)功能完成)2.主程中用INT指令調(diào)用中斷子程3.中斷子程應(yīng)用IRET返回.例3:用子程編寫和用一個60H類型的中斷子程編寫,功能是將BX寄存器的內(nèi)容以16進(jìn)制形式顯示出來。listPROC;子程

MOVCH,4MOVCL,4next:ROLBX,CLMOVDL,BLANDDL,0FHADDDL,30HCMPDL,39HJLEprintADDDL,07Hprint:MOVAH,2HINT21HDECCHJNZnextRET;子程返回listENDPcodeENDSENDstartcodeSEGMENTASSUMECS:codestart:CALLlist;調(diào)用子程MOVAH,4CHINT21H;返回DOS若用子程編寫:codeSEGMENTASSUMECS:codestart:MOVAX,SEGlist;用25H功能MOVDS,AX;將中斷子程listLEADX,list;的入口地址MOVAL,60H;設(shè)置到MOVAH,25H;中斷向量表中INT21HINT60H;調(diào)用中斷子程MOVAH,4CHINT21H;返回DOS

listPROC;中斷子程listMOVCH,4MOVCL,4next:ROLBX,CLMOVDL,BLANDDL,0FHADDDL,30HCMPDL,39HJLEprintADDDL,07Hprint:MOVAH,2HINT21HDECCHJNZnextIRET;中斷返回listENDPcodeENDSENDstart用INT60H中斷子程編寫:三、可屏蔽硬中斷程序設(shè)計分三大步驟:1.了解IBMPC/XT系統(tǒng)可屏蔽硬中斷的響應(yīng)過程,據(jù)連線確定外設(shè)中斷申請對應(yīng)的中斷類型號;2.主程中做好外設(shè)發(fā)出中斷申請,CPU能夠響應(yīng)的準(zhǔn)備工作;3.編寫可屏蔽硬中斷子程,完成中斷源請求的任務(wù).1.了解IBMPC/XT系統(tǒng)可屏蔽硬中斷的響應(yīng)過程,據(jù)連線確定外設(shè)中斷申請對應(yīng)的中斷類型號。例接口的中斷申請連IRQ3類型號0BH接口的中斷申請連IRQ5類型號0DHIRQ2IRQ3IRQ4IRQ5IRQ6IRQ7CS8259AA0RDWRD0~D7SP/ENCA0CA1CA2GNDIR0IR1IR2IR3IR4IR5IR6IR7Vcc+5V用于多片8259A級連情況INTAINT數(shù)據(jù)線片選譯碼20~3FHIOWA0總線

IORA5~A9D0~D7INTA

INTR08H09H0AH0BH0CH0DH0EH0FH18.2Hz方波鍵盤PC/XT總線在主程序中應(yīng)做的工作:①CPU關(guān)中斷(用CLI置IF=0)②保存原中斷向量(用35H系統(tǒng)功能)③設(shè)置中斷向量(用25H系統(tǒng)功能)④設(shè)置8259A的中斷屏蔽字,使21H端口對應(yīng)位為0,允許中斷申請進(jìn)入優(yōu)先級裁決器⑤CPU開中斷(用STI置IF=1)2.主程中做好外設(shè)發(fā)出中斷申請,CPU能夠響應(yīng)的準(zhǔn)備工作。準(zhǔn)備工作做好后,此后若該級有中斷申請,則CPU響應(yīng)中斷,執(zhí)行相應(yīng)類型的中斷子程。主程在返回DOS前,應(yīng)恢復(fù)原中斷向量。(用25H系統(tǒng)功能)8088INTR主板IF鍵盤18.2Hz方波8259AINT中斷屏蔽寄存器鍵盤中斷申請IR1IR2~IR7IR0當(dāng)前中斷服務(wù)寄存器鍵盤接口IRQ2~IRQ7PC總線外設(shè)接口外設(shè)08h09h0Ah~0FhIBMPC/XT微機(jī)可屏蔽中斷響應(yīng)過程示意圖①處理中斷源申請任務(wù)部分的編寫與普通子程類似②在中斷子程結(jié)束前,發(fā)中斷結(jié)束命令清除8259A中ISR的記錄;否則,響應(yīng)一次中斷后,同級中斷和低級中斷將被優(yōu)先級裁決器屏蔽③用IRET中斷返回指令返回主程被中斷處3.編寫硬中斷子程,完成中斷源請求的任務(wù)返回DOSCLI關(guān)中斷保存原中斷向量設(shè)置新中斷向量設(shè)置8259A的中斷屏蔽字中斷子程有關(guān)量的初始化STI開中斷主程其它工作處理恢復(fù)原中斷向量開始主程序保護(hù)現(xiàn)場發(fā)中斷結(jié)束命令EOI完成中斷源申請的任務(wù)恢復(fù)現(xiàn)場IRET中斷返回開始中斷子程可屏蔽硬中斷程序流程圖例4利用連接在8259AIR0上的時鐘信號,編寫具有定時功能程序,要求每隔5秒在屏蔽上顯示一個字符’A’。8088INTR主板IF18.2Hz方波8259AINT中斷屏蔽寄存器IR0當(dāng)前中斷服務(wù)寄存器08h時鐘信號連接在IR0上,申請的中斷類型號為08H。時鐘信號是一個頻率為18.2HZ的方波信號,即每秒向8259A發(fā)出18.2次的中斷申請。如果CPU響應(yīng)該中斷申請,則以每秒18.2次的頻率執(zhí)行08H類型的中斷子程。分析80888259AINTR

IR018.2Hz方波信號INT中斷申請的任務(wù)是每5秒顯示一個字符’A’1秒執(zhí)行18.2次,則5秒執(zhí)行18.2×5=91次,只在執(zhí)行到第91次時顯示’A’,其它不顯示。在中斷子程中用一個量來計數(shù)中斷子程被執(zhí)行的次數(shù),即CPU響應(yīng)IR0中斷申請的次數(shù)。當(dāng)達(dá)到91次,則顯示’A’,并將計數(shù)值清0,重新計數(shù);其它情況只計數(shù),不顯示’A’。中斷子程的最后應(yīng)發(fā)中斷結(jié)束命令EOI。主程序中斷子程CLI關(guān)中斷保存原08H中斷向量設(shè)置新08H中斷向量設(shè)置8259A的中斷屏蔽字,允許IR0中斷08H中斷子程執(zhí)行次數(shù)初值0STI開中斷主程其它工作處理恢復(fù)原08H中斷向量返回DOS開始CX發(fā)中斷結(jié)束命令EOI恢復(fù)現(xiàn)場IRET中斷返回保存現(xiàn)場開始中斷子程被執(zhí)行一次CX←CX+1NY調(diào)02HDOS功能顯示字符‘A’CX←0重新記數(shù)到91次,即5秒時間到?codeSEGMENTASSUMECS:codestart:CLI;關(guān)中斷MOVAL,08HMOVAH,35HINT21H;取系統(tǒng)08H類型中斷向量PUSHES;用堆棧保存PUSHBXPUSHDSMOVDX,OFFSETdisplay;設(shè)置08H類型中斷向量MOVAX,SEGdisplayMOVDS,AXMOVAL,08HMOVAH,25HINT21HPOPDS程序清單:INAL,21H;設(shè)置8259A中斷屏蔽字,

ANDAL,11111110B;允許IR0中斷OUT21H,ALMOVCX,0;置中斷子程計數(shù)器初值為0STI;CPU開中斷MOVSI,8000H;用雙重循環(huán)延時,w2:MOVDI,8000H;模擬CPU對其他任務(wù)的處理w1:DECDI;DI,SI的值可修改,控制主程執(zhí)行時間JNZw1DECSIJNZw2POPDX;恢復(fù)系統(tǒng)08H類型中斷向量

POPDSMOVAL,08HMOVAH,25HINT21HMOVAH,4CH;返回DOSINT21H

displayPROC;自編的08H類型中斷子程PUSHAX;保護(hù)現(xiàn)場INCCX;執(zhí)行中斷子程一次,計數(shù)值加1CMPCX,91JNZexit;到91次了嗎?未到跳轉(zhuǎn)至exitMOVDL,’A’;到,顯示‘A’MOVAH,02INT21HMOVCX,0;清計數(shù)值為0,重新計時exit:MOVAL,20H;發(fā)中斷結(jié)束命令EOIOUT20H,ALPOPAX;恢復(fù)現(xiàn)場IRET;中斷返回displayENDPcodeENDSENDstartsys08PROCMOVAX,0040HMOVDS,AXINT1CHMOVAL,20HOUT20H,ALIRETsys08ENDPDOS系統(tǒng)提供的08H類型中斷子程:sys1cPROCIRETsys1cENDPDOS系統(tǒng)提供的1CH類型中斷子程:系統(tǒng)08H類型中斷子程要點(diǎn):①

進(jìn)入子程后,修改了DS段寄存器的值;②程序中調(diào)用了1CH類型中斷子程,每執(zhí)行一次08H中斷子程,執(zhí)行一次1CH中斷子程;③程序最后發(fā)中斷結(jié)束命令EOIsys08PROCMOVAX,0040HMOVDS,AXINT1CHMOVAL,20HOUT20H,ALIRETsys08ENDP1CH類型是軟中斷,按編寫軟中斷子程方法編寫:①系統(tǒng)08H中斷子程改變DS值,故:1CH中斷子程用到定義的變量,須在子程中給DS賦值。②1CH類型是軟中斷,不需要發(fā)中斷結(jié)束命令。1CH類型是系統(tǒng)為用戶保留的定時中斷子程系統(tǒng)1CH中斷子程只有一條中斷返回語句,確保08H中斷子程調(diào)用后能返回。

用戶可通過編寫1CH中斷子程實(shí)現(xiàn)具有定時功能的任務(wù)sys1cPROCIRETsys1cENDP例5

編寫09H類型的鍵盤中斷子程鍵盤接口鍵盤鍵盤中斷申請8259AIR1INTAINT8088INTRINTA60H端口61H端口8255A應(yīng)答信號掃描碼輔助電路主板IR018.2Hz方波說明:鍵盤接口通過8259A的IR1發(fā)中斷申請,類型號09H鍵盤接口對按下鍵和釋放鍵都向8259A發(fā)出中斷申請,即若CPU滿足響應(yīng)條件,對鍵盤上的一個按鍵操作,CPU將執(zhí)行兩次09H類型的中斷子程:按下鍵一次,釋放鍵一次CPU可從60H端口讀取操作鍵的掃描碼, 每個鍵對應(yīng)有一個掃描碼由掃描碼的D6~D0判斷操作的是哪一個鍵,由掃描碼的D7位判斷是按下鍵,還釋放鍵。D7=1,釋放鍵(斷碼);D7=0,按下鍵(通碼)鍵盤中斷子程中應(yīng)發(fā)中斷結(jié)束命令在IBMPC/XT機(jī)上,

從60H端口讀取掃描碼后,應(yīng)向鍵盤接口(61H)置應(yīng)答信號,使鍵盤接口為接收下一個按鍵的掃描碼做好準(zhǔn)備。不設(shè)應(yīng)答信號,鍵盤接口不能正常工作。在286以上微機(jī),讀取掃描碼后,可不置鍵盤應(yīng)答。keyPROCINAL,60H;從60H端口讀入掃描碼PUSHAX;保存堆棧中INAL,61H;置鍵盤應(yīng)答控制信號:ORAL,80H;先將61H端口的D7位置1OUT61H,ALANDAL,7FH;再將61H端口的D7位置0OUT61H,ALPOPAX;從堆棧中取出掃描碼TESTAL,80H;檢查掃描碼的D7位JNZexit;D7=1,表示釋放鍵操作,轉(zhuǎn)至出口

exit:MOVAL,20H;發(fā)中斷結(jié)束命令EOIOUT20H,ALIRET;中斷返回keyENDP

IBMPC/XT機(jī)上鍵盤中斷子程的編寫:keyPROCINAL,60H;從60H端口讀入掃描碼TESTAL,10000000B;檢查掃描碼的D7位JNZexit;D7=1,表示釋放鍵操作,轉(zhuǎn)至出口、、、、、、exit:MOVAL,20H;發(fā)中斷結(jié)束命令EOIOUT20H,ALIRET;中斷返回keyENDP

586機(jī)上鍵盤中斷子程的編寫:有關(guān)鍵盤①鍵盤通過鍵盤接口電路與計算機(jī)連接。②鍵盤上的鍵有三種類型:字符鍵A~Z,0~9等功能鍵F1~F12,PageUp等組合控制鍵Shift,Ctrl,Alt等③

鍵盤上的每個鍵都有一個掃描碼。 據(jù)掃描碼可確定操作的是哪個鍵、是按下鍵還是釋放鍵; 掃描碼用一個字節(jié)表示。低7位是掃描碼的數(shù)字編碼,與鍵盤上的鍵一一對應(yīng);最高位D7位表示鍵的操作狀態(tài):當(dāng)按下鍵時,D7=0;當(dāng)釋放鍵時,D7=1⑤

鍵盤中斷子程功能(09H類型中斷子程)從鍵盤接口讀取操作鍵的掃描碼;

將掃描碼轉(zhuǎn)換成字符碼;大部分鍵的字符碼為ASCII碼,無ASCII碼鍵(如組合鍵Shift、Ctrl等)的字符碼為0。將鍵的掃描碼、字符碼存放在鍵盤緩沖區(qū),供其它有關(guān)鍵盤的中斷子程應(yīng)用。④鍵盤接口對按下鍵和釋放鍵均向計算機(jī)發(fā)出中斷申請,如果中斷響應(yīng)條件滿足,CPU轉(zhuǎn)去執(zhí)行鍵盤中斷子程。鍵盤中斷子程類型號為09H。例6:編寫鍵盤中斷子程,完成每操作鍵盤上任意鍵,屏幕上顯示’HeLLo!’主程序鍵盤中斷子程CLI關(guān)中斷保存原09H中斷向量設(shè)置新09H中斷向量設(shè)置8259A的中斷屏蔽字,允許IR1中斷STI開中斷主程其它工作處理恢復(fù)原09H中斷向量返回DOS開始保存現(xiàn)場開始從60H端口讀入掃描碼N判斷是否是按下鍵?Y調(diào)09H功能顯示字符串’Hello!’發(fā)中斷結(jié)束命令EOI恢復(fù)現(xiàn)場IRET中斷返回dataSEGMENTstringDB‘Hello!‘,0ah.0dh,’$’dataENDScodeSEGMENTASSUMECS:code,DS:datastart:CLI;關(guān)中斷,IF=0MOVAL,09HMOVAH,35HINT21H;取系統(tǒng)09H類型中斷向量PUSHES;用堆棧保存

PUSHBXPUSHDS;設(shè)置09H類型中斷向量MOVDX,OFFSETdisplayMOVAX,SEGdisplayMOVDS,AXMOVAL,09HMOVAH,25HINT21HPOPDS程序清單

INAL,21H;設(shè)置8259A中斷屏蔽字ANDAL,11111101B;允許IR1鍵盤中斷OUT21H,ALSTI;開中斷,IF=1MOVSI,8000H;用雙重循環(huán)延時w2:MOVDI,8000H;模擬CPU對其他任務(wù)的處理w1:DECDI;DI,SI的值可修改,控制主程執(zhí)行時間JNZw1DECSIJNZw2POPDX;恢復(fù)系統(tǒng)09H類型中斷向量POPDSMOVAL,09HMOVAH,25HINT21HMOVAH,4CH;返回DOSINT21HdisplayPROC;自編的09H類型中斷子程PUSHAX;保存現(xiàn)場INAL,60H;讀入字符掃描碼TESTAL,80H;判斷是否是按下鍵操作?JNZexitMOVAX,data;是,顯示‘Hello!’MOVDS,AXLEADX,stringMOVAH,09INT21Hexit:MOVAL,20H;發(fā)中斷結(jié)束命令EOIOUT20H,ALPOPAX;恢復(fù)現(xiàn)場IRET;中斷返回displayENDPcodeENDSENDstart四、問題討論中斷嵌套問題中斷向量的保存、恢復(fù)問題中斷嵌套問題1.嵌套的概念2.內(nèi)中斷引起的嵌套3.可屏蔽硬中斷引起的嵌套4.可屏蔽硬中斷嵌套的條件CPU正在執(zhí)行某一中斷子程,又被其它中斷源中斷使CPU轉(zhuǎn)去執(zhí)行另一中斷子程,這個過程叫中斷嵌套

1.

嵌套的概念中斷子程序1中斷申請CPU執(zhí)行流程中斷子程序2在中斷子程中,用INT指令調(diào)用中斷子程,引起了中斷嵌套,這種嵌套就是內(nèi)中斷引起的嵌套。

2.內(nèi)中斷引起的嵌套CPU執(zhí)行流程中斷子程序n1中斷子程序n2INTn1INTn2內(nèi)中斷引起的嵌套不受IF和8259A的控制,嵌套的層次受限于堆棧的大小。在響應(yīng)了某級可屏蔽硬中斷后,又有新的可屏蔽中斷申請發(fā)出,若滿足響應(yīng)條件,CPU轉(zhuǎn)去執(zhí)行另一個可屏蔽中斷子程。3.可屏蔽硬中斷引起的嵌套中斷子程序1中斷申請1CPU執(zhí)行流程中斷子程序2中斷申請2可屏蔽硬中斷引起的嵌套,受IF和8259A的控制,同時嵌套層次受堆棧容量的大小。①CPU在執(zhí)行中斷子程過程中,有可屏蔽硬中斷申請發(fā)出。(即有可屏蔽硬中斷源產(chǎn)生)②中斷子程開中斷,即用STI指令使IF=1。因?yàn)镃PU響應(yīng)中斷過程中,將IF標(biāo)志清0,然后轉(zhuǎn)去執(zhí)行中斷子程。故進(jìn)入中斷子程后,IF=0(即CPU允許響應(yīng)可屏蔽中斷)4.

可屏蔽硬中斷嵌套的條件③

新的中斷申請具有更高的優(yōu)先權(quán),即比8259A的當(dāng)前服務(wù)寄存器ISR中記錄的中斷優(yōu)先權(quán)高有兩種可能:新的中斷申請的確比當(dāng)前中斷的優(yōu)先級高新的中斷申請與當(dāng)前中斷的優(yōu)先級同級或低級,但在當(dāng)前中斷子程中提前發(fā)了中斷結(jié)束命令,使ISR中的相應(yīng)位為0。在滿足上述三個條件下,可引起可屏蔽硬中斷的嵌套例7

在中斷子程中未用STI來開中斷分析:

CPU響應(yīng)該中斷后,

IF標(biāo)志被自動清0;

由于子程中未開中斷,

IF仍為0;

所以,不論子程在何處發(fā)EOI,

均不會引起可屏蔽硬中斷嵌套。IRET發(fā)EOIIR2中斷子程IR0中斷申請例8中斷子程中STI開中斷,最后發(fā)EOI分析:

CPU響應(yīng)IR2中斷后,

IF標(biāo)志被自動清0

子程開中斷后,IF為1

所以,在開中斷后,

CPU可響應(yīng)優(yōu)先權(quán)更高的中斷申請引起可屏蔽中斷嵌套。IR1中斷申請IR2中斷子程STIIRET發(fā)EOICPU響應(yīng)IR1中斷申請例9中斷子程開中斷,提前發(fā)EOI結(jié)論:

子程開中斷后,

CPU可響應(yīng)優(yōu)先權(quán)更高的中斷申請。發(fā)EOI后,

CPU可響應(yīng)同級或低級的中斷申請。IR2中斷子程STIIRET發(fā)EOICPU響應(yīng)IR1中斷申請IR1中斷申請IR3中斷申請CPU響應(yīng)IR3中斷申請例10中斷子程中不發(fā)EOI分析:

CPU響應(yīng)中斷后,自動將ISR中的對應(yīng)位置1,因中斷子程未發(fā)EO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論