这篇博文主要介绍在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 09h data segment addr dw ?,? ;存储系统int 9的地址 flag db 0 ;程序结束的标志,为1表明按下了shift+a,介绍程序 data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov ax,0 mov es,ax ;保存原中断地址 mov ax,es:[int9*4] mov addr,ax mov 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 ;加入新中断服务程序地址 cli lea ax,isr mov es:[int9*4],ax mov ax,seg isr mov es:[int9*4+2],ax sti ;等待shift+a,结束程序 back: cmp flag,1 je leave jmp back ;恢复原中断地址 leave: cli mov ax,addr mov es:[int9*4],ax mov ax,addr[2] mov es:[int9*4+2],ax sti mov ah,4ch int 21h ;新的中断服务程序 isr proc far push ax push bx mov ax,data mov ds,ax ;调用原int 9完成必要的工作 pushf call dword ptr addr ;调用BIOS的int 16h读出键盘缓冲区的一个字节 mov ah,0 int 16h ;按下a cmp al,61h je go1 ;按下shift+a cmp al,41h je go2 back1: pop bx pop ax iret ;按下a通过bl传递显存中的字符属性为高亮红色 go1: mov bl,48h call far ptr display jmp back1 ;按下shift+a则恢复 go2: mov flag,1 mov bl,0 call far ptr display jmp back1 isr endp display proc far push cx push si ;向显存内写 mov cx,0b800h mov es,cx mov cx,2000 mov si,1 again: mov es:[si],bl add si,2 loop again pop si pop cx ret code ends end start
5、实验结果截图
①按下a
②按下shift+a
五、博主上传了王爽《汇编语言》。欢迎学习交流。