前言:本实验为王爽老师的《汇编语言》第三版中的实验17.3(p304)
实验环境:DOSBox 0.74-3
基础知识:请先查看书中 17.3 节关于字符串输入的介绍
实验任务:
编程,实现一个基本的字符串输入程序,具备以下功能:
(1)在输入的同时需要显示这个字符串;
(2)一般在输入回车后,字符串输入结束;
(3)能够删除已经输入的字符
程序代码:
assume cs:code
code segment
start: ;程序开始即准备获取字符
mov ah,0
int 16h
;获取字符
;ah=扫描码,al=ascii码
cmp al,20h ;ascii码<20h说明非字符
jb nochar
;ah=0,字符入栈
mov ah,0
call charstack
;ah=2,显示字符串
mov ah,2
mov dh,24 ;dh:行号
mov dl,0 ;dl:列号
call charstack
jmp start ;等待下一字符输入
nochar: ;非字符情况
;退格:0eh
;enter:1ch
cmp ah,0eh
je backspace
cmp ah,1ch
je enter
jmp start ;输入其它非字符:返回程序开始,准备再次获取字符
backspace:
;ah=1,字符出栈,即删除
mov ah,1
call charstack
;显示栈中字符串
mov ah,2
call charstack
jmp start ;操作执行完毕:返回程序开始,准备再次获取字符
enter: ;0入栈,字符串结束
mov ah,0
mov al,0
call charstack
;显示字符串
mov ah,2
call charstack
jmp start
;-----------------------------------子程序入口---------------------------------
charstack:
jmp short charstart
table dw charpush,charpop,charshow
top dw 0 ;栈顶top=字符串字符个数(利用数据标号“定义变量”)
charstart:
push bx
push es
push ax
push di
push cx
;bx指向字符栈功能入口
cmp ah,2
ja sret ;ah>2则退出子程序
mov bh,0
mov bl,ah
add bx,bx
jmp word ptr table[bx] ;跳转至对应功能
;字符入栈
charpush:
mov bx,top
mov byte ptr [si+bx],al ;ds:[si + (top)]指向字符串后一个字符位
inc top ;每入栈一个字符top+1
jmp sret
;字符出栈-删除(从字符串最后一个字符开始)
charpop:
cmp top,0
je sret ;top=0表示字符栈中没有字符
dec top ;字符个数-1
mov bx,top
mov al,[si+bx] ;此时ds:[si + (top)]指向字符串最后一个字符(即被删除的字符)
jmp sret
;显示字符:0 ~ top-1
charshow:
mov bx,0b800h
mov es,bx
mov ah,0
mov al,160 ;每行160 byte,dh-行号
mul dh ;结果存储在ax
add dl,dl ;列号x2(显示区域每个字符占2 byte)
add al,dl
adc ah,0
mov di,ax ;es:di指向显示位置
cmp top,0
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty:
mov bx,0 ;此时ds:[si + bx]指向字符串第一个字符
mov cx,top
s: mov al,[si+bx]
mov es:[di],al
mov al,2 ;al存储样式
mov es:[di+1],al
inc bx ;bx指向下一个字符
add di,2 ;es:di指向下一个显示字节
loop s
mov byte ptr es:[di],' '
jmp sret
;----------------------------------------
sret: pop cx
pop di
pop ax
pop es
pop bx
ret
code ends
end start
运行结果: