我写的程序如下(程序没问题):
;介绍:安装一个新的int 9中段例程,功能:在DOS下,按下“A”键后,除非不再松开,
;如果松开,就显示满屏幕的“A”;其他的键照常处理
assume cs:daima
daima segment
kaishi:
;------------------------------安装中断例程----------
mov ax,cs
mov ds,ax
mov si,offset int9
mov ax,0
mov es,ax
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb
;---------------------------------------------------
;----------------------------保存原int 9的中断向量表------
mov ax,es:[4*9]
mov es:[200h],ax
mov ax,es:[4*9+2] ;保存在0:200h ——204h处
mov es:[202h],ax
;--------------------------------------------------
;-------------------设置新的int 9中断向量表----------
cli
mov word ptr es:[4*9],204h
mov word ptr es:[4*9+2],0
sti
;---------------------------------------------------
mov ax,4c00h
int 21h
int9:
push ax
push bx
push cx
push es
in al,60h ;得到键盘端口的输入
pushf
call dword ptr cs:[200h] ;调用原来的int 9例程 (这步有什么用,可以省略吗?)
cmp al,9eh ;是否为A的断码
jne int9ret
mov bx,0b800h
mov es,bx
mov di,0
mov cx,25*80
s:
mov byte ptr es:[di],'A' ;显示满屏幕的'A'
add di,2
loop s
int9ret:
pop es
pop cx
pop bx ;返回
pop ax
iret
int9end:nop
daima ends
end kaishi
这个程序运行正常,我的问题是:既然安装新的int9中断例程,又何必在运行新的中断例程的过程中又调用原来的int 9的中断例程,我试过了,少了这步确实不行,但这是为什么呢?不用这步操作程序看起来也没什么不完整的呀。请高手指点迷津。
in al,60h不是已经得到键盘的扫描码吗?这不是输入了吗?还要原来的int 9才能算输入? 我还没学接口技术?有高手能形象的解释一下好吗?