;INT 9子程序
;=====================================
the9:
push ax
push es
mov ax,0b800h
mov es,ax
pushf ;标志寄存器压栈
pushf
pop ax
and ah,11111100b
push ax
popf ;IF,TF清零
call dword ptr ds:[0] ;调用原int9中断
in al,60h
cmp al,1
jne exit
inc byte ptr es:[160*12+40*2+1]
exit: pop es
pop ax
iret
codesg ends
end start
;===============================================
我的理解:
系统在程序运行中遇到键盘按下或松开后
1.键盘产生扫描码;
2.扫描码送入60h端口;
3.引发9号中断;
4.到中断向量表中找到9号中断的向量的位置(在我的程序中已经将9号中断位置下的IP,CS设置到了我的INT9和当前的CS),跳转到我的9号中断子程序(==JMP DWORD PTR )
;===================================================
如果在程序中,我按下了'A'
1.键盘产生扫描码;
2.扫描码送入60H端口;
3.引发9号中断,(PUSHF,IF=0,TF=0,PUSH CS,PUSH IP);
4.JMP到我在0:9*4中置的IP和0:9*4+2中置的CS(也就是我的INT9子程的地址);
5.PUSHF;
6.CALL 原来INT9中断的IP,CS(我保存在DS:[0]的位置)==PUSH CS,PUSH IP,JMP DWORD PTR DS:[0];
7.原INT9中的IRET返回;
8.读60H端口,判断,运行自己的东西
9.再用IRET返回在0:9*4处的中断在我程序中保存的位置.
=====================================================
以上理解不知道是否正解,请指教 |