本实验的难点在于 按下A后除非不再松开A键,如果松开就显示满屏的A,其他键超长处理
话句话说就是当扫描码为A键松开是的扫描码时 就在屏幕上打印A ,A键的扫描码为1E,A键松开时的扫描码为9E
我在在本程序中使用了空循环来测试本中例程
assume cs:codesg
codesg segment
start:
mov ax,cs
mov ds,ax
mov si,offset int9
mov ax,0
mov es,ax
mov di,204h ;设置目的地址 0:204h
mov cx,offset int9End - offset int9
cld ;设置DF=0正向传送字符串 cli -> IF=0
rep movsb ;将新的int9中断例程安装到0:204h处
mov ax,es:[9*4] ;87 E9 00 F0
mov es:[200h],ax ;保存原9号中断例程的入口地址IP 注意是200h
mov ax,es:[9*4+2]
mov es:[202h],ax
cli ;禁止中断发生 IF=0
mov word ptr es:[9*4],204h ;设置新的中断向量IP
mov word ptr es:[9*4+2],0 ;设置新的中断向量CS
sti ;允许中断发生
mov ax,0ffffh ;用空循环来测试新的中断例程
mov dx,0ffffh
s1: sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
;--------------------------------------------恢复原来的9号中断例程-------------------------------------------------
cli ;恢复过程禁止发生中断 IF=0
mov ax,es:[200h]
mov es:[9*4],ax
mov ax,es:[202h]
mov es:[9*4+2],ax
sti
;--------------------------------------------恢复原来的9号中断例程-------------------------------------------------
mov ax,4c00h
int 21h
int9: push ax
push cx
push es
push si
in al,60h ;读取键盘的扫面码
pushf ;标志寄存器入栈
call dword ptr es:[200h] ;调用原来的9号中断例程处理键盘输入
cmp al,9Eh ;其实只需要判断是否为A键松开时的扫描码即可
jne int9ret
mov cx,25*160
mov ax,0b800h
mov es,ax
mov si,0
s: mov byte ptr es:[si],'A'
add si,2
loop s
int9ret: pop si
pop es
pop cx
pop ax
iret
int9End: nop
codesg ends
end start