匯編入門(mén)學(xué)習筆記 (十一)—— 內中斷
參考: 《匯編語(yǔ)言》 王爽 第12章
中斷是指CPU在執行完當前指令后收到某種信息(中斷信息),就不在接向下執行,而去對接收到的信息進(jìn)行處理。中斷信息可以來(lái)自CPU內部和外部,分內中斷,外中斷。
1. 內中斷的產(chǎn)生
下面4中情況會(huì )產(chǎn)生內中斷:
(1)除法錯誤。如:div除法溢出
(2)單步執行。如debug中的單步調試
(3)執行into指令。
(4)執行int指令
2. 處理中斷信息
中斷信息中包含8位的中斷類(lèi)型嗎,用來(lái)表示要執行的中斷程序。但是,一個(gè)程序入口要cs和ip,8位不夠。這樣,系統中就有一個(gè)中斷向量表保存中斷程序的cs和ip,8位中斷類(lèi)型嗎表示是中斷向量表中的第幾個(gè)。并且中斷向量表存放在 0000:0000到0000:03ff的1024個(gè)單元中。
3. 中斷過(guò)程
例如:div除法溢出 的中斷類(lèi)型是0,產(chǎn)生div除法溢出后,cpu知道中斷類(lèi)型位0,cpu先保存標志位,cs、ip,設置TF=0、IF=0,然后去到中斷向量表取出對應中斷處理程序的cs和ip(ip=(0*4),cs=(0*4+2)) 然后執行中斷程序。
即:
(1)取得中斷類(lèi)型嗎N
(2)pushf
(3)TF=0,IF=0
(4)push cs
(5)push ip
(6)(ip)=(N*4),(cs)=(N*4+2)
4. 中斷處理程序和iret指令
iret指令相當于:
pop ip
pop cs
pop f
一般中斷處理程序的步驟:
(1)保存到寄存器
(2)處理中斷
(3)恢復到寄存器
(4)iret
5. 寫(xiě)一個(gè)中斷處理程序
0中斷是div除法溢出例如下面程序debug中就會(huì )產(chǎn)生overflow錯誤,在屏幕上顯示“Divide overflow”
- assumecs:code
- codesegment
- start:
- movax,1000H
- movbl,1
- divbl
- codeends
- endstart
下面就修改0中斷的中斷程序,讓產(chǎn)生div除法溢出時(shí),在屏幕上顯示“Welcome to masm!”
- assumecs:code
- codesegment
- start:
- movax,cs
- movds,ax
- movsi,offsetdo0
- movax,0
- moves,ax
- movdi,200h
- movcx,offsetdo0end-offsetdo0;計算寫(xiě)入大小
- cld
- repmovsb;把do0~do0end的代碼寫(xiě)到0:200開(kāi)始的內存空間中去
- movax,0
- moves,ax
- movwordptres:[0*4],200h;改變0中斷的中斷向量表,是0中斷指向我們要的中斷處理程序的位置
- movwordptres:[0*4+2],0
- movax,4c00h
- int21h
- do0:
- jmpshortdo0start
- dbWelcometomasm!;保存要顯示的信息
- do0start:
- movax,cs
- movds,ax
- movsi,202h;設置要顯示信息在代碼中的位置
- movax,0b800h
- moves,ax
- movdi,12*160+36*2;顯示的位置
- movcx,16
- s:
- moval,[si]
- moves:[di],al
- incsi
- adddi,1
- moval,02h;顯示的顏色等信息
- moves:[di],al
- adddi,1
- loops
- movax,4c00h
- int21h
- do0end:
- nop
- codeends
- endstart
先運行上面代碼生成的程序,把中斷程序拷貝到安全的內存中,改變中斷向量表。然后debug會(huì )發(fā)生div除法溢出的程序,就會(huì )看到屏幕中間顯示綠色 的“Welcome to masm!”。
6. 單步中斷
CPU每執行完一條指令后,如果檢測到標志寄存器的TF為1,則會(huì )產(chǎn)生單步中斷,引發(fā)中斷過(guò)程。單步中斷的中斷類(lèi)型嗎位1。
過(guò)程:
(1)取得中斷類(lèi)型嗎1。
(2)標志寄存器入棧,TF,IF設置為0
(3)CS,IP入棧
(4)(IP)=(1*4),(CS)=(1*4+2)
7. 響應中斷的特殊情況
一般情況,如果CPU檢測到中斷信息,就會(huì )響應中斷。但有特殊情況。
當在執行完向ss寄存器傳送的指令后,如果發(fā)現中斷,CPU不會(huì )響應。因為如果ss改變,sp沒(méi)有改變,ss:sp就不是指向正確的棧頂了。
所以改變ss于改變sp的命令要寫(xiě)在一起
如:
- movax,1000h
- movss,ax
- movsp,0
評論