第六篇 键盘中断与应用程序读取键盘缓冲区
这篇博文主要介绍在X86下键盘的中断过程,以及应用程序如何利用中断读取键盘缓冲区内容。
一、撰写该篇博文的背景介绍
在我们全屏看视频时,按下Esc键,播放器还原或者最小化;在利用其他软件的时候,我们会
发现,设置可以设置打开或关闭程序的快捷方式......
应用程序为什么可以根据键盘的指示工作?又是如何工作的呢?
二、对于键盘中断的介绍
当我们在按下按键时,键盘会把按键的扫描码发送到主板的接口电路中,具体说就是端口60H。
当60H收到扫描码,这时接口就会向CPU发出中断请求。这是一个可屏蔽中断。所以,当IF=1,
并且CPU执行完当前指令后就会响应中断。也就是进入int 9中断服务程序。此时,程序将读取
60H中的扫描码,并判断输入的按键是什么。



三、应用程序读取键盘缓冲区
利用键盘控制应用程序主要有两种方式:
1、直接从60H端口中读取键盘扫描码,在应用程序中分析键盘输入的是字符还是控制符、切换符等。
2、利用BIOS提供的中断int 16H。

四、介绍本程序
1、功能:当按下按键a,屏幕被写成红色;再按下shift+a屏幕又恢复成黑色。程序运行过程中,按下其他键没
有响应。
2、本程序是利用BIOS功能调用int 16h,读取键盘缓冲区的。
3、通过直接向显存写数据的办法,改变了屏幕的颜色。
4、代码:
int9 equ 09hdata segmentaddr dw ?,? ;存储系统int 9的地址flag db 0 ;程序结束的标志,为1表明按下了shift+a,介绍程序data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov ax,0mov es,ax;保存原中断地址mov ax,es:[int9*4]mov addr,axmov ax,es:[int9*4+2]mov addr[2],ax;设置新中断地址;cli;mov word ptr es:[int9*4],offset isr;mov word ptr es:[int9*4+2],seg isr;sti;加入新中断服务程序地址clilea ax,isrmov es:[int9*4],axmov ax,seg isrmov es:[int9*4+2],axsti;等待shift+a,结束程序back:cmp flag,1je leavejmp back;恢复原中断地址leave:climov ax,addrmov es:[int9*4],axmov ax,addr[2]mov es:[int9*4+2],axstimov ah,4chint 21h;新的中断服务程序isr proc farpush axpush bxmov ax,datamov ds,ax;调用原int 9完成必要的工作pushfcall dword ptr addr;调用BIOS的int 16h读出键盘缓冲区的一个字节mov ah,0int 16h;按下acmp al,61hje go1;按下shift+acmp al,41hje go2back1:pop bxpop axiret;按下a通过bl传递显存中的字符属性为高亮红色go1:mov bl,48hcall far ptr displayjmp back1;按下shift+a则恢复go2:mov flag,1mov bl,0call far ptr displayjmp back1isr endpdisplay proc farpush cxpush si;向显存内写mov cx,0b800hmov es,cxmov cx,2000mov si,1again:mov es:[si],bladd si,2loop againpop sipop cxretcode endsend start
5、实验结果截图
①按下a

②按下shift+a

五、博主上传了王爽《汇编语言》。欢迎学习交流。