彙編語言-內中斷

在彙編裏,內中斷有4種:除法錯誤、單步執行...oop

CPU處理內中斷的思路和子程序差很少,首先也要知道中斷後再處理什麼程序,這個會根據一個8位的中斷類型碼來決定。經過中斷類型碼去查找一箇中斷向量表,這個向量表裏會存儲對應要執行程序的段地址和偏移地址。這個中斷向量表在8086裏默認放在內存0000:0000-0000:03FF的1024個字節中。spa

中斷過程以下:code

(1)取得中斷類型碼Nblog

(2)pushf //將標誌寄存器入棧ip

(3)TF = 0,IF = 0內存

(4)push CSclass

(5)push IP原理

(6)(IP) = (N*4),(CS) = (N*4+2)循環

1)除法錯誤程序

中斷類型碼爲0.

若是想要修改發生除法錯誤的程序,也就是新寫一個執行程序,並修改向量表對應的地址。

爲了應對隨時可能出現的除法錯誤,須要將執行程序保留在內存中。因爲內存0000:0200-0000:02FF的256個字節通常空着,能夠把執行程序複製到這裏。

因此要作的是:將寫好的執行程序複製到內存0000:0200後面的一段空間,參考代碼以下。

要注意的幾個地方是:

(1)將某位置的一段代碼複製到另外一位置,其實仍是一個字節一個字節的搬。彙編裏提供了一個串傳送指令movsb/movsw,能夠實現自動字節/字複製(結合標誌寄存器裏的DF標誌),要實現多字節/字複製,就要用到loop,但彙編裏還提供了一個rep指令,結合二者就能夠很方便地實現代碼複製了。

這裏再仔細介紹下rep movsb的工做原理:

movsb至關於:

mov es:[di],cs:[si]

if df == 0: di++,si++

else di--,si--

因此使用movsb前要先設置好df,彙編語言裏cld就是令df=0,std就是令df=1(至關於逆向傳送)

rep movsb就至關於寫了個loop,仍是須要設置cx。

(2)好比想在執行代碼裏輸出一段字符,那這段字符應該存在哪裏呢,若是按照之前那樣直接定義一個data segment,隨着程序的運行,原先的data segment很容易被覆蓋,所以最好將其存在執行代碼中。

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 - offset do0 cld rep movsb mov ax,0 mov es,ax mov word ptr es:[0*4],200h mov word ptr es:[0*4+2],0 mov ax,1000 mov bh,1 div bh mov ax,4c00h int 21h do0: jmp short do0start db "overflow!" do0start:mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,12*160+36*2 mov cx,9 s: mov al,[si] mov es:[di],al mov byte ptr es:[di+1],0CAh inc si add di,2 loop s mov ax,4c00h int 21h do0end: nop code ends end start

2)單步執行

中斷類型碼爲1.

若是檢測到TF爲1,則執行。這就是爲何執行中斷時須要將TF置0,不然進入中斷後檢測到TF爲1又要進行中斷,無限循環...

3)int指令

int n就表示進行中斷類型碼爲n的中斷。

int和call相似,都是要求去執行另外一段程序,對應的,call和ret組隊,int和iret組隊。

也就是說在子程序的結束處也須要加iret,其至關於執行

pop ip

pop CS

popf

舉個栗子:用7ch中斷例程完成loop指令的功能。

先給出應用場景:在屏幕中間顯示80個'!'。

從下面的程序可看出,這裏執行int 7ch後至關於將ip=s的偏移地址(if cx > 0)。可是在執行int 7ch時ip=se的偏移地址,所以其子程序至關於將ip += bx,這裏的bx就是se到s的位移。

assume cs:code
code segment
start:    mov ax,0b800h mov es,ax mov di,160*12 mov bx,offset s - offset se mov cx,80 s: mov byte ptr es:[di],'!' add di,2 int 7ch se: nop mov ax,4c00h int 21h code ends end start

因此給出安裝程序以下:

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 - offset do0 cld rep movsb mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 mov ax,4c00h int 21h do0: push bp mov bp,sp dec cx jcxz do1 add [bp+2],bx do1: pop bp iret do0end: nop code ends end start
相關文章
相關標籤/搜索