3.3编写一个子程序嵌套的程序模块,分别从键盘输入姓名及8个字符的的电话号码,以一定的格式显示在屏幕上。(以字母升序排序)
修改课件里人名排序的代码即可。
DSEG SEGMENT PARA 'DATA'
NAMEPAR LABEL BYTE
MAXLEN DB 31
NAMELEN DB ?
NAMEFLD DB 31 DUP(?)
CRLF DB 13,10,'$'
ENDADDR DW ?
MESG1 DB 'NAME?$'
MESG2 DB 'PhoneNumber?$'
NAMECTR DB 0
NAMETAB DB 30 DUP(20 DUP(' '))
NAMESAV DB 20 DUP(?),13,10,'$'
SWAPPED DB 0
DSEG ENDS
CSEG SEGMENT PARA 'CODE'
ASSUME CS:CSEG, DS:DSEG
MAIN PROC FAR
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
CLD
LEA DI,NAMETAB ;表首址作为目的串的首址
CALL Q10CLR ;清屏
CALL Q20CURS ;设置光标
A20LOOP:
CALL B10READ ;调用输入子程序
CMP NAMELEN,0
JZ A30
CALL D10STOR ;存储
JMP A20LOOP
A30:
CALL Q10CLR
CALL Q20CURS
CMP NAMECTR,1
JBE A40
CALL G10SORT
A40:
CMP NAMECTR,0
JBE EXIT
CALL K10DISP
EXIT:
MOV AX,4C00H
INT 21H
MAIN ENDP
;名字及电话号码输入子程序
B10READ PROC
MOV AH,9
LEA DX,MESG1
INT 21H
MOV AH,0AH
LEA DX,NAMEPAR
INT 21H
CMP NAMELEN,0
JZ EI
MOV AH,9
LEA DX,CRLF
INT 21H
MOV AH,9
LEA DX,MESG2
INT 21H
MOV CX,8
MOV BH,0
MOV BL,NAMELEN
MOV NAMEFLD[BX],0
INC BX
PNUM:
MOV AH,01H
INT 21H
MOV NAMEFLD[BX],AL
INC BX
LOOP PNUM
MOV NAMELEN,BL
MOV AH,9
LEA DX,CRLF
INT 21H
MOV BH,0 ;缓存区的空余部分填空格
MOV BL,NAMELEN
MOV CX,21
SUB CX,BX
B20:
MOV NAMEFLD[BX],20H
INC BX
LOOP B20
EI:
RET
B10READ ENDP
;名字存储子程序
D10STOR PROC
;名字个数计数器加1
INC NAMECTR
CLD
LEA SI,NAMEFLD
MOV CX,10
REP MOVSW
RET
D10STOR ENDP
;排序子程序
G10SORT PROC
SUB DI,40
MOV ENDADDR,DI
G20:
MOV SWAPPED,0 ;交换标志清0
LEA SI,NAMETAB
G30:
MOV CX,20
MOV DI,SI
ADD DI,20
MOV AX,DI
MOV BX,SI
REPE CMPSB
JBE G40
CALL H10XCH ;调用交换顺序子程序
G40:
MOV SI,AX
CMP SI,ENDADDR
JBE G30
CMP SWAPPED,0
JNZ G20
RET
G10SORT ENDP
;交换表的内容
H10XCH PROC
MOV CX,10
LEA DI,NAMESAV
MOV SI,BX
REP MOVSW
MOV CX,10
MOV DI,BX
REP MOVSW
MOV CX,10
LEA SI,NAMESAV
REP MOVSW
MOV SWAPPED,1
RET
H10XCH ENDP
;显示已排序的名字表
K10DISP PROC
LEA SI,NAMETAB
K20:
LEA DI,NAMESAV
MOV CX,10
REP MOVSW
MOV AH,9
LEA DX,NAMESAV
INT 21H
DEC NAMECTR
JNZ K20
RET
K10DISP ENDP
;清屏子程序
Q10CLR PROC
MOV AX,0600H
MOV BH,61H
SUB CX,CX
MOV DX,184FH
INT 10H
RET
Q10CLR ENDP
;设置光标位置子程序
Q20CURS PROC
MOV AH,2
SUB BH,BH
SUB DX,DX
INT 10H
RET
Q20CURS ENDP
CSEG ENDS
END MAIN ;SET ENTRY POINT