《組合語言》第十二章 內中斷

雫#1999發表於2020-10-06

任何一個通用的CPU,都可以在執行完當前正在執行的指令之後,檢測到從CPU外部傳送過來或內部產生的一種特殊資訊,並可以立刻對接收到的資訊進行處理,這種特殊的指令,我們將其稱為 中斷資訊,中斷資訊可以來自CPU內部和外部,本章主要討論來自CPU內部的中斷資訊

中斷資訊要求CPU馬上進行某種處理,並向所要進行的該種處理提供了必備引數的通知資訊

中斷的意思指,CPU不再接著剛執行完的指令向下執行,而是轉去處理這個特殊資訊

12.1 內中斷的產生

CPU內部有如下情況發生時,將會產生相應的中斷資訊:
1,除法錯誤,如執行div指令時產生的除法溢位
2,單步執行
3,執行into指令
4,執行int指令

CPU需要直到所接收到的中斷資訊的來源,所以中斷資訊中必須包含識別來源的原始碼,8086CPU用稱為中斷型別碼的資料來標識中斷資訊的來源,中斷型別碼為一個位元組資料,可以表示256種中斷資訊的來源

將中斷資訊的來源,簡稱為中斷源,上述的4種中斷源,在8086CPU種中斷型別碼如下:
1,除法錯誤:0
2,單步執行:1
3,執行into指令:4
4,執行int指令:該指令的格式為int n,指令種的n為位元組型立即數,是提供給CPU的中斷型別碼

12.2 中斷處理程式

CPU收到中斷資訊後,需要對中斷資訊進行處理,對中斷資訊如何處理,可以由我們程式設計,用來處理中斷資訊的程式稱為 中斷處理程式,需要對不同的中斷資訊編寫不同的處理程式

CPU在收到中斷資訊後,應該轉去執行該中斷資訊的處理程式,8086CPU若要執行某處的程式,就需要將CS:IP指向它的入口,CPU的設計者必須在中斷資訊和其處理程式的入口地址之間建立某種聯絡,使得CPU可以根據中斷資訊找到要執行的處理程式

中斷資訊種包含有標識中斷源的型別碼,中斷型別碼的作用就是用來定位中斷處理程式,如CPU根據中斷型別碼4,就明白需要找到4號中斷的處理程式

但要定位中斷處理程式,需要知道它的段地址和偏移地址

12.3 中斷向量表

CPU用8位的中斷型別碼通過中斷向量表找到相應的中斷處理程式的入口地址,中斷向量表就是中斷處理程式入口地址的列表

在這裡插入圖片描述
中斷向量表在記憶體中儲存,其中存放著256箇中斷源所對應的中斷處理程式的入口,CPU只要知道了中斷型別碼,就可以將中斷型別碼作為中斷向量表的表項號,定位相應的表項,從而得到中斷處理程式的入口地址

中斷向量表在記憶體中存放,對於8086PC機,中斷向量表指定放在記憶體地址0處,從記憶體0000:0000~0000:03EF的1024個單元中存放著中斷向量表,一個表項存放一箇中斷向量,即一箇中斷處理程式的入口地址,這個入口地址包括 段地址和偏移地址,所以一個表項佔2個字,高地址字存放段地址,低地址字存放偏移地址

12.4 中斷過程

可以使用中斷型別碼,在中斷向量表中找到中斷處理程式的入口,這個入口地址的最終目的是設定CS和IP,使CPU執行中斷處理程式,這個工作是由CPU的硬體自動完成的。CPU硬體完成這個工作的過程被稱為中斷過程

CPU在執行完中斷處理程式後,應該返回原來的執行點繼續執行下面的指令,所以在中斷過程中,在設定CS:IP之前,還要將CS和IP的值儲存起來

8086CPU在收到中斷資訊後,所引發的中斷過程:
1,從中斷資訊中取得中斷型別碼
2,標誌暫存器的值入棧(因為中斷過程中要改變標誌暫存器的值,所以要將其儲存在棧中)
3,設定標誌暫存器的第8位TF和第9位IF的值為0
4,CS的內容入棧
5,IP的內容入棧
6,從記憶體地址為 中斷型別碼乘4 和 中斷型別碼乘4 + 2的兩個字單元中讀取中斷處理程式的入口地址設定IP和CS

在最後一步完成後,CPU開始執行由程式設計師編寫的中斷處理程式

12.5 中斷處理程式和 iret 指令

由於CPU隨時都可能檢測到中斷資訊,也就是說,CPU隨時都可能執行中斷處理程式,所以中斷處理程式必須一直儲存在記憶體的某段空間內,而中斷處理程式的入口地址,即中斷向量,必須儲存在對應的中斷向量表中

中斷處理程式的編寫方法步驟:
1,儲存用到的暫存器
2,處理中斷
3,恢復用到的暫存器
4,用 iret 指令返回

iret指令的功能用匯編描述為:

pop IP
pop CS
popf

iret通常和硬體自動完成的中斷過程配合使用,在中斷過程中,暫存器入棧的順序是標誌暫存器,CS,IP,而iret的出棧順序是IP,CS,標誌暫存器,剛好和其相對應,實現了用執行中斷處理程式前的CPU現場恢復標誌暫存器CS,IP的工作,iret指令執行後,CPU回到執行中斷處理程式前的執行點繼續執行程式

12.6 除法錯誤中斷的處理

當CPU執行div等除法指令時,如果發生了除法溢位的錯誤,將產生中斷型別碼為0的中斷資訊,CPU將檢測到這個資訊,然後引發中斷過程,轉去執行0號中斷所對應的中斷處理程式

mov ax,1000h
mov bh,1
div bh

當使用debug除錯上面的程式時,執行到 div bh時,發生了除法溢位錯誤,從而引發中斷過程,CPU執行0號中斷處理程式,系統中0號中斷處理程式的功能:提示你的程式出現了一個除法溢位錯誤
在這裡插入圖片描述

12.7 程式設計處理0號中斷

當理解中斷過程後,嘗試重新編寫一個0號中斷處理程式,它的功能是在螢幕中間顯示 overflow ,然後返回到作業系統

分析:
1,當發生除法溢位時,產生0號中斷資訊,從而引發中斷過程,CPU將執行以下工作:
(1),取得中斷型別碼 0
(2),標誌暫存器入棧,TF,IF設定為0
(3),CS,IP入棧
(4),(IP)=(0乘4),(CS)=(0乘4 + 2)

2,當中斷0發生時,CPU轉去執行中斷處理程式,將這段程式稱為do0:
(1),相關處理
(2),向顯示緩衝區送入字串 overflow
(3),返回DOS

3,do0因該放在記憶體中,因為除法溢位隨時都可能發生,CPU隨時都可能將CS:IP指向do0的入口,執行程式

找到一塊別的程式不會用到的記憶體區,將do0傳送到裡面即可,中斷向量表是PC系統中最重要的記憶體區,只用來存放中斷處理程式的入口地址,DOS系統和其它應用程式都不會隨便使用這段空間,從0000:0200至0000:02EF的256個位元組的空間所對應的中斷向量表都是空的

所以將do0的段地址0存放在0000:0002字單元中,將偏移地址200H存放在0000:0000字單元中

通過分析,需要做到:
1,編寫可以顯示overflow的中斷處理程式 do0
2,將do0送入記憶體0000:0200處
3,將do0的入口地址0000:0200儲存在中斷向量表0號表項中

12.8 安裝

可以使用movsb指令,將do0的程式碼送入0:200處

在這裡插入圖片描述

12.9 do0

對於字串 overflow,也要將其放入一段不會被覆蓋的空間中,如果只是申請空間存放overflow,程式一次執行完後,它所佔用的記憶體空間會被釋放,其中存放的overflow也可能被別的資訊所覆蓋

assume cs:code

code segment
start:	mov ax,cs
		mov ds,ax
		mov si,offset do0
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset do0end - offest do0
		cld
		rep movsb
		
		設定中斷向量表
		
		mov ax,4c00h
		int 21h
		
	do0:jmp short do0start
		db "overflow"
		
do0start:	mov ax,cs
			mov ds,ax
			mov si,202h ;設定ds:si指向字串
			
			mov ax,0b800h
			mov es,ax
			mov di,12*160+36*2 ;設定es:di指向視訊記憶體空間的中間位置
			
			mov cx,9 ;設定cx為字串長度
			
		s:	mov al,[si]
			mov es:[di],al
			inc si
			add di,2
			loop s
			
			mov ax,4c00h
			int 21h

do0end:nop

code ends
end start
		

12.10 設定中斷向量

將do0的入口地址0:200,寫入中斷向量表的0號表項中,使do0成為0號中斷的中斷處理程式

0號表項的地址為0:0,其中0:0字單元存放偏移地址,0:2字單元存放段地址

mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0

12.11 單步中斷

CPU在執行完一條指令之後,如果檢測到標誌暫存器的TF位為1,則產生單步中斷,引發中斷過程

單步中斷的中斷型別碼為1,它的中斷過程如下:
1,取得中斷型別碼1
2,標誌暫存器入棧,TF,IF設定為0
3,CS,IP入棧
4,(IP) = (1乘4) (CS) = (1乘4 + 2)

CPU只要一加電,就會從預設的地址開始一直執行下去,如果CPU不提供其它功能,就不可能有任何程式控制它在執行完一條指令後,去做別的事,但在使用debug時,debug可以控制CPU執行被載入程式中的一條指令,然後讓它停下來,顯示暫存器的狀態

debug提供了單步中斷的中斷處理程式,功能為顯示所有暫存器中的內容後等待輸入命令,然後,使用t命令執行指令時,debug將TF設定為1,使得CPU工作於單步中斷方式下,則在CPU執行完這條指令後就引發單步中斷,執行單步中斷的中斷處理程式,所有暫存器中的內容被顯示在螢幕上,並等待輸入命令

CPU提供單步中斷功能的原因是,為單步跟蹤程式的執行過程,提供了實現機制

12.12 響應中斷的特殊情況

一般情況下,CPU在執行完當前指令後,如果檢測到中斷資訊,就響應中斷,引發中斷過程,可有些情況下,CPU在執行完當前指令後,即便發生中斷,也不會響應

如:
在執行完向ss暫存器傳送資料的指令後,即便是發生中斷,CPU也不會響應,這樣的主要原因是,ss:sp聯合指向棧頂,而對它們的設定應該連續完成,如果在執行完設定ss的指令後,CPU響應中斷,引發中斷過程,要在棧中壓入標誌暫存器,CS和IP的值。ss改變,但sp未改變,ss:sp指向的不是正確的棧頂,將引起錯誤,所以CPU在執行完設定ss的指令後,不響應中斷

相關文章