安裝新的int 9中斷例程(按'A'鍵後顯示滿螢幕的'A')
;任務:安裝一個新的int 9中斷例程
;功能:在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 ;設定ds:si指向源位址
mov di,204h ;設定es:di指向目标位址
mov cx,offset int9end-offset int9 ;設定cx為傳輸長度
cld ;設定傳輸方向為正
rep movsb
;将原來的int 9中斷例程的入口位址儲存在ds:200、ds:202單元中
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
;在中斷向量表中設定新的int 9中斷例程的入口位址
cli ;設定IF=0屏蔽中斷
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti ;設定IF=1不屏蔽中斷
;結束
mov ax,4c00h
int 21h
;新的int 9中斷例程
int9: push ax
push bx
push cx
push es
in al,60h ;從端口60h讀出鍵盤輸入
;對int指令進行模拟,調用原來的int 9中斷例程
pushf ;标志寄存器入棧
call dword ptr cs:[200h] ;CS,IP入棧,(IP)=cs:[200h],(CS)=0
;如果是A斷碼,改變目前螢幕的顯示字元
cmp al,9eh ;和A的斷碼(1eh+80h)比較
jne int9ret ;不等于A時轉移
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s: mov byte ptr es:[bx],41h ;将A的ASCII碼寫入,改變字元
add bx,2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start