實驗12 編寫0號中斷的處理程式

2021-09-27 08:34:56 字數 1954 閱讀 3015

編寫0號中斷處理程式,使得在除法溢位時,在螢幕中間顯示字串'divide error!',然後返回dos。

前面講到,記憶體0000:0000~0000:03ff,大小為1kb的空間是系統存放中斷處理程式入口位址的中斷向量表。8086支援256個中斷,但是,實際上,系統要處理的中斷事件遠沒有達到256個,所以在向量列表中,有許多單元是空的。

中斷向量表睡覺哦pc系統中最重要的記憶體區,只用來存放中斷處理程式的入口位址,dos系統和其他應用程式都不會隨便使用這段空間。可以利用中斷向量表中的空閒單元來存放我們的程式,一般情況下,從0000:0200~0000:02ff的256個位元組的空間所對應的中斷向列表項都是空的,作業系統和其他應用都不會占用。

根據本章內容的學習編寫不難編寫該實驗,按照文中所述我們編寫乙個do0程式作為0號中斷的中斷處理程式,即我們需要將中斷處理程式do0放到000:0200後。若要是的除法溢位的時候,cpu轉去執行do0,則必須將do0的入口位址,及0000:02;;登記在中斷向量表的對應表項中,因為除法溢位對應的中斷型別碼為0,他的中斷處理程式的入口位址應該從0*4地質單元開始存放,段位址存放在0*4+2字單元中,偏移位址存放在0*4字單元中,也就說要將do0的段位址0存放在0000:0002字單元中,將偏移位址200h存放在0000:0000字單元中,總結以上分析,需要做以下幾件事情

(1)編寫可以顯示divide error!的中斷處理程式:do0;

(2)將do0送入記憶體0000:0200處;

程式原始碼如下:

assume cs:code

code segment

begin:mov ax, cs

mov ds, ax

mov si, offset do0

mov ax, 0

mov es, ax

mov di, 200h

;將中斷處理程式送入0:200位址處

mov cx, offset do0end - offset do0

cldrep movsb

;設定中斷向量表

mov ax, 0

mov es, ax

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

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

;測試程式

mov ax, 1000h

mov bh, 1

div bh

mov ax, 4c00h

int 21h

;顯示中斷處理overflow

do0:jmp short do0start

db "divide error!"

do0start:mov ax, cs

mov ds, ax

mov si, 202h

mov ax, 0b800h

mov es, ax

mov di, 12*160+72

mov cx, 13

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 begin

程式未執行前0000:0200-0000:02ff處的內容為

執行後,結果顯示為

記憶體0000:0200~0000:02ff處存放了我們編寫的0號中斷的中斷處理程式,如下圖

王爽彙編 實驗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...

實戰程式設計 編寫0號中斷處理程式

題目 編寫0號中斷處理程式,在除法溢位時,在螢幕中間顯示字串 hacker by admin 之前先補充乙個rep movsb的指令知識 movsb和movsw是相反的,都是根據標誌暫存器df的值選擇正向傳遞還是反向傳遞。這兩個指令都是把ds si中的值傳遞到es di的位置中去 如果df 0時,取...

王爽《組合語言》實驗12 編寫0號中斷的處理程式

assume cs code code segment start 將do0程式 複製至0 200處 mov ax,cs mov ds,ax mov si,offset do0 mov ax,0 mov es,ax mov di,200h mov cx,offset do0end offset do...