;安裝一個新的int9中斷例程,功能:在dos下,按下‘A’鍵後,除非不在鬆開,
;如果松開,就顯示滿屏幕的‘A’,其他鍵照常處理(鬆開一個鍵的掃描碼稱爲斷碼)
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,128
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9 ;將新的int9中斷例程安裝在0:204處
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ;將原來的int9中斷在中斷向量表中的地址保存到es:[200],es:[202]
cli ;置IF=0,不響應可屏蔽中斷
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0 ;將新的int9的程序首地址0:204放到中斷向量表中
sti ;置IF=1,CPU在執行完當前指令後響應中斷
mov ax,4c00h
int 21h
int9:push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h] ;當此中斷執行時(cs)=0
cmp ax,9eh ;'A'鍵的掃描碼
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s: mov byte ptr es:[bx],'A'
mov byte ptr es:[bx+1],02h
add bx,2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
;名稱:延時程序
delay:push cx
mov cx,10ffh
s1:push cx
mov cx,10ffh
s2:nop
loop s2
pop cx
loop s1
pop cx
ret
code ends
end start
上述程序結束後,沒有恢復系統int9在中斷向量表中的地址,用以下程序來恢復其值:
;1 編寫一個程序實現如下功能
; 將從物理地址200h開始處的4個字節複製到9*4物理地址處。
;注:此程序是9號中斷處理程序入口地址修正程序。
;若新的9號中斷處理程序不在200h處,則該程序要做相應更改。(原來的int9中斷向量地址保存在200h處)
assume cs:code
code segment
start:mov ax,0
mov es,ax
mov ax,es:[200h]
mov es:[9*4],ax
mov ax,es:[202h]
mov es:[9*4+2],ax
mov ah,4ch
int 21h
code ends
end start