| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 868 人关注过本帖
标题:[求助]键盘中断后原程序无法读出键盘码的问题
只看楼主 加入收藏
luohua2007
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2007-4-11
收藏
 问题点数:0 回复次数:4 
[求助]键盘中断后原程序无法读出键盘码的问题

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

搜索更多相关主题的帖子: 键盘 
2007-07-13 22:39
hkbyest
Rank: 1
等 级:新手上路
威 望:2
帖 子:30
专家分:0
注 册:2007-6-14
收藏
得分:0 
很简单,你修改的int 9中断不响应键盘输入了。

解决方法是保存原int 9的地址,自己写一个新的9号中断调用,在里面调用原int 9。
2007-07-14 11:41
luohua2007
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2007-4-11
收藏
得分:0 
你这个方法很巧妙,我在我自己的中断里又调用原来的中断,

是这个样子吗

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

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

希望能在给我指点一下,谢谢,

来生 再续前缘 孟婆浅浅一笑 低头看那一锅普通的汤 只因加了一味叫遗忘的草料 也抵过了曾经的万千誓言
2007-07-14 17:19
hkbyest
Rank: 1
等 级:新手上路
威 望:2
帖 子:30
专家分:0
注 册:2007-6-14
收藏
得分:0 

文本框?你是写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编辑过]

2007-07-15 11:19
luohua2007
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2007-4-11
收藏
得分:0 
十分感谢hkbyest这样详细的讲解,这几天网线断了,所以没上

来生 再续前缘 孟婆浅浅一笑 低头看那一锅普通的汤 只因加了一味叫遗忘的草料 也抵过了曾经的万千誓言
2007-07-21 17:45
快速回复:[求助]键盘中断后原程序无法读出键盘码的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016570 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved