注册 登录
编程论坛 汇编论坛

[求助]键盘中断后原程序无法读出键盘码的问题

luohua2007 发布于 2007-07-13 22:39, 874 次点击

最近学汇编,我把键盘中断最前面几个指令改成 了一个jmp指令跳到了自己的一段程序,然后在自己的这段程序中in al ,60h读出了键盘接口中的扫描码.接着再跳回到键盘中断去(之前执行了被jmp替代了的那几个指令).出现的问题是键盘输入不了数据了.是不是因为我把0X60端口中的数据读出了,键盘中断读不到了?怎么解决这个问题呢,
我试着用in al ,60h读出扫描玛后,接着用out 64,al,在把读到的扫描码送回去,但是也不行,出现键盘无法在用了,
大家有没有什么办法,给个思路也好啊,当然,有点代码就更好了,麻烦了,谢谢

4 回复
#2
hkbyest2007-07-14 11:41
很简单,你修改的int 9中断不响应键盘输入了。

解决方法是保存原int 9的地址,自己写一个新的9号中断调用,在里面调用原int 9。
#3
luohua20072007-07-14 17:19
你这个方法很巧妙,我在我自己的中断里又调用原来的中断,

是这个样子吗

in al,60h//先读出键盘的扫描码,接着调用原来的中断IN9我给设置的新的地址
call cs:[300]//转到我设置的INT9的新地址处,执行原来的INT9

可是这样来,我怀疑我的in al,60h读出扫描码后,即使在调用原来的INT9,那么键盘的扫描码还能正确显示到文本框吗

希望能在给我指点一下,谢谢,
#4
hkbyest2007-07-15 11:19

文本框?你是写32位汇编?外中断最好在实模式下使用,保护模式下会有问题。

这个方法其实就是编写自己的中断处理程序,没什么巧妙的。
首先把原中断的入口地址保存在一个安全的地方,注意是DWORD,例如int 9,0:[9*4]是偏移地址,0:[9*4+2]是段地址,假设我们把它们保存到0:200和0:202。

然后把新的9号中断处理程序地址写到0:[9*4],0:[9*4+2],这里要注意一下当程序退出后,这个地址如果在代码段里那么将被释放掉,解决办法是把新中断处理代码复制到一个可靠的地方,如0:204-0:300这段空间里。

新的中断处理里面:
in al,60h
pushf ;标志寄存器入栈
call dword ptr 0:[200] ;调用原int 9

键盘中断属于可屏蔽外中断,当你按下键时引发,你一楼所说的问题就出在这里,你按键,中断,跳,然后再调用中断,再跳,形成死循环了,所以我们要在新的中断处理程序下模拟int 9。



[此贴子已经被作者于2007-7-15 11:44:56编辑过]

#5
luohua20072007-07-21 17:45
十分感谢hkbyest这样详细的讲解,这几天网线断了,所以没上
1