BIOS调用int 16h来处理来自键盘的输入。BIOS int 16h不允许重定向。但是在读键时更容易一回,每个扩展键都会产生一个8位的扫描码,对于IBM极其兼容机而言, 每个键的扫描码都是唯一的, 所有的按键都产生扫描码。标准化的ASCII码几乎在所有的计算机上都是相同的。
按键之后会发生一系列事件,这些事件从键盘控制芯片开始直到字符被放入键盘输入缓冲区的数组中结束。键盘缓冲区在任何时刻最多可容纳15次击键,每次击键都会产生两字节的数据(ASCII+SCANCODE)。当用户按下一个键时会产生下面一系列事件:
1,键盘控制器芯片向PC的键盘输入端口发送一个8位扫描码
2,输入端口引发一个中断,中断是预定义的信号。用于通知CPU的一个输入输出设备需要引起注意。CPU通过执行int 9h服务例程响应键盘中断。
3,int 9h 中断服务例程从输入输出获取键盘的扫描码并查找按键对应的ASCII码。如果按键有对应的ASCII码,int 9h例程就把ASCII码和扫描码一起插入到键盘缓冲区。如果按键的扫描码没有对应的ASCII码,键盘缓冲区的ASCII码就设为0。见图:
;----------------------------------------------------
【键 盘】
|scancode
V
【输入 端口】
|scancode
V
【int 9h中断例程】
|scancode
|ascii
V ascii
【键盘输入缓冲区】-------->【int 21h中断例程】
|scancode
|ascii
V
【int 16h中断例程】
------------------------------------------------------
一旦按键的扫描码和ascii码被放到了缓冲区,他们一直就保存在那里,直到被当前运行的程序取出为止。 有两种方法取出按键:
1,调用BIOS int 16h的功能,从键盘缓冲区中取得按键的扫描码和ascii码
2,调用DOS int 21h的功能,从输入缓冲区中取得按键的ascii码,如果按下的是扩展键,就必须第二次调用int 21h返回扫描码。
- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00