Assembly language for the third time (3)

3.3 Write a subroutine nested program module, input the name and 8-character phone number from the keyboard respectively, and display it on the screen in a certain format. (sort in ascending alphabetical order)

Just modify the code for sorting the names in the courseware.

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325948455&siteId=291194637