中斷是計(jì)算機(jī)輸入輸出程序設(shè)計(jì)常用的控制方式,有一點(diǎn)計(jì)算機(jī)操作系統(tǒng)基礎(chǔ)的人對(duì)這個(gè)詞一定不會(huì)陌生,中斷控制技術(shù)主要應(yīng)用在以下幾個(gè)方面:
1、及時(shí)處理計(jì)算機(jī)中突發(fā)故障,比如說(shuō)突然斷電、執(zhí)行指令時(shí)溢出內(nèi)存故障等等,
2、協(xié)調(diào)主機(jī)與外設(shè)工作速度的矛盾
3、在實(shí)時(shí)控制系統(tǒng)中,及時(shí)處理各控制點(diǎn)的現(xiàn)場(chǎng)
一、中斷源及中斷類(lèi)型碼
引起中斷的原因叫做中斷源,8086/8088 CPU最多可以處理256種類(lèi)型的中斷,這些中斷可來(lái)自CPU內(nèi)部的原因,也可來(lái)自外設(shè)的I/O請(qǐng)求,根據(jù)中斷源可將中斷分為外部中斷和內(nèi)部中斷兩大類(lèi)。
1、外部中斷
外部中斷是由I/O設(shè)備或其他異常情況引起的,這類(lèi)中斷的出現(xiàn)通常是隨機(jī)的,外部中斷又稱為硬件中斷,外部中斷又可分為不可屏蔽中斷和可屏蔽中斷,一般由外設(shè)引起的中斷為可屏蔽中斷,在標(biāo)志寄存器中,當(dāng)IF=1時(shí)可屏蔽中斷和不可屏蔽中斷都能被CPU響應(yīng),若IF=0時(shí),不可屏蔽中斷能被CPU響應(yīng),但屏蔽中斷不能夠唄CPU響應(yīng)。中斷允許標(biāo)志位IF的狀態(tài)可使用STL(使IF=1)和CLI(使IF=0)設(shè)置為開(kāi)中斷和關(guān)中斷。
2、內(nèi)部中斷
由CPU內(nèi)部引起的中斷稱為內(nèi)部中斷,比如說(shuō)除法運(yùn)算出錯(cuò)、執(zhí)行軟中斷指令、單步中斷等,它們都是非屏蔽中斷,內(nèi)部中斷一般又分為下面四種:
【a】、除法出錯(cuò)中斷:當(dāng)除數(shù)為0或處除法中所得商過(guò)大時(shí),立即產(chǎn)生一個(gè)內(nèi)部中斷。
【b】溢出中斷指令I(lǐng)NTO:這是一條軟件中斷指令,當(dāng)執(zhí)行該指令時(shí),若前面的運(yùn)算已產(chǎn)生溢出,是OF=1時(shí),便產(chǎn)生一個(gè)內(nèi)部中斷,若OF=0,邊不會(huì)產(chǎn)生中斷。
【c】、軟中斷指令I(lǐng)NT n:這是系統(tǒng)提供兩組功能子程序,一組是ROM的BIOS中,另一組在OS中,這兩組功能子程序?qū)崿F(xiàn)常用的輸入輸出及文件處理等基本操作,使用軟中斷指令I(lǐng)NT,調(diào)用這些功能子程序,以內(nèi)部中斷形式執(zhí)行這些基本操作。
【d】、單步中斷:當(dāng)標(biāo)志寄存器中單步標(biāo)志位TF=1,CPU便進(jìn)入單步工作方式,即每執(zhí)行一條指令,就自動(dòng)產(chǎn)生內(nèi)部中斷,停止執(zhí)行程序,一共用戶檢查程序執(zhí)行結(jié)果。
二、中斷優(yōu)先級(jí)
當(dāng)同一時(shí)刻有若干個(gè)不同的中斷請(qǐng)求出現(xiàn)時(shí),CPU會(huì)先執(zhí)行那一個(gè)中斷呢?這就涉及到了中斷的優(yōu)先級(jí)問(wèn)題,這就如同我們所學(xué)的高級(jí)語(yǔ)言中的符號(hào)運(yùn)算的優(yōu)先級(jí)一樣,而對(duì)于中斷的優(yōu)先級(jí)如下:
高------------------------------------------------------>低
內(nèi)中斷(除法出錯(cuò)、INT n、INTO)、不可屏蔽中斷、可屏蔽中斷、單步中斷
三、中斷過(guò)程
中斷的過(guò)程類(lèi)似于我們之前所說(shuō)的子程序調(diào)用過(guò)程,不同的是在保護(hù)中斷現(xiàn)場(chǎng)時(shí),除了保存返回地址CS和IP外,還要保存標(biāo)志寄存器FLAGS的內(nèi)容,另外當(dāng)中斷響應(yīng)后CPU自動(dòng)將IF和TF標(biāo)志清0,其目的是在CPU進(jìn)入處理程序后不再響應(yīng)其他別的中斷請(qǐng)求,如果我們還想在執(zhí)行某一個(gè)中斷的過(guò)程中還可以去執(zhí)行另外的中斷,我們可以通過(guò)STI指令將IF標(biāo)志位置1
一個(gè)完整的中斷過(guò)程有下面5個(gè)步驟:1、中斷請(qǐng)求2、中斷優(yōu)先級(jí)判定3、中斷響應(yīng)4、中斷處理5、中斷返回。
四、編寫(xiě)自己的中斷處理程序
中斷處理程序大部分由BIOS或DOS系統(tǒng)提供的,當(dāng)我們編寫(xiě)自己需要的中斷處理程序時(shí),應(yīng)該注意下面幾個(gè)問(wèn)題:
1、程序中不用數(shù)據(jù)段,一般將數(shù)據(jù)變量直接放入代碼段中
2、程序中不用堆棧段,中斷處理程序借用調(diào)用者的堆棧段
3、在進(jìn)入中斷處理程序后,首先要保護(hù)現(xiàn)場(chǎng)。在程序中用到的寄存器需要壓入堆棧保護(hù)起來(lái),在程序結(jié)束前恢復(fù)各寄存器內(nèi)容,使用時(shí)要注意堆棧后進(jìn)先出的原則
4、在中斷處理程序中,若允許中斷嵌套,應(yīng)保護(hù)現(xiàn)場(chǎng)后,用STI指令開(kāi)中斷,在中斷處理程序的工作結(jié)束后,在恢復(fù)現(xiàn)場(chǎng)返回之前用CLI指令關(guān)中斷。
下面我們以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明問(wèn)題
例:編寫(xiě)一個(gè)中斷處理程序,中斷類(lèi)型號(hào)為60H,功能為顯示一個(gè)字符串“Yzs”
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
MAIN PROC FAR
START: MOV AL, 60H ;獲取原60H中斷向量
MOV AH, 35H
INT 21H
PUSH ES ;讀取的中斷向量位于ES:BX中
PUSH BX ;壓入堆棧保存
MOV AX, SEG INT_PROGRAM ;設(shè)置新的60H中斷向量
MOV DS, AX ;中斷向量的段地址放在DS中
MOV DX, OFFSET INT_PROGRAM ;中斷向量的地址放在DX中
MOV AL, 60H
MOV AH, 25H ;用INT 21H的25H號(hào)功能設(shè)置中斷向量
INT 21H
INT 60H ;用新的60H中斷向量
POP DX ;把原中斷向量彈出堆棧
POP DS
MOV AL, 60H
MOV AH, 25H ;恢復(fù)原中斷向量
INT 21H
MOV AX, 4C00H ;返回DOS
INT 21H
MAIN ENDP
DISP DB 'Yzs' ;待顯示的字符串
INT_PROGRAM PROC FAR ;新60H中斷處理程序
PUSH AX ;保護(hù)現(xiàn)場(chǎng)
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSH DS
PUSH ES
STI ;開(kāi)中斷
PUSH CS ;設(shè)置DS=CS
POP DS
MOV DX, OFFSET DISP
MOV AH, 09H
INT 21H ;顯示字符
CLI ;關(guān)中斷
POP ES ;恢復(fù)現(xiàn)場(chǎng)
POP DS
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET
INT_PROGRAM ENDP
CODE ENDS
END START
五、BIOS和DOS中斷調(diào)用
我們所說(shuō)的BIOS就是基本輸入輸出系統(tǒng),它存放在內(nèi)存地址較高地址區(qū)域的ROM中,它不僅處理系統(tǒng)的全部中斷,還提供對(duì)主要I/O接口的控制功能,每個(gè)功能的控制模塊的入口地址都在中斷矢量表中,在1K的中斷矢量表中,共有256個(gè)中斷調(diào)用入口地址,對(duì)這些中斷調(diào)用是通過(guò)軟中斷INT來(lái)實(shí)現(xiàn)的,軟中斷指令的操作數(shù)就是中斷類(lèi)型碼。DOS是磁盤(pán)操作系統(tǒng),是由BIOS開(kāi)機(jī)后自動(dòng)裝入內(nèi)存中的,DOS中斷是建立在BIOS之上的中斷,它借用了BIOS的軟中斷功能來(lái)調(diào)用系統(tǒng)的中斷服務(wù)程序。
在BIOS中斷類(lèi)型中,0H--9H號(hào)中斷為硬中斷,一般不用程序調(diào)用,是由I/O接口觸發(fā)的。其他中斷則是由用戶通過(guò)指令來(lái)控制的。在DOS中斷調(diào)用中,主要使用21H中斷,因?yàn)樵撝袛嘀邪顺S玫逆I盤(pán)、磁盤(pán)、打印機(jī)等一系列I/O接口,在調(diào)用時(shí)只需將AH寄存器設(shè)置成所需要的功能號(hào)并設(shè)置一些其他所對(duì)應(yīng)的參數(shù)即可完成調(diào)用功能。因?yàn)樵谄匠5木幊讨幸话阌玫幂^多的是對(duì)硬件依賴不大且代碼量比較少的DOS中斷調(diào)用,所以下面我就側(cè)重介紹下有關(guān)DOS中斷調(diào)用的實(shí)例。
1、鍵盤(pán)DOS功能調(diào)用
有關(guān)鍵盤(pán)方面的INT 21H有1、6、7、8號(hào)功能
【a】、1號(hào)功能
功能:從鍵盤(pán)讀入一個(gè)字符,將字符回顯在屏幕上,同時(shí)將輸入的字符送入到AL寄存器中,如果讀到的字符是Ctrl+Break鍵,則結(jié)束程序執(zhí)行
【b】、6號(hào)功能
功能:直接讀寫(xiě)控制臺(tái)
輸入?yún)?shù):AH=06H,若DL==00FH表示輸入鍵盤(pán)字符, 若DL=0--0FFH,表示輸出字符
返回結(jié)果:輸入時(shí),ZF=0,表示有字符輸入,AL為輸入字符的ASCII碼
ZF=1,表示無(wú)字符輸入,AL=0
輸出時(shí),無(wú)返回結(jié)果。
【c】、7號(hào)功能
功能:從鍵盤(pán)讀入一個(gè)字符,不回顯在屏幕上,同時(shí)將輸入字符送入到AL寄存器中,也不檢測(cè)是否為Ctrl+Break鍵。
【d】、8號(hào)功能
功能:1號(hào)功能基本相同,只是字符不回顯在屏幕上。
2、顯示器DOS功能調(diào)用
DOS中的INT 21H提供的顯示功能主要有以下三個(gè):
【a】、當(dāng)AH=02H時(shí),功能是顯示一個(gè)字符,光標(biāo)跟隨字符移動(dòng),檢測(cè)Ctrl+Break鍵。
輸入?yún)?shù):DL為待顯示字符的ASCII碼
返回結(jié)果:無(wú)
【b】、當(dāng)AH=06H時(shí),功能是顯示一個(gè)字符,光標(biāo)跟隨字符移動(dòng),但不檢測(cè)Ctrl+Break鍵。
輸入?yún)?shù):DL為待顯示字符的ASCII
返回結(jié)果:無(wú)
【c】、當(dāng)AH=09H時(shí),功能是顯示字符串,光標(biāo)跟隨字符串移動(dòng)
輸入?yún)?shù):DS:DX為待顯示字符串的首地址,字符串必須以“$”結(jié)尾
返回結(jié)果:無(wú)
我在我的另一篇博文中介紹過(guò)過(guò)于字符串的輸出這部分,是我這個(gè)匯編專(zhuān)題的第一篇,有興趣的朋友可以看下http://yiluohuanghun.blog.51cto.com/3407300/935340
我們?cè)僖砸粋€(gè)例子結(jié)束我們這節(jié)關(guān)于中斷的知識(shí):
例:編程產(chǎn)生10個(gè)0--51之間的隨機(jī)整數(shù),放入內(nèi)存BUF開(kāi)始的各單元中。
DATA SEGMENT
BUF DB 10 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
LEA BX, BUF
MOV CX, 10
STI
NEXT: PUSH CX
MOV AH, 0
INT 1AH
MOV AL, DL
CBW
DIV 5
MOV [BX], AL
INC BX
POP CX
LOOP NEXT
MOV 4CH
INT 21H
CODE ENDS
END START
到此為止,關(guān)于中斷部分我也大致給大家說(shuō)完了,當(dāng)然了,我在這里寫(xiě)的只是這方面的一點(diǎn)點(diǎn)東西,起個(gè)拋磚引玉的作用,希望能夠?qū)Υ蠹矣袔椭?/p>