在彙編裏,內中斷有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