汇编子程序嵌套结构程序 输入姓名及8个字符的电话号码,并以一定的格式显示出来。(NAME TEL)

题目要求:

编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及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
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值