1. 预备知识
- 一般的键盘输入,在 CPU 执行完 int 9 中断例程后,都放到了键盘缓冲区。键盘缓冲区中有 16 个字单元,可以存储 15 个按键的扫描码和对应的 ASCII 码。
- BIOS 提供了 int 16h 中断例程供程序员调用,其中包含的一个重要功能是从键盘缓冲区读取一个键盘输入,该功能的编号为 0。从缓冲区读取一个键盘输入,并将其删除;如果键盘缓冲区为空,则循环等待,直到缓冲区中有数据。
mov ah,0
int 16h
;(ah)=扫描码,(al)=ASCII码
如,编程接收用户的键盘输入,输入 r 将屏幕上的字符设置为红色;输入 g 将屏幕上的字符设置为绿色;输入 b 将屏幕上的字符设置为蓝色。
assume cs:code
code segment
start:
mov ah,0
int 16h
;调用16h中断例程的0号功能从键盘缓冲区读取数据,如果为空则循环等待
mov ah,1
;最后三位依次为RGB
cmp al,'r'
je red
cmp al,'g'
je green
cmp al,'b'
je blue
jmp short sret
;移动一位AH,对应于G
red:
shl ah,1
;移动两位AH,对应于R
green:
shl ah,1
;不移动AH,对应于B
blue:
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
s:
and byte ptr es:[bx],11111000b
or es:[bx],ah
add bx,2
loop s
sret:
mov ax,4c00h
int 21h
code ends
end start
运行程序,等待用户输入。输入 r:
输入 g:
输入 b:
2. 检测点 17.1
在 int 16h 中断例程中,一定有设置 IF=1 的指令。这种说法对吗?
- IF 用于确定 CPU 是否响应可屏蔽中断,IF=1 时响应中断,IF=0 时不响应中断。
- 当键盘缓冲区为空时,16h 中断例程循环等待,直到缓冲区中有数据。此时,如果键盘输入数据,则会调用 9h 中断将键盘数据写入键盘缓冲区。此时,需设置 IF=1 响应可屏蔽中断 9h。所以,这种说法正确。
3. 总结
- 一般的键盘输入,在 CPU 执行完 int 9 中断例程后,都放到了键盘缓冲区。
- BIOS 提供了 int 16h 中断例程供程序员调用,其中包含的一个重要功能是从键盘缓冲区读取一个键盘输入,该功能的编号为 0。