汇编语言使用int 16h中断例程读取键盘缓冲区

 mov ah,0
 in 16h

结果:(ah)=扫描码,(al)=ASCII码
下面我们接着上一节中的键盘输入过程,看一下int 16h如何读取键盘缓冲区
(1)执行

 mov ah,0
 in 16h

后,缓冲区中的内容如下。

3062 2E63 2064 1265 1E41 1E61

ah中的内容为1Eh , al中的内容为61h
(2)执行

 mov ah,0
 in 16h

后,缓冲区中的内容如下。

2E63 2064 1265 1E41 1E61

ah中的内容为30Eh , al中的内容为62h
(3)执行

 mov ah,0
 in 16h

后,缓冲区中的内容如下。

2064 1265 1E41 1E61

ah中的内容为2Eh , al中的内容为63h
(4)执行 4 次
后,缓冲区中空

ah中的内容为1Eh , al中的内容为61h
(5)执行

 mov ah,0
 in 16h

int 16h中断例程检测键盘缓冲区,发现缓冲区空,则循环等待,直到缓冲区中有数据。
(6)按下A键后,缓冲区中的内容如下。

1E61

(7)循环等待的int 16h中断例程检测到键盘缓冲区中有数据,将其读出,缓冲区又为空。

ah中的内容为1Eh , al中的内容为61h
从上面我们可以看出,int 16h中断例程的0号功能,进行如下的工作。
(1)检测键盘缓冲区中是否有数据;
(2)没有则继续做第1步;
(3)读取缓冲区第一个字单元中的键盘输入;
(4)将读取的扫描码送入ah, ASCII码送入al;
(5)将已读取的键盘输入从缓冲区中删除。
可见,BIOS的int 9中断例程和int 16h中断例程是一对相互配合的程序,int 9中断例程向键盘缓冲区中写入,int 16h中断例程从缓冲区中读出。它们写入和读出的时机不同,int 9中断例程是在有键按下的时候向键盘缓冲区中写入数据;而int 16h中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。
我们在编写一般的处理键盘输入的程序的时候,可以调用int 16h从键盘缓冲区中读取键盘的输入。
编程,接收用户的键盘输入,输入“r",将屏幕上的字符设置为红色;输入“g”,将屏幕上的字符设置为绿色;输入“b",将屏幕上的字符设置为蓝色

程序如下,画线处的程序比较技巧,请读者自行分析。

assume cs:code

code segment
start:mov ah,0
      int 16h

      mov ah,1
      cmp al,'r'    ;要是输入的是r,就跳到Red处
      je red
      cmp al,'g'    ;如果输入的是g,那么就跳到green处
      je green
      cmp al,'b'    ;如果输入的是b,那么就跳到blue处
      je blue
      jmp short sret

red: shl ah,1
green: shl  ah,1
blue:mov bx,0b800h   ;设置要改变的字符地址处
     mov es,bx
     mov bx,1
     mov cx,2000

s:and byte ptr es:[bx],11111000b    ;要改变的是第0、1、2位
  or es:[bx],ah
  add bx,2
  loop s

sret:mov ax,4c00h
     int 21h

code ends
end start

发布日期:

所属分类: 编程 标签:


没有相关文章!