编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及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
运行成功,截屏如下:
老师点评说,代码还需要优化,优化的代码目前还没有写,以后有时间写吧