这篇博文主要介绍在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
五、博主上传了王爽《汇编语言》。欢迎学习交流。