汇编语言int 9中断例程对键盘输入的处理

我们已经讲过,键盘输入将引发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

发布日期:

所属分类: 编程 标签:


没有相关文章!