给出下的程序段,其中数据区存放了若干学生的姓名,请输入学生序号,在屏幕最上面一行输出对应学生的姓名。
assume cs:code, ds:data
data segment
stu dw stu1,stu2,stu3,stu4,stu5
stu1 db 'Zhang San',0
stu2 db 'Li Si',0
stu3 db 'Wang Wu',0
stu4 db 'Zhao Liu',0
stu5 db 'Qian Er',0
data ends
注意:clear子程序比较重要,他负责清除当前屏幕第一行,防止前面显示的学生姓名对后面需要显示的学生姓名有干扰。
assume cs:code, ds:data
data segment
stu dw stu1,stu2,stu3,stu4,stu5
stu1 db 'Zhang San',0
stu2 db 'Li Si',0
stu3 db 'Wang Wu',0
stu4 db 'Zhao Liu',0
stu5 db 'Qian Er',0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800h
mov es, ax
input: ;输入字符
mov ah,1
int 21h;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码
sub al, 30h;相减后,al中保存的ASCII变为数字
mov ah,0
cmp ax,0;为0时退出,为1-5时在屏幕最上面一行输出对应人的姓名
je exit
cmp ax,5;大于5时,无响应,可继续输入其他字符
ja input
add ax,ax
sub ax,2
mov bx,ax
mov bx,stu[bx]
mov si,0
call clear;调用子程序
output:
mov dl,[bx];将名字输出到屏幕的第一行
cmp dl,0
je input
mov es:[si],dl
inc bx
add si,2
jmp output
exit: mov ah,4ch;输入的字符等于0就退出
int 21h
;子程序名:clear
;功 能:清除第一行,通过把显示屏第一行设置为空格符来达到清除第一行的目的
;入口参数:无
;出口参数:无
clear proc
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,80;一行共80个字
clear1:
mov byte ptr es:[bx],' ';循环把第一行设为空格符
add bx,2
loop clear1
pop es
pop cx
pop bx
ret
clear endp
code ends
end start
运行结果:
①输入字符1时:
②输入字符2时:
③输入字符3时:
④输入字符4时:
⑤输入字符5时:
⑥输入大于5的字符时,没有变化。
⑦输入字符0时,退出。