17.1 int9中断例程对键盘输入的处理
键盘输入将引发int9中断,BIOS 提供了int9中断例程。
int9:
从60h端口读出扫描码,将其转化为相应的ASCII码或状态信息,储存在内存的指定空间(键盘缓冲区或状态字节)中。
一般的键盘输入,在CPU执行完int9后都放到了键盘缓冲区中。键盘缓冲区中有16个字单元,可以储存15个按键的扫描码和对应的ASCII码。
![](https://img-blog.csdnimg.cn/img_convert/2413532fa8e746459326cf9b827eace0.png)
![](https://img-blog.csdnimg.cn/img_convert/96824704070a1809d92625128cca2dbc.jpeg)
17.2使用int 16h中断例程读取键盘缓冲区
BIOS提供了int 16h 中断例程,int16h 中断例程中包含的一个最重要的功能是从键盘缓冲区中取出一个键盘输入,该功能的编号是0。
mov ah,0
int 16h
结果:(ah)=扫描码,(al)=ASCII码
![](https://img-blog.csdnimg.cn/img_convert/96f1aed820a5d72e70892d914223c733.jpeg)
编程:接受键盘输入'r' 'g' 'b'
r将前景置为红
g前景置为绿
b将前景置为蓝
assume cs:code,ds:data,ss:stack
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
mov ah,0 ;调用16h
int 16h
;属性字节格式:7 6 5 4 3 2 1 0
;含义 BL R G B I R G B
; 闪烁 背景 高亮 前景
;R: 红色 G:绿色 B:蓝色
;字节属性对应内存地址又低到高。
;ax寄存器先ah后al 所以ah对应前景
mov ah,1 ;将前景色蓝色置为1此时如果不改变ah,前景会被设置为蓝色
cmp al,'r'
je red
cmp al,'g'
je green
cmp al,'b'
je blue
jmp short sret
red: shl ah,1 ;当输入为r时跳转到这里,然后继续向下执行
;也就是说会左移两个位,这时候相当于红色被置为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
or es:[bx],ah
add bx,2
loop s
jmp start
sret: mov ax,4C00h
int 21h
code ends
end start
mov ax,4C00h
int 21h
code ends
end start
17.3字符串的输入
assume cs:code,ds:data,ss:stack
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
mov dh,12
mov dl,16
call getstr
mov ax,4C00h
int 21h
;==================================接收字符串
getstr: push ax
getstrs: mov ah,0
int 16h
cmp al,20h
jb nochar ; ASCII码小于20h就不是字符了
mov ah,0
call charstack;字符入栈
mov ah,2
call charstack ;显示栈中字符
jmp getstrs
nochar: cmp ah,0eh ;退格键的扫描码
je backspace
cmp ah,1ch ;enter键的扫描码
je enter
jmp getstrs
backspace:mov ah,1
call charstack ; 字符出栈
mov ah,2
call charstack ;显示栈中字符
jmp getstrs
enter: mov al,0
mov ah,0
call charstack ;0入栈
mov ah,2
call charstack ;显示栈中字符
pop ax
ret
charstack:jmp short charstart
table dw charpush,charpop ,charshow
top dw 0 ; 栈顶
charstart:push bx
push dx
push di
push es
cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx]
charpush: mov bx,top
mov [si][bx],al
inc top
jmp sret
charpop: cmp top ,0
je sret
dec top
mov bx,top
mov al,[si][bx]
jmp sret
charshow: mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov bx,0
charshows:cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty: mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows
sret: pop es
pop di
pop dx
pop bx
ret
code ends
end start