《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 解決方案 > 匯編基礎(chǔ):中斷

匯編基礎(chǔ):中斷

2017-06-10
關(guān)鍵詞: 匯編

中斷是計(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>


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。