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

2022-05-30 13:21:11 字數 3001 閱讀 6775

題目:編寫0號中斷處理程式,在除法溢位時,在螢幕中間顯示字串「hacker by admin!」

之前先補充乙個rep movsb的指令知識

movsb和movsw是相反的,都是根據標誌暫存器df的值選擇正向傳遞還是反向傳遞。

這兩個指令都是把ds:si中的值傳遞到es:di的位置中去

如果df=0時,取正向移動。(inc si和di)

如果df=1時,取反向移動。(dec si和di)

由上可知,只需要改變si和di的值就可以選擇正向還是反向

cld 指令 :使df=0;std 指令 :使df=1.

注:使用movsb或movsw時  正確時候操作是:rep movsb

下面開始正式程式設計

assume cs:

code

data segment

db '

hacker by admin!

'data ends

code segment

start:

movax,cs

movds,ax

movsi,offset do

mov ax,0

moves,ax

movdi,200h

movcx,offset doend - offset do ;獲取中斷程式的長度,好進行複製

cldrep

movsb

mov word ptr es:[0

],200h

mov word ptr es:[2

],0h

mov dx,0ffffh

mov bx,1

div bx ;測試除法溢位的**

movax,4c00h

int21h

do:mov

ax,data

movds,ax

movsi,0h

movax,0b800h

moves,ax

mov di,0

mov cx,16

s:mov ah,2 ;綠色字型

mov al,ds:

[si]

moves:

[di],ax

incsi

incdi

incdi

loop s

movax,4c00h

int21h

doend:

nopcode ends

end start

上述**寫完後,可以執行看看

可以說是成功編寫完畢了。

但這裡其實還有個小毛病不知道各位有沒有發現

我的data段資料是放在do子程式的外面!!!

懂8086機制的同學們就知道,每一次程式開啟,所分配的空間都是系統自己給我們的,也就是說

在程式執行期間,data段的資料是存在的。

一旦程式退出了,原本存放在記憶體中的data資料就立馬會被其他的程式資料覆蓋掉!!

經更改後**如下:

assume cs:

code

code segment

start:

movax,cs

movds,ax

movsi,offset do

mov ax,0

moves,ax

movdi,200h

movcx,offset doend - offset do

cldrep

movsb

mov word ptr es:[0

],200h

mov word ptr es:[2

],0h

;mov dx,0ffffh

;mov bx,1

;div bx

movax,4c00h

int21h

do:jmp

short dostart

db '

hacker by admin!

' ;我們將data中的資料放帶do子程式裡來

dostart:

mov ax,0

movds,ax

movsi,202h

movax,0b800h

moves,ax

mov di,160*8+80 ;取螢幕中間部分

mov cx,16

s:mov ah,2

mov al,ds:

[si]

moves:

[di],ax

incsi

incdi

incdi

loop s

movax,4c00h

int21h

doend:

nopcode ends

end start

將data中的資料放在子程式裡來,可以看到,在資料的前面有乙個jmp指令

用來跳轉到我們真正的中斷程式中!

在8086彙編中  jmp指令占用2個位元組空間,所以我們的si將會在202h處開始複製資料到顯示屏中

下圖是我安裝好程式,再去用debug檢視0:0200記憶體區域 **還是在那裡【因為其他合法的程式一般都不會使用 0:200~0:2ff( 0:200h~0:2ffh)的 256個位元組的空間】

接下來用debug的a指令讓程式手動溢位試試

所以說,只要執行一遍這個程式,在之後無論什麼時候出現除法溢位都會成功顯示該字串。

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

編寫0號中斷處理程式,使得在除法溢位時,在螢幕中間顯示字串 divide error 然後返回dos。前面講到,記憶體0000 0000 0000 03ff,大小為1kb的空間是系統存放中斷處理程式入口位址的中斷向量表。8086支援256個中斷,但是,實際上,系統要處理的中斷事件遠沒有達到256個,...

8086中斷知識以及編寫0號中斷處理程式

int n指令的格式為 int n,n為中斷型別碼 cpu執行int中斷,實際上就相當於引發乙個n號中斷的中斷過程,他的大致執行過程如下 取中斷型別n 標誌暫存器入棧,置if 0,tf 0 為什麼要這一步,後面有解釋 這一步可以模擬為 pushf 標誌暫存器入棧 下面的步驟完成置if和tf push...

8086彙編0號中斷處理程式

1.中斷的基本概念 中斷是指在計算機執行期間,cpu收到某個訊號 來自軟體或硬體 暫時儲存正在執行的程式的上下文,轉而去執行相應的中斷處理程式.2.8086cpu內部有內部有下面的情況發生時,將產生相應的中斷資訊.3.中斷向量表 cpu用8位的中斷碼通過中斷向量表找到相應的中斷處理程式的入口位址,簡...