1.中斷的基本概念
中斷是指在計算機執行期間,cpu收到某個訊號(來自軟體或硬體),暫時儲存正在執行的程式的上下文,轉而去執行相應的中斷處理程式.
2.8086cpu內部有內部有下面的情況發生時,將產生相應的中斷資訊.
3.中斷向量表
cpu用8位的中斷碼通過中斷向量表找到相應的中斷處理程式的入口位址,簡單的來說,就是乙個中斷碼和中斷處理程式入口位址的對映表:
中斷碼中斷處理程式的入口位址
00號中斷處理程式的位址
11號中斷處理程式的位址
……..
中斷向量表在記憶體中存放,記憶體0000:0000到0000:03ff的1024個單元中存放中斷向量表.(8086規定).對於8086乙個表項佔32位,低16位表示的是偏移位址,高16位表示段位址.
比如說,產生中斷3,8086就會在上圖的記憶體區域的0000:0009~0000:000a處取得3號中斷處理程式的偏移位址是0008,000a:000b處取段位址為0070,計算的得到中斷程式的入口位址為0070:0008=00708h,cpu就會去執行00708處的指令,當然,我們要編寫自己的中斷處理程式,就需要把自己的中斷處理程式放在記憶體的某個地方,然後修改中斷向量表,當發生相應的中斷時,就會執行使用者自己的中斷處理程式;
中斷處理程式存在哪片記憶體空間
前面講到記憶體0000:0000-0000:03ff,大小為1kb的空間是8086系統用來存放中斷向量表的地方,8086支援256個中斷,但是,實際上,系統中要處理的中斷遠沒有256個,所以,在中斷向量表中,很多單元是空的。
中斷向量表是pc系統中最重要的記憶體區,只用來存放中斷處理程式的入口位址,dos系統和其它應用不會使用,因此,我們可以用其空閒的記憶體區域存放我們的程式,一般從0000:0200至0000:02ff這256個位元組是空的,作業系統和應用都不會占用.
例子:
0號中斷處理程式:
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax ;源程式的段位址,
mov si,offset do0 ;將中斷處理程式的入口的偏移位址存在si中
mov ax,0
mov es,ax ;目的位置的段位址放在es中
mov di,200h ;目的位置的偏移位址0000:0200處
mov cx,offset do0end-offset do0 ;計算要把多少個位元組拷貝.
cld ; 將df置為0,
rep movsb ;rep movsb 指定把**段do0-do0end這段**拷貝到0000:0200-0000:0200+(do0end-do0)
mov word ptr es:[0*4],200h ;修改偏移位址
mov word ptr es:[0*4+2],0
;段位址
mov ax,4c00h
int 21h
do0:
jmp short do0start ;佔兩個位元組
db "divide error!"
do0start:
mov ax,cs;中斷後cs=0,ip=200h
mov ds,ax
mov si,202h ; 指向db的首位址
mov ax,0b800h
mov es,ax
mov di,12*160+33*2
mov cx,13
s:mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],2h
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end:
nopcode ends
end start
導致中斷函式:
assume cs:code
code segment
start:
mov ax,1000h
mov bh,1
div bh ;產生0號中斷
code ends
endstart
在dosbox中先執行中斷處理程式,相當於把中斷處理函式放到記憶體中,並更新中斷向量表.
中斷觸發函式
assume cs:code
code segment
start:
mov ax,1000h
mov bh,1
div bh
code ends
endstart
執行此程式會觸發0號中斷,執行上面的do0-do0end之間的程式,在終端中間顯示」divide error!」;
執行結果如下:
彙編0號中斷程式模擬
中斷是指cpu停止當前指令,轉而去執行其他指令或 的一種機制,其中中斷的資訊被儲存在中斷向量表中。80x86中斷向量 i o addr int type 16進製制 function 00 03 0 除法溢位中斷 04 07 1 單步 用於debug 08 0b 2 非遮蔽中斷 nmi 0c 0f ...
8086中斷知識以及編寫0號中斷處理程式
int n指令的格式為 int n,n為中斷型別碼 cpu執行int中斷,實際上就相當於引發乙個n號中斷的中斷過程,他的大致執行過程如下 取中斷型別n 標誌暫存器入棧,置if 0,tf 0 為什麼要這一步,後面有解釋 這一步可以模擬為 pushf 標誌暫存器入棧 下面的步驟完成置if和tf push...
王爽彙編 實驗12編寫0號中斷處理程式
assume cs codesg codesg segment start mov ax,cs mov ds,ax 程式段位址 mov si,offset div s mov ax,0 mov es,ax mov di,0200h 保持中斷處理程式的記憶體位址 mov cx,offset div o...