题目要求:
编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来。
- 主程序TELIST:
显示提示符INPUT NAME
调用子程序INPUT_NAME输入姓名
显示提示符INPUT A TELEPHONE NUMBER
调用子程序INPHONE输入电话号码
调用子程序PRINTLINE显示姓名及电话号码 - 子程序INPUT_NAME:
调用键盘输入子程序GETCHAR,把输入的名字存放在INBUF缓冲区 中
把INBUF中的姓名移入输出行OUTNAME
-子程序INPHONE:
调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF 缓冲区中
把INBUF中的姓名移入输出行OUTPHONE - 子程序PRINTLINE:
显示姓名及电话号码,格式为:
NAME TEL.
xxxxxx xxxxx
解题过程:
本次汇编语言程序设计要求的是输入一个名字和电话号码,并按照规则显示出来。
根据要求 我设计了一下几个子程序。
前两个是一个换行和一个输入的子程序,换行子程序可以显示换行,在主程序中会调用几次。而输入的子程序是输入一个字符并回显,也会经常调用到。
然后是三个比较长的子程序。前两个结构很相像,是把名字和电话号码输入到INBUF并回显,然后再把INBUF的数据传到输出行。由于名字和电话号码都是字符串,故程序很多可以复制。第三个是将名字和字符串输出的子程序。
因此,主程序结构就很明了了。先输出’input name’,然后调用输入名字的子程序;然后输出’input a telephone number’,再调用输入电话号码的子程序。最后输出 'NAME TEL$'和输入的数据,其中再有一些换行就可以了。
结果演示:
这里我附上全部代码,包含部分注释
代码:
DATAS SEGMENT
S1 db 'input name:$'
S2 db 'input a telephone number$'
S3 db 'NAME TEL$'
S4 DB 0AH,'$'
INBUF db 10H dup(?)
OUTNAME db 10H dup(?)
OUTPHONE db 10H dup(?)
S5 db ' $'
DATAS ENDS
STACKS SEGMENT
db 10H dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc
START:
MOV AX,DATAS
MOV DS,AX
mov dx,offset S1;显示input name
mov ah,09H
int 21H
call ent ;换行
call INPUT_NAME;2、调用子程序输入name
call ent ;换行
mov dx,offset S2;显示input a telephone number
mov ah,09H
int 21H
CALL ent ;换行
call INPUT_TEL ;调用子程序输入phone
CALL ent ;换行
call PRINT ;显示name和tel
MOV AH,4CH
INT 21H
main endp
GETCHAR proc ;输入一个字符->AL 并回显
mov ah,01H
int 21H
ret
GETCHAR ENDP
ent PROC ;显示回车
LEA DX,S4
MOV AH,9
INT 21H
RET
ent ENDP
INPUT_NAME proc
;调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区中
;把INBUF中的姓名移入输出行OUTNAME
push ax
push bx
push cx
push dx
push si
mov cx,0
mov bx,offset INBUF
inName:;不是回车的话al持续输入到bx(INBUF)
call GETCHAR
cmp al,0dH
jz endchar
mov [bx],al
inc bx
inc cx
jmp inName
endchar:
inc cl;长度cl 作为循环次数
mov al,24H
mov [bx+1],al;inbuf结束符号给最后一位(bx)
mov bx,offset INBUF;bx重新指向INBUF第一位
mov si,0
lop:
mov dl,[bx]
mov OUTNAME[si],dl
inc si
inc bx
loop lop
mov al,24H
mov OUTNAME[si],al;outname结束符号
pop si
pop dx
pop cx
pop bx
pop ax
ret
INPUT_NAME ENDP
INPUT_TEL proc near
;调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF缓冲区中
;把INBUF中的号码移入输出行OUTPHONE 结构同上
push ax
push bx
push cx
push dx
push si
mov cx,0
mov bx,offset INBUF
intel:
call GETCHAR
cmp al,0dH
jz endchar
mov [bx],al
inc bx
inc cx
jmp intel
endchar:
inc cl
mov al,24H
mov [bx+1],al;inbuf结束符号
mov bx,offset INBUF
mov si,0
lop:
mov dl,[bx]
mov OUTPHONE[si],dl
inc si
inc bx
loop lop
mov al,24H
mov OUTPHONE[si],al;outname结束符号
pop si
pop dx
pop cx
pop bx
pop ax
ret
INPUT_TEL ENDP
PRINT proc near;显示name和tel
push ax
push dx
mov dx,offset S3
mov ah,09H
int 21H
call ent
mov dx,offset OUTNAME
int 21H
mov dx,offset S5
int 21H
mov dx,offset OUTPHONE
int 21H
pop dx
pop ax
ret
PRINT ENDP
CODES ENDS
END main