键盘输入

1,前面讲过, int 9 中断例程负责对键盘输入进行处理,具体为:从 60h 端口读出扫描码,并将其转化为相应的ASCII码或状态信息,一起存储到内存的指定空间(键盘缓冲区或状态字节)中。
      其中键盘缓冲区一共有16个字单元,可以存储15个按键的扫描码和对应的ASCII码。这是因为采用了循环队列来实现的,会有一个单元被浪费掉。

例如:当摁下 A、B、C、shift_A、A 时键盘缓冲区的状态如下:
      当摁下 A 键时,int 9 例程从 60h 端口读取A键的通码;检测状态字节判断是否有控制键(Ctrl、Shift)按下,发现没有被按下时,将A键的扫描码 1eh 和对应的字母 ’a’ 的ASCII码 61h写入键盘缓冲区中。高位字节存储扫描码,低位字节存储ASCII码。
      当摁下 B、C 键时进行类似的操作。
      当摁下 Shift_A 键时,(1)当按下左 Shift 键时,发生键盘中断,int 9 中断例程接收左 Shift 键的通码,设置 0040:17 处的状态字节的第1位为1,表示左 Shift 键按下。(2)当按下 A 键时,int 9 例程从 60h 端口读出A键的通码;检测状态字节发现左 Shift 键按下,则将 A 键的扫描码 1Eh 和 Shift_A 对应的大写字母 ‘A’ 的ASCII码 41h 写入键盘缓冲区。(3)当松开左 Shift 键时,发生键盘中断,int 9 中断例程接收左 Shift 键的断码,设置0040:17处的状态字节的第1位为0,表示左 Shift 键松开。
      最后再次按下 A 键时的操作同上。
                                                            5次按键的键盘缓冲区图示

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1, 1E61
2, 1E61 3062
3, 1E61 3062 2E63
4, 1E61 3062 2E63 1E41
5, 1E61 3062 2E63 1E41 1E61

2,使用 int 16h 中断例程的 0 号子程序可以从键盘缓冲区中读取一个键盘输入,并将其从缓冲区中删除。具体步骤如下:
      (1)检测键盘缓冲区中是否有数据。
      (2)没有则继续做第1步。即一直在等待,等待有数据被输入到键盘缓冲区中。
      (3)读取缓冲区中最早进入的键盘输入,从队头开始读取。
      (4)将读取的扫描码送入 ah,ASCII码送入 al。
      (5)将已读取的键盘输入从缓冲区中删除。
      对上面的键盘缓冲区执行:

         mov ah,0int 16h

缓冲区中的结果为

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
3062 2E63 1E41 1E61

ah 中的内容为 1eh,al 中的内容为 61h。

总结:int 9 和 int 16h 可以相互配合使用,int 9 是在有键按下的时候向键盘缓冲区中写入数据,int 16h 是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。当我们需要对某一个特定的按键实现一个特别的功能时,有两种方法,一种是通过 Int 9 中断例程在处理键盘输入时来实现;另一种是通过调用 int 16h 从键盘缓冲区中读取键盘输入来实现。后者的优点在于不需要重写编写 int 9 中断例程。

练习1

编写程序,接收用户的键盘输入,输入 ‘r’,将屏幕上的字符设置为红色;输入 ’g‘,将将屏幕上的字符设置为绿色;输入 ’b’,将屏幕上的字符设置为蓝色。
      关于在屏幕上显示颜色的细节可参考      https://blog.csdn.net/Little_ant_/article/details/108227058

     assume cs:codecode segment;调用 16h 号中断例程的 0 号子程序来读取一个键盘输入。start: mov ah,0int 16h         ;处理已经读取的键盘输入,ah中存放扫描码,al 中存放字符码(可直接来进行比较)。我们用 ah 来保存颜色属性,01h表示蓝色,02h表示绿色,04h表示红色。mov ah,1        ;初始设置颜色为蓝色,通过左移来改变颜色,这点需要注意。cmp al,'r'je redcmp al,'g'je greencmp al,'b'je bluejmp short sretred: shl ah,1green: shl ah,1blue: mov bx,0b800hmov es,bxmov bx,1mov cx,2000s: and byte ptr es:[bx],11111000bor es:[bx],ah          ;设置对应的颜色add bx,2loop ssret: mov ax,4c00hint 21h

练习2

编写字符串输入程序,需具备下面的功能。
      (1)在输入的同时需要显示这个字符串。
      (2)一般在输入回车符后,字符串输入结束。
      (3)能够删除已经输入的字符。
      因为需要显示字符串,故,子程序的参数为:(dh)、(dl) = 字符串在屏幕上显示的行、列位置;ds:si 指向字符串的存储空间,字符串以0为结尾符。
      首先,我们采用栈的方式来管理字符串的存储空间,即字符串的存储空间实际上是一个字符栈。输入字符时,字符入栈;删除字符时,字符出栈;显示字符时,从栈底到栈顶来显示。其次,输入回车符后,可以在字符串中加入 0,表示字符串结束。最后,每次当有新的字符输入或删除字符时,都应该重新显示该字符串。
      程序的处理过程如下:
      1,调用 int 16h 读取键盘输入
      2,如果是字符,进入字符栈,显示字符栈中的所有字符,继续执行 1。
      3,如果是退格键,从字符栈中弹出一个字符,显示字符栈中的所有字符,继续执行1。
      4,如果是回车键,向字符栈中压入 0,返回。

因为包含多次字符入栈、出栈和显示,我们将它们编写为子程序。
其中用(ah)=功能号,0 表示入栈、1 表示出栈、2 表示显示。用ds:si 指向字符栈空间。在入栈时,(al)= 入栈字符;出栈时,(al)= 出栈字符;显示时,(dh)、(dl)为屏幕上显示的行、列位置。

     charstack: jmp short charstarttable dw charpush,charpop,charshow        ;直接定址表top dw 0          ;用数据标号top中的内容来表示栈顶,初始栈顶为0charstart: push bxpush dxpush dipush escmp ah,2ja sret          ;功能号ah大于2直接返回mov bl,ahmov bh,0add bx,bxjmp word ptr table[bx]   ;跳转到对应的子程序charpush: mov bx,topmov [si+bx],al       ;先将字符入栈inc top              ;栈顶指针自增jmp short sret       ;字符入栈结束,返回charpop: cmp top,0         ;若top为0,此时栈为空,返回je sretdec topmov bx,topmov al,[si+bx]       ;al 保存出栈字符jmp short sretcharshow: mov bx,0b800hmov es,bxmov al,160mov ah,0              mul dhmov di,ax             ;将(al)*(dh)的结果放在di中add dl,dlmov dh,0add di,dx               ;将最终的显示地址放在di中。即es:di作为目的地址。mov bx,0charshows: cmp bx,topjne noemptymov byte ptr es:[di],' '  ;字符栈为空时显示空格符;或在字符串末尾再显示一个空格符。jmp short sretnoempty: mov al,[si+bx]mov es:[di],almov byte ptr es:[di+2],' '  ;总是在字符串输出的末尾加上空格符inc bxadd di,2jmp charshowssret: pop espop dipop dxpop bxret

编写完整的接受字符串输入的子程序如下:(注意:在显示栈中字符的时候,需要清除屏幕上一次显示的内容):

     getstr: push axgetstrs: mov ah,0int 16h         ;接收键盘输入,ah中放扫描码,al中放字符码cmp al,20hjb nochar        ;ASCII码小于20h,说明不是字符mov ah,0call charstack    ;存放在(al)中的字符入栈,ah表示调用0号子程序mov ah,2call charstack ;显示栈中的字符串jmp short getstrsnochar: cmp ah,0eh        ;退格键的扫描码je backspacecmp ah,1ch      ;回车键的扫描码je enterjmp short getstrsbackspace: mov ah,1call charstack  ;字符出栈mov ah,2call charstack ;显示栈中字符jmp short getstrsenter: mov al,0mov ah,0call charstack   ;将0入栈mov ah,2call cahrstack ;显示栈中的字符pop ax          ;退出ret

汇编语言随笔(15)- 对键盘输入进行处理(int 9 和 int 16h 中断例程)相关推荐

  1. Wayland入门15:键盘输入

    上一篇介绍了鼠标的相关操作,本文介绍键盘的相关操作. 使用的是标准的键盘库xkb,官网为:https://www.xkbcommon.org/. 先把上一篇的鼠标操作的部分复制过来. 注册并绑定键盘相 ...

  2. 汇编语言随笔(13)- 外中断(可屏蔽中断)、实验15

    端口的作用 在PC系统的接口卡和主板上,装有各种接口芯片.这些外设接口芯片内部有若干寄存器,CPU将这些寄存器当作端口来访问.       外设的输入不直接送入内存和CPU,而是送入相关的接口芯片的端 ...

  3. 汇编语言笔记17-使用BIOS进行键盘输入和磁盘读写

    转载必须注明出处,违者必究.http://www.cnblogs.com/dennisOne ☞使用BIOS进行键盘输入和读取键盘缓冲区 复习键盘缓冲区和状态字节 (1). BIOS键盘缓冲区是系统启 ...

  4. 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。(两种方法/每步详解)

    试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来. 小写变大写的实现方法: 1.SUB AL,32 ; 只能满足于输入只是小写的时候 2. AND AL,11011111B ; 该方 ...

  5. 对键盘输入的小写字母用大写字母显示出来 asm汇编语言程序设计

    大家好啊,我是xin麒,公众号是善于思考的编程麒,昨晚做了一道汇编题目: 注释也是根据自己了解写的,如有不足,希望指正! 问题描述: 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来 ...

  6. NASM汇编语言与计算机系统11-9号与0X16号中断显示键盘输入(int)

    本文的示例将显示从键盘上输入一个按键,屏幕上显示该按键的内容 0x09号中断:当从键盘上敲一个按键,会将按键的内容放到0x60端口,然后执行9号中断例程,由于9号中断例程已经被bios写好了,所以会直 ...

  7. Go 获取键盘输入,进制转换

    #### Go 获取键盘输入,进制转换 最近爱上<<珂矣的心灵独语>> 连续听一下礼拜也不觉得厌: 喜欢她的宁静与安然,喜欢她的坦荡与欢喜,喜欢她的禅意与智慧; ***撑着一苇 ...

  8. 贺利坚老师汇编课程73笔记:键盘输入的处理过程

    指路老师的博客 键盘的每一个键相当于一个开关,键盘中有一个芯片对键盘的每一个键的开关状态进行扫描 按下一个键的操作 开关接通,该芯片就产生了一个扫描码,扫描码说明按下的键在键盘的位置 扫描码被送入主板 ...

  9. 使用BIOS进行键盘输入和磁盘读写

    BIOS 为键盘和磁盘这两种外设的 I/O 提供了最基本的中断例程 int 9 中断例程对键盘输入的处理 键盘输入将引发9号中断,BIOS 提供了 int 9 中断例程.CPU 在9号中断发生后,执行 ...

最新文章

  1. VBA编程常用词汇英汉对照表
  2. 史上最全的MSSQL笔记
  3. akka 消息发送接收_Akka型演员:探索接收器模式
  4. boot界面上下键调节键不能动_为什么电脑一开机就自动进入BIOS界面
  5. python脚本在centos系统一键卸载重新安装Mysql
  6. 【论文阅读】Graph Networks for Multiple Object Tracking
  7. LINQ to SQL 用O/R设计器手工建表对象
  8. Python中的分片和索引方法
  9. Java多线程-线程的生命周期
  10. linux apache 403 forbidden,apache服务器显示403 Forbidden的原因和解决方法
  11. JSP内置对象session和application
  12. Win10锁屏之后屏幕自动关闭怎么办
  13. vue父组件通过v-for循环多次调用同一个子组件,改变被循环数组个数,各子组件显示数据混乱
  14. 【一分钟解决】Matplotlib 中英文混排多字体设置问题
  15. 树洞程序php,Anonymous v20200926 – 秘密 PHP树洞程序
  16. 小白学JS,利用JavaScripty验证通过15位和18位身份证验证性别
  17. linux常见桌面系统以及安装gnome远程桌面
  18. 架构师,你需要了解的git知识都在这里了
  19. js清除YY虎牙订阅的直播
  20. leaflet清除图层

热门文章

  1. [EffectiveC++]item41:了解隐式接口和编译期多态
  2. redis 五大数据结构__常用命令
  3. 修改maven本地仓库位置
  4. jQuery练习---- 超简单的表格悬停变色Demo
  5. log4j.properties中的这句话“log4j.logger.org.hibernate.SQL=DEBUG ”该怎么写在log4j.xml里面呢?...
  6. XML基础教程(2)
  7. VS 2008 .NET Framework 3.5 Training Kit
  8. spring+mybatis 多数据源整合
  9. 计算机中列英语,计算机中常用的英文缩写有哪些?
  10. 【Windows 逆向】OD 调试器工具 ( 推荐汉化版的 OD 调试工具 | 吾爱破解专用版Ollydbg | 备选工具 )