第六篇 键盘中断与应用程序读取键盘缓冲区

这篇博文主要介绍在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

 

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

 

 

你可能感兴趣的:(零零散散学汇编)