1. 程式人生 > >彙編--學習筆記(十三)-中斷及中斷處理程式

彙編--學習筆記(十三)-中斷及中斷處理程式

 中斷時電腦科學中最基本、也是十分重要的一個概念,可以說沒有中斷概念的引入和應用就不會有今天的計算機,至少不會有搞效率的計算機。

  • 一、基本概念
  • 二、BIOS中斷服務
  • 三、DOS中斷服務
  • 四、中斷處理技術
  • 五、中斷處理程式例項

一、中斷:
定義:中斷就是使CPU暫時掛起當前正在進行的工作並轉向某緊急事件的服務與處理程式(該服務與處理程式稱為中斷服務程式),在執行完中斷服務程式後再返回到被中止的原有工作處的過程。
中斷分類:中斷按其產生的方式可分為硬體中斷和軟體中斷。硬體中斷又分為內部和外部兩種。

二、內部硬體中斷

一個位元組即一共256箇中斷,00H~FFH。
定義:內部硬體中斷是由某些特殊的指令觸發的,例如單步中斷、除法出錯中斷。通常我們所說的硬體中斷即指內部硬體中斷。
硬體中斷舉例:在使用DEBUG除錯程式時我們經常使用T命令和P命令,而T命令和P命令的執行恰好正是利用了內部硬體中斷。

  • (1)INT 00H:除法錯誤中斷。
  • (2)INT 01H:單步中斷,由T命令產生。
    • 它的特徵是將陷阱標誌位TF置位,這樣當程式執行時,會在每一條指令的後面產生一個單步中斷,從而中止指令的繼續執行。
  • (3)INT 03H:斷點中斷,由P命令產生。
    • 與INT 01H類似,但不會跟蹤進子程式、中斷呼叫等。
  • (4)INT 04H:溢位中斷。
    • 在指令序列中,若上一個指令由於某些特殊原因使溢位標誌OF置1,那麼當執行溢位中斷指令INTO是立即產生中斷04H;若OF為0,則INTO不起作用。

三、外部硬體中斷

定義:外部硬體中斷是指從處理器外部的硬體裝置中產生併發向處理器的中斷。
分類:分為可遮蔽中斷

不可遮蔽中斷兩種。分別由INTR引腳NMI引腳的訊號來觸發。即有2條外部中斷請求線。

1、可遮蔽中斷–INTR
 可以通過設定中斷控制器的遮蔽引數來禁止某些指定的中斷。
 可遮蔽中斷還可以通過指令CLI(關中斷)來禁止CPU響應所有的外部中斷。
2、不可遮蔽中斷–NMI
 是用來處理一些緊急情況的,如機器掉電等。它不能由使用者通過編制軟體來遮蔽,一旦CPU接收到NMI引腳上的訊號時就必須立即響應,轉向NMI的服務程式,硬體將自動完成斷點保護及現場保護,且在中斷返回時執行一條RETN指令。

四、軟中斷

定義:嚴格說來,軟體中斷是內部中斷的一種,是由軟體引起的非遮蔽型中斷。

1、INT n 指令
 CPU執行INT n指令時,立即產生一個軟體中斷,中斷的型別由指令中的n指明。
應用:因為指令中可以指定任何的型別號,故此指令可以方便地用來除錯為外設編好的中斷服務程式。
2、中斷向量表
 中斷過程中很關鍵的一步是要由中斷處理程式對因各種原因觸發的相應中斷進行處理。因此每一箇中斷都要對應的有一箇中斷處理程式。對這些中斷進行管理的就是中斷向量表了。
(1)中斷向量表結構
中斷向量表的長度為1K位元組(1024位元組),共有256項,每一項4個位元組,對應一箇中斷。也就是說一張表中斷最多可對應256箇中斷(當然,實際上並沒有這麼多中斷,這就為使用者自己編制並擴充中斷服務程式提供了便利的條件)
 中斷向量表在記憶體中靠前的部分並固定在這個段地址為00H,偏移量為00H~3FFH,即00000H—003FFH的位置。
中斷向量表每項的四個位元組存放著該項對應中斷的中斷處理程式的入口地址。四個位元組也就是兩個字,高字存放中斷處理程式入口地址的段CS,低字存放偏移IP。
(2)中斷服務程式的呼叫
 中斷指令INT n 發出以後,就要到向量表中去找其對應的服務程式的地址。
n* 4所得到的就是中斷INT n 所對應的n號中斷的四個位元組地址在向量表中的首地址。
 由首地址開始的四個連續位元組即兩個字中順序存放著其對應中斷服務程式的入口地址的偏移和段地址,然後程式跳到此入口地址,並將控制交給中斷服務程式。
(3)中斷向量表的優點

  • 1)便於管理和擴充,就像通過倉庫存貨單可以找到任何一件儲存的物品那樣,我們可以通過向量表來找到每一箇中斷對應的中斷服務程式。
  • 2)當用戶想要編制和使用自己的中斷服務程式時,可以先設定中斷向量,以確定該中斷在中斷向量表中的位置,然後將自己編制的中斷服務程式(可以是駐留記憶體的,也可以是非駐留記憶體的)的地址返回給它在中斷向量表中對應位置的兩個字中,至此,使用者就可以十分方便地為自己建立一個軟中斷了。

例一:儲存5號中斷入口,然後重置5號中斷的入口

PUSH ES
MOV AX,3505H  ;取中斷向量
INT 21H
MOV [OLD_IP],BX ;儲存舊的偏移地址
MOV [OLD_ES],ES ;儲存舊的段地址
POP ES 
MOV AX,2505H ;重置中斷向量
MOV DX,OFFSET INT05H
INT 21H

3、中斷型別號的提供
(1)INT 00H ~ 05H自動提供

  • INT 00H — 除法錯誤
  • INT 01H — 單步錯誤
  • INT 02H — 非遮蔽中斷NMI
  • INT 03H — 斷點中斷
  • INT 04H — 溢位中斷
  • INT 05H — 螢幕列印(拷屏)中斷

4、軟中斷的處理過程
 軟中斷被響應後,CPU進入中斷響應週期。CPU將中斷型別號乘以4,得到中斷向量表的入口地址,並執行一下動作:

  • (1)將標誌暫存器壓入堆疊。
  • (2)用清中斷標誌(IF)和單步標誌(TF)禁止硬體中斷,即關中斷。
    • 所以當我們自己編制中斷服務程式時,在程式內必要時可以開中斷,即開啟由硬體自動關閉的中斷允許觸發器,使之能夠響應更高階的中斷。
  • (3)將當前程式碼段暫存器的內容(CS)壓棧。
  • (4)將當前指令指標(IP)壓棧。
    • 步驟(3)、(4)的目的是要確保中斷處理完畢之後能夠正確地返回中斷呼叫者。
  • (5)轉向中斷服務程式入口並將控制交給中斷服務程式。

 在中斷服務程式執行完後,即CPU接收到IRET指令時,它又將產生以下步驟:

  • (1)彈出IP:從堆疊中將儲存的指令指標IP由堆疊彈出到IP中。
  • (2)彈出CS:將儲存的段暫存器內容由堆疊彈出到程式碼段暫存器中。
  • (3)恢復標誌暫存器

5、中斷服務程式的編寫
 中斷服務程式可以按各個裝置的要求來加以編制,但一般有:

  • (1)保護現場(入棧)
  • (2)恢復現場(出棧)
  • (3)中斷返回(IRET)
    說明:軟中斷指令非常類似子程式呼叫的CALL指令(即中斷的INT 21H指令),但兩者之間還是有明顯區別的:
  • (1)軟中斷全部都是段間的呼叫,所以在結束時用IRET返回;
  • (2)軟中斷的IRET指令具有自動恢復斷點和標誌的功能。

6、軟中斷的分類
 一般情況下,目前使用的軟中斷可分為三大類:

  • (1)BIOS中斷 — 10H ~ 1FH(16個)
    • 它主要是提供I/O驅動程式使用,提供了應用程式、DOS與裝置的介面功能。使用者可以忽略對具體裝置硬體上的瞭解,直接應用這些功能呼叫完成對具體裝置的控制。
  • (2)DOS中斷 — 20H ~ 3FH(32個)
    • 目前使用了其中的20H ~ 27H和2FH,其餘的為保留中斷。
  • (3)自由中斷 — 40H ~ FFH(192個)
    • 這類中斷是由系統或應用程式設定開發的。可以理解為這類中斷是系統或應用程式為了完成特定的功能而擴展出來的中斷。可以看得出來,系統給自身和應用程式留下了相當大的餘地。這類中斷是不定。

7、軟中斷的訪問
 軟中斷的訪問在不同的環境中有不同的形式,在這裡我們僅僅就組合語言對軟中斷的訪問討論一下。用匯編語言申請一個標準DOS或BIOS中斷是非常簡單的,使用者程式通過規定的暫存器與中斷服務程式之間進行內定的規範的資訊交換。大部分的中斷處理程式都有一個入口和一個出口,在入口處用暫存器傳入規定的資料,在中斷請求完畢之後再通過特定的暫存器傳遞出返回值。

MOV DL,'A'
MOV AH,02H
INT 21H  ;顯示一個字元