第十七章 使用BIOS进行键盘输入和磁盘读写
17.1 int9中断例程对键盘输入的处理
一般的键盘输入,在cpu执行完int9中断例程以后,欧放到了键盘缓冲区中。 键盘缓冲区有16个字单元,可以存储15个按键的扫描码和对应的ASCII码。
参照书P300页 关于键盘缓冲区的存储利用了队列或者环形队列数据结构。
17.2 使用int16h中断例程读取键盘缓冲区
int16h 能够从键盘缓冲区读取一个键盘输入, 功能标号为0.
mov ah, 0
int 16h
结果 ah = 扫描码 bl = ascii码
然后该字符从键盘缓冲区被删除
int 16h中断例程检测键盘缓冲区,发现缓冲区为空,则循环等待,直到缓冲区中有数据。
int 16h的中断例程0号功能,进行如下工作
1)检测键盘缓冲区是否有数据
2)没有则继续第一步
3)读取缓冲区第一个字单元的键盘输入
4)将读取的扫描码送入ah, ASCII码送入al
5)将已读取的键盘输入从缓冲区中删除。
编程,接受用户的键盘输入,输入“r” ,将屏幕上的字符设置为红色,输入“g”, 将屏幕上的字符设置为绿色
输入“b“ 将屏幕上的字符设置为蓝色。
assume cs:code
code segment
start: mov ah, 0
int 16h
mov ah, 1 ; used to generate the color code
cmp al, 'r'
je red
cmp al, 'g'
je green
cmp al, 'b'
je blue
jmp short sret
red: shl ah, 1 ; left shift once
green: shl ah, 1 ; left shift once . if go through red it will generate 100B
blue: mov bx, 0b800h
mov es, bx
mov bx, 1
mov cx, 2000
s: and byte ptr es:[bx], 11111000b ; reset color
or es:[bx], ah ; set new color
add bx, 2
loop s
sret: mov ax, 4c00h
int 21h
code ends
end start
监测点17.1
"在int 16h中断例程中,一定有设置IF=1的指令." 这种说法对吗?
不对.
8086CPU的中断系统具有256个中断(0-255),其中分为