安装一个新的int9中断例程,功能:在DOS下,按’A'键后,除非不在松开,如果松开,就显示满屏幕的‘a’,其他的见照常处理
提示:按下一个键时产生的扫描码为通码
松开一个键后产生的扫描码为断码 断码=通码+80h
设置一个无限循环 作为可输入操作的前提
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128(0)
call cpy_new_int9
call sav_old_int9 ;将原来的int 9中断例程的入口地址保存在0:200 0:202中
call set_new_int9 ;设置中断向量表
TESTA: mov ax,1000h
jmp TESTA
mov ax,4c00h
int 21h
;========================================
new_int9: push ax
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,9eh
jne int9Ret
call set_screen_letter
int9Ret: pop ax
iret
;=======================================
set_screen_letter:
push bx
push cx
push dx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov dl,'A'
setScreenLetter:
mov es:[bx],dl
add bx,2
loop setScreenLetter
pop es
pop dx
pop cx
pop bx
ret
new_int9_end: nop
;===========================================
cpy_new_int9:
mov bx,cs
mov ds,bx
mov si,OFFSET new_int9
mov bx,0
mov es,bx
mov di,7e00h
mov cx,OFFSET new_int9_end-OFFSET new_int9
cld
rep movsb
ret
;===========================================
sav_old_int9:
mov bx,0
mov es,bx
cli
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
sti
ret
;==============================================
set_new_int9:
mov bx,0
mov es,bx
cli
mov word ptr es:[9*4],7e00h
mov word ptr es:[9*4+2],0
sti
ret
;================================================
code ends
end start
松开一个键后产生的扫描码为断码 断码=通码+80h