汇编语言:编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来。

编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来。

具体要求:

主程序TELIST中包括以下功能

(1) 显示提示符INPUT_NAME:;

(2) 调用子程序INPUT_NAME输入姓名;

(3) 显示提示符INPUT TELEPHONE NUMBER:;

(4) 调用子程序Input_PHONE输入电话号码;

(5) 调用子程序PRINTLINE显示姓名及电话号码。

子程序INPUT_NAME中包括以下功能

(1) 调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区;

(2) 把INBUF中的姓名移入输出行OUTNAME。

子程序Input_PHONE中包括以下功能

(1) 调用键盘输入子程序GETCHAR,把输入的8位号码存放在INBUF缓冲区;

(2) 把INBUF中的号码移入输出行OUTPHONE。

执行子程序PRINTLINE输出效果如下:

显示姓名及电话号码,格式为:

NAME TEL

XXX     XXX

DATAS SEGMENT
    ;此处输入数据段代码  
    STR1 DB 'INPUT_NAME:',0DH,0AH,'$'
    STR2 DB 0DH,0AH,'INPUT  TELEPHONE  NUMBER:',0DH,0AH,'$'
    INBUF DB 9,?,9 DUP('?')
    OUTNAME DB 10 DUP('$')
    OUTPHONE DB 10 DUP('$')
    BUF1 DB 0DH,0AH,'NAME$'
    BUF2 DB 'TEL',0DH,0AH,'$'
    KG DB '                $'
    X DB 20 DUP(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
;----------------------主程序-------------------
TELIST PROC FAR
	MOV X,0
	MOV AH,9
	LEA DX,STR1;显示提示符INPUT_NAME:
	INT 21H
	
	CALL INPUT_NAME;调用子程序INPUT_NAME输入姓名
	
	MOV AH,9
	LEA DX,STR2;显示提示符INPUT TELEPHONE  NUMBER:
	INT 21H
	
	CALL Input_PHONE;调用子程序Input_PHONE输入电话号码
	
	CALL PRINTLINE;调用子程序PRINTLINE显示姓名及电话号码
    ;JMP TELIST
;OUT1:    
    MOV AH,4CH
    INT 21H
    
TELIST ENDP
;-------------------------主程序结束--------------------


;调用键盘输入子程序GETCHAR
GETCHAR PROC NEAR

	MOV BX,0
	
AGAIN:
	MOV AH,1
	INT 21H
	MOV INBUF[BX],AL
	INC BX
	CMP AL,0DH
	JNZ AGAIN
	
	RET
GETCHAR ENDP


;子程序INPUT_NAME输入姓名
INPUT_NAME PROC NEAR
	CALL GETCHAR	
    MOV SI,0
LP2:    
    MOV AL,INBUF[SI]
    CMP AL,0DH
    JZ EXIT
    MOV OUTNAME[SI],AL
    INC SI
    JMP LP2

EXIT:       
    RET
INPUT_NAME ENDP

;调用子程序Input_PHONE输入电话号码

Input_PHONE PROC NEAR

	CALL GETCHAR
	
	MOV DI,0
LP1:	
	MOV AL,INBUF[DI]
	MOV OUTPHONE[DI],AL
	INC DI
	CMP AL,0DH
	JNZ LP1
	
	RET
Input_PHONE ENDP

;调用子程序PRINTLINE显示姓名及电话号码
PRINTLINE PROC NEAR

	MOV AH,9
	LEA DX,BUF1
	INT 21H;输出 NAME
	
	MOV AH,9
	LEA DX,KG
	INT 21H;输出空格
	
	MOV AH,9
	LEA DX,BUF2
	INT 21H;输出TEL,并且换行
	
	MOV AH,9
	MOV DX,OFFSET OUTNAME
	INT 21H;输出-输入的名字
	
	MOV AH,9
	LEA DX,KG
	INT 21H;输出空格
	
	MOV AH,9
	MOV DX,OFFSET OUTPHONE
	INT 21H;输出-输入的8位手机号码
	
	RET
PRINTLINE ENDP	


CODES ENDS
    END START

编译过程中:
1.输出都是??????????????

可能是因为在输入过程中,我走捷径,直接选择调用10号功能,输入字符串,然后将AL作为中介,把INBUF给AL,再把AL给OUTNAME(OUTPHONE同上),后来换了1号功能,逐个输入,在遇见回车键的时候跳出,字符串拷贝的时候,选择逐个转移。

2.输入时,输入完成后,按回车键只会跳到下一行,无限循环输入,后来,,,,不知道怎么就好了

;子程序INPUT_NAME输入姓名
INPUT_NAME PROC NEAR

	CALL GETCHAR
	
	MOV SI,0
LP2:	
	MOV AL,INBUF[SI]
	MOV OUTNAME[SI],AL
	INC SI
	CMP AL,0DH
	JNZ LP2
		
	RET
INPUT_NAME ENDP

**不能跳出是因为,之前,我把
MOV SI,0
放在了LP2之后,所以每次循环SI=0,**循。。。。。
桥豆麻袋,这和SI有什么关系,我不是在比较AL和0DH吗???????

对了,是因为在调用GETCHAR子程序结束后,程序走进了LP1中,然后把GETCAR[SI]的值给了AL,比较AL和0DH,但因为SI始终等于0,所以AL始终不能调到回车键,所以循环无法结束,子程序INPUT_NAME无法结束

3.输出只能输出手机号,无法输出名字
在这里插入图片描述。。。。。。。。。。。。。。。
怎么办??????????????????头秃

经过询问老师,DEBUG调试,发现是因为OUTNAME中,最后存入了一个回车(回到行首),所以输出的空格把OUTNAME的数据覆盖掉
只要将

;子程序INPUT_NAME输入姓名
INPUT_NAME PROC NEAR

	CALL GETCHAR
	
	MOV SI,0
LP2:	
	MOV AL,INBUF[SI]
	MOV OUTNAME[SI],AL
	INC SI
	CMP AL,0DH
	JNZ LP2
		
	RET
INPUT_NAME ENDP

修改为

;子程序INPUT_NAME输入姓名
INPUT_NAME PROC NEAR
	CALL GETCHAR	
    MOV SI,0
LP2:    
    MOV AL,INBUF[SI]
    CMP AL,0DH
    JZ EXIT
    MOV OUTNAME[SI],AL
    INC SI
    JMP LP2

EXIT:       
    RET
INPUT_NAME ENDP

运行成功,截屏如下:
在这里插入图片描述
老师点评说,代码还需要优化,优化的代码目前还没有写,以后有时间写吧

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个叶绿体

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值