利用int 16h读取键盘缓冲区,int16的使用方法如下:
mov ah,0
int 16h
结果:ah=扫描码,al=ASCII码
调用int16h中断检测到键盘缓冲区后,发现缓冲区空,则循环等待,知道缓冲区中有数据;如果缓冲区满,则覆盖掉之前的数据。
本实验就是利用了16中断检测缓冲区空不断读取的特性,完成了从缓冲区读取一个字符,并作出判断,根据是否符合条件来改变屏幕的颜色值。代码如下:
assume cs:code,ss:stack,ds:data
data segment
db 128 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
call get_color
mov ax,4c00h
int 21h
get_color:
mov ah,0
int 16h
mov ah,1
cmp al,'r'
je red
cmp al,'g'
je green
cmp al,'b'
je blue
jmp get_color
ret
red:
shl ah,1
green: shl ah,1
blue:
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
setColor:
and byte ptr es:[bx],11111000b
or es:[bx],ah
add bx,2
loop setColor
jmp get_color
getColorRet:
mov ax,4c00h
int 21h
;;===================================
code ends
end start
按下r键,效果如下:
按下g键,效果如下
按下b键,效果如下