B10S提供了int 16h中断例程供程序员调用。int 16h中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0。下面的指令从键盘缓冲区
中读取一个键盘输入,并且将其从缓冲区中删除:
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