使用BIOS进行键盘输入


大多数有用的程序都需要处理用户的输入,键盘输入是最基本的输入,程序和数据需要长期存储,BIOS为这种外设的I/O提供了最基本的中断例程

int 9中断例程对键盘输入的处理

键盘输入将引发9号中断,BIOS提供了int 9中断例程,CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中
下面,我们通过下面几个键:
A,B,C,D,E,shift_A的输入过程,简要地看一下int9中断例程对键盘输入的处理方法

  1. 初始状态下,没有键盘输入,键盘缓冲区空,此时没有任何元素
  1. 按下A键,引发键盘中断,CPU执行int 9中断例程,从60h端口读出A键的通码,然后检测状态字节,看看是否有shift,ctrl等切换键按下,发现没有切换键按下,则将A键的扫描码1eh和对应的ASCII码,即字母"a"的ASCII码61h,写入键盘缓存区,缓冲区的字单元中,高位字节存储扫描码,低位字节存储ASCII码,此时缓冲区的内容为:
1E61
  1. 按下B键,引发键盘中断,CPU执行int 9中断例程,从60h端口读出B键的通码,然后检测状态字节,看看是否有切换键按下,发现没有切换键按下,将B键的扫描码30h和对应的ASCII码,即字母"b"的ASCII码62h,写入键盘缓冲区,此时缓冲区中的内容如下
1E613062
  1. 按下C,D,E键后,缓冲区中的内容为:
1E6130622E6320641265
  1. 按下左Shift键,引发键盘中断,int 9中断例程接收左Shift键的通码,设置0040:17处的状态字节的第1位为1,表示左Shift键按下
  2. 按下A键,引发键盘中断,CPU执行int 9中断例程,从60h端口读出A键的通码,检测状态字节,看看是否有切换键按下,发现左Shift键按下,则将A键的扫描码1Eh和shift_A对应的ASCII码,即字母"A"的ASCII码41h,写入键盘缓冲区,此时键盘缓存区中的内容如下
1E6130622E63206412651E41

使用int 16h中断例程读取键盘缓冲区

BIOS提供了int 16h中断例程供程序员调用,int 16h中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0,下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除

mov ah,0
mov 16h

结果:(ah)=扫描码,(al)=ASCII码

  1. 执行
mov ah,0
int 16h

后,缓冲区中的内容如下:

30622E63206412651E41

ah中的内容为1Eh,al中的内容为61h

  1. 执行
mov ah,0
int 16h

后,缓冲区中的内容如下:

2E63206412651E41

ah中的内容为30h,al中的内容为62h

  1. 执行4次
mov ah,0
int 16h

后,缓冲区为空

  1. 执行
mov ah,0
int 16h

int 16h中断例程检测键盘缓冲区,发现缓冲区空,则循环等待,直到缓冲区中有数据

  1. 按下A键后,缓冲区中的内容如下:
1E61
  1. 循环等待的int 16h中断例程检测到键盘缓冲区中有数据,将其读出,缓冲区又为空

从上面我们可以看到,int 16h中断例程的0号功能,进行如下的工作

  1. 检测键盘缓冲区中是否有数据
  2. 没有则继续做第1步
  3. 读取缓冲区第一个字单元中的键盘输入
  4. 将读取的扫描码送入ah,ASCII码送入al
  5. 将已读取的键盘输入从缓冲区中删除

可见,BIOS的int 9中断例程和int 16h中断例程是一对相互配合的程序,它们的写入和读取的时机不同,int 9中断例程是在有键按下的时候向键盘缓冲区中写入数据,而int 16h中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言可以使用int 16h中断例程的0号子程序来读取键盘输入。具体步骤如下: 1. 首先,需要检测键盘缓冲区中是否有数据。 2. 如果没有数据,程序将一直等待,直到有数据被输入到键盘缓冲区中。 3. 一旦有数据进入键盘缓冲区,程序将读取缓冲区中最早进入的键盘输入,从队头开始读取。 4. 将读取的扫描码送入ah寄存器,将ASCII码送入al寄存器。 5. 最后,将已读取的键盘输入从缓冲区中删除。 在汇编语言中,可以使用以下指令来执行上述步骤: ``` mov ah, 0 int 16h ``` 这样就可以读取键盘输入,并且从键盘缓冲区中删除。执行以上指令后,扫描码将存储在ah寄存器中,ASCII码将存储在al寄存器中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [汇编语言-使用BIOS进行键盘输入和磁盘读写](https://blog.csdn.net/Cdreamfly/article/details/104908167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [汇编语言随笔(15)- 对键盘输入进行处理(int 9 和 int 16h 中断例程)](https://blog.csdn.net/Little_ant_/article/details/108691941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值