- in 9h:从60h端口读入键盘输入
int 16h:从键盘缓冲区读取数据,并将其从缓冲区删除(循环检测缓冲区中是否有数据)
- 内存->数据缓冲区->ax
- 结果:(ah)=扫描码,(al)=ASCII码
mov ah,0 ;16h例程的0号功能
int 16h
例题:输入r,屏幕显示字符设置为红色 ```cpp assume cs:code code segment start:mov ah,0
int 16h
mov ah,1 ;把高位扫描码覆盖为1
cmp al,'r' ;对比ASCII码
je red
cmp al,'g'
je green
cmp al,'b'
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 ;最后三位控制红绿蓝 or es:[bx],ah add bx,2 loop s sret: mov ax,4c00h int 21h code ends end start
<a name="nfFYe"></a>
### 字符串的输入
- 功能:输入时显示,回车输入结束,能够删除输入的字符
- (dh):字符串在屏幕上显示的行的位置
- (dl):字符串在屏幕上显示的列的位置
- ds:si:指向字符串存储空间,以0结尾
- 按照栈的访问顺序(字符栈)【功能的封装】
- (ah)=0入栈 1出栈 2显示
- ds:si指向字符栈空间
- (ah)=0时,(al)=入栈字符
- (ah)=1时,(al)=返回字符
- (ah)=3时,(dh):字符串在屏幕上显示的行的位置,(dl):字符串在屏幕上显示的列的位置
```cpp
assume cs:code
code segment
start:
call getstr
return:
mov ax,4c00h
int 21h
getstr:
push ax
getstrs:
mov ah,0
int 16h ;缓冲区->al
cmp al,20h
jb nochar
mov ah,0 ;字符入栈
call charstack
mov ah,2 ;字符显示
call charstack
jmp getstrs ;循环获取缓冲区中的字符
nochar:
cmp ah,0eh ;退格键
je backspace
cmp ah,1ch ;回车键
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 chastack ;0入栈,表示结尾
mov ah,2
call charstack
pop ax
ret
chastack:
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 ;输入数据默认存放在al寄存器
inc top ;模拟栈
jmp sret
charpop:
cmp top,0;判断栈是否为空
je sret
dec top
mov bx,top
mov al,[si][bx] ;弹出数据默认存放在al寄存器
jmp sret
charshow:
mov bx,0b800h
mov es,bx
mov al,160 ;一行160个字节,用来定位总偏移
mov ah,0
mul dh ;160*行号
mov di,ax
add dl,dl ;列号*2
mov dh,0
add di,dx ;di为定位到0b800的总偏移
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...
int 13h对磁盘进行读写
- 古老的3.5英寸软盘
- 上下两面
- 每面80个磁道
- 每个磁道18个扇区
- 每个扇区大小为512B
- 总大小:2x80x18x512B
- 通过控制磁盘控制器来访问磁盘
- 以扇区为单位进行读写(面号【从0开始】、磁道号【从0开始】、扇区号【从1开始】)
- (ah)=int 13h的功能号
- 2:读扇区
- 3:写扇区
- (al)=读取的扇区数
- (ch)=磁道号
- (cl)=扇区号
- (dh)=磁头号(面号)
- (dl)=驱动器号
- 软驱从0开始
- 硬盘从80h开始
- es:bx指向接受磁扇区读入数据的内存区
- 返回参数
- 操作成功:(ah)=0,(al)=写入的扇区数
- 失败:(ah)=出错代码