大多数有用的程序都需要处理用户的输入,键盘输入是最基本的输入。程序和数据通常需要长期存储,磁盘是最常用的存储设备。BIOS为这两种外设的I/O提供了最基本的中断例程,在本章中,我们对它们的应用和相关的问题进行讨论。
我们已经讲过,键盘输入将引发9号中断,BIOS提供了int 9中断例程。CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中。
一般的键盘输入,在CPU执行完int 9中断例程后,都放到了键盘缓冲区中。键盘缓冲区中有16个字单元,可以存储IS个按键的扫描码和对应的ASCII码。
下面我们按照键盘缓冲区的逻辑结构,来看一下键盘输入的扫描码和对应的ASCII码是如何写入键盘缓冲区的。
注意:在我们的课程中,仅在逻辑结构的基础上,讨论BIOS键盘缓冲区的读写问题。其实键盘缓冲区是用环形队列结构管理的内存区,但我们不对队列和环形队列的实现进行讨论,因为那是另一门专业课《数据结构》的内容。
下面,我们通过下面几个键:
A, B、C、D, E, Shift A, A
的输入过程,简要地看一下int 9中断例程对键盘输入的处理方法.
(1)初始状态下,没有键盘输入,键盘缓冲区空,此时没有任何元素
(2)按下A键,引发键盘中断;
CPU执行int 9中断例程,从60h端口读出A键的通码;然后检测状态字节,看看是否有Shift, Ctrl等切换键按下;发现没有切换键按下,则将A键的扫描码leh和对应的ASCII码,即字母“a”的ASCII码61h,写入键盘缓冲区。缓冲区的字单元中,高位字节存储扫描码,低位字节存储ASCII码。此时缓冲区中的内容如下。
(3)按下B键,引发键盘中断;
CPU执行int 9中断例程,从60h端口读出B键的通码;然后检测状态字节,看看是否有切换键按下;发现没有切换键按下,将B键的扫描码30h和对应的ASCII码,即字母“b”的ASCII码62h,写入键盘缓冲区。此时缓冲区中的内容如下。
(4)按下C. D. E键后
,缓冲区中的内容如下。
(5)按下左Shift键,引发键盘中断
;int 9中断例程接收左Shift键的通码,设置0040:17处的状态字节的第1位为1,表示左Shift键按下。
(6)按下A键,引发键盘中断
;CPU执行int 9中断例程,从60h端口读出A键的通码;检测状态字节,看看是否有切换键按下;发现左Shift键被按下,则将A键的扫描码lEh和Shift A对应的ASCII码,即字母“A”的ASCII码41h,写入键盘缓冲区。此时缓冲区中的内容如下。
(7)松开左Shift键,引发键盘中断;
int 9中断例程接收左Shift键的断码,设置0040:17处的状态字节的第1位为0,表示左Shift键松开。
(8)按下A键,引发键盘中断
:CPU执行int 9中断例程,从60h端口读出A键的通码;然后检测状态字节,看看是否有切换键按下;发现没有切换键按下,则将A键的扫描码lEh和A对应的ASCII码,即字母“a”的ASCII码61h,写入键盘缓冲区。此时缓冲区中的内容如下。
1E64 | |||||||||||||||
1E61 | 3062 | ||||||||||||||
1E61 | 3062 | 2E63 | 2064 | 1265 | |||||||||||
1E61 | 3062 | 2E63 | 2064 | 1265 | 1E41 | ||||||||||
1E61 | 3062 | 2E63 | 2064 | 1265 | 1E41 | 1E61 |
所属分类: 编程
相关文章:
▪ 易语言PathIsDirectoryA判断目录是否存在2020-06-16
▪ SetWindowsHookExA键盘线程钩子注入DLL到游戏-12020-04-30
▪ VB获取打开的程序个数代码2017-04-04
▪ 易语言主程序调用DLL的图片资源2019-08-09
▪ 大漠后台绑定测试工具使用教程2017-05-28
▪ 易语言多线程大漠多线程-34大漠多线程模板-4多线程初始化2019-03-23
▪ 第一课易语言大漠游戏外挂一键登录界面设计2017-04-13
▪ 511遇见易语言软件本地注册验证-18-机器特征字_QQ_限制时间_反算时间2018-12-07
▪ 易语言教程逻辑比较2017-08-10
▪ 易语言汇编主程序和DLL交换数据字节集型2019-08-05