題目:編寫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:將data中的資料放在子程式裡來,可以看到,在資料的前面有乙個jmp指令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
用來跳轉到我們真正的中斷程式中!
在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位的中斷碼通過中斷向量表找到相應的中斷處理程式的入口位址,簡...