回 帖 发 新 帖 刷新版面

主题:字符串的排序

DATA  SEGMENT               
   NAMEPAR  LABEL BYTE
   MAXNLEN   DB  7
   NAMELEN   DB  ?
   NAMEFLD   DB  7 DUP (?)
   CRLF   DB  0DH,0AH,'$'
   ENDADDR   DW  ?
   MSG1   DB 'NAME?','$'
   MSG2   DB   'SORTED NAME:',0DH,0AH,'$'
   NAMECTR   DB  0
   NAMETAB   DB  10 DUP(6 DUP(' '))
   NAMESAV   DB  6 DUP(?),0DH,0AH,'$'
   SWAPPED   DB  0   
DATA  ENDS

STACK    SEGMENT  PARA  STACK  'STACK' 
    DW 100 DUP (?)   
STACK    ENDS 

CODE    SEGMENT        
   ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
    
MAIN      PROC    FAR    
START:    PUSH     DS    
    XOR    AX,AX
     PUSH    AX    
        
        MOV    AX,DATA
       MOV     DS,AX
        MOV     ES,AX      

    MOV     AX,STACK
    MOV     SS,AX    
    MOV    SP,200    

        CLD
        LEA    DI,NAMETAB
A20LOOP:
       CALL   B10READ
       CMP    NAMELEN,0
       JZ     A30
       CMP    NAMECTR,10
       JE     A30
       CALL   D10STOR
       JMP    A20LOOP
A30:
      CMP   NAMECTR,1
      JBE   A40
      CALL  G10SORT
      CALL  K10DISP
A40:
      RET
MAIN  ENDP

B10READ   PROC  NEAR
      MOV  AH,9
      LEA  DX,MSG1
      INT  21H
      MOV  AH,0AH
      LEA  DX,NAMEPAR
      INT  21H
      MOV  AH,9
      LEA  DX,CRLF
      INT  21H 
      MOV  BH,0
      MOV  BL,NAMELEN
      MOV  CX,7
      SUB  CX,BX
B20:
      MOV  NAMEFLD[BX],20H
      INC  BX
      LOOP  B20
      RET
B10READ   ENDP

D10STOR  PROC  NEAR
     INC  NAMECTR
     CLD
     LEA  SI,NAMEFLD
     MOV  CX,6
     REP  MOVSB
     RET
D10STOR  ENDP

G10SORT  PROC NEAR
     SUB   DI,12
     MOV   ENDADDR,DI
G20:
     MOV  SWAPPED,0
     LEA  SI,NAMETAB
G30:
     MOV  CX,6
     MOV  DI,SI
     ADD  DI,6
     MOV  AX,DI
     MOV  BX,SI
     REPE CMPSB
     JBE  G40
     CALL H10XCHG
G40:
     MOV  SI,AX
     CMP  SI,ENDADDR
     JBE  G30
     CMP  SWAPPED,0
     JNZ  G20
     RET
G10SORT   ENDP

H10XCHG PROC NEAR
     MOV  CX,6
     LEA  DI,NAMESAV
     MOV  SI,BX
     REP  MOVSB
     MOV  CX,6
     MOV  DI,BX
     MOV  SI,AX
     REP  MOVSB
     MOV  CX,6
     LEA  SI,NAMESAV
     MOV  DI,AX
     REP  MOVSB
     MOV  SWAPPED,1
     RET
H10XCHG  ENDP

K10DISP  PROC  NEAR
     MOV  AH,9
     LEA  DX,MSG2
     INT  21H
     LEA  SI,NAMETAB
k20: LEA  DI,NAMESAV
     MOV   CX,6
     REP   MOVSB
     MOV   AH,9
     LEA   DX,NAMESAV
     INT   21H
     DEC   NAMECTR
     JNZ   K20
     RET
K10DISP   ENDP

CODE   ENDS
END   START
以上是我的程序,我不知道怎么回事,结果总是不对,那位帮我看看呀

回复列表 (共3个回复)

沙发

这个程序是对输入的字符串排序后输出

板凳

改过
DATA  SEGMENT               
   NAMEPAR  LABEL BYTE
   MAXNLEN   DB  7
   NAMELEN   DB  ?
   NAMEFLD   DB  7 DUP (?)
   CRLF   DB  0DH,0AH,'$'
   ENDADDR   DW  ?
   MSG1   DB 'NAME?','$'
   MSG2   DB   'SORTED NAME:',0DH,0AH,'$'
   NAMECTR   DB  0
   NAMETAB   DB  10 DUP(6 DUP(' '))
   NAMESAV   DB  6 DUP(?),0DH,0AH,'$'
   SWAPPED   DB  0   
DATA  ENDS

STACK    SEGMENT  PARA  STACK  'STACK' 
    DW 100 DUP (?)   
STACK    ENDS 

CODE    SEGMENT        
   ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
    
START:    
        MOV    AX,DATA
       MOV     DS,AX
        MOV     ES,AX          

        CLD
        LEA    DI,NAMETAB
A20LOOP:
       CALL   B10READ
       CMP    NAMELEN,0
       JZ     A30
       CMP    NAMECTR,10
       JE     A30
       CALL   D10STOR
       JMP    A20LOOP
A30:
      CMP   NAMECTR,1
      JBE   A40
      CALL  G10SORT
      CALL  K10DISP
A40:

    mov ah,04ch
    int 21h
    
B10READ   PROC  NEAR
      MOV  AH,9
      LEA  DX,MSG1
      INT  21H
      MOV  AH,0AH
      LEA  DX,NAMEPAR
      INT  21H
      MOV  AH,9
      LEA  DX,CRLF
      INT  21H 
      MOV  BH,0
      MOV  BL,NAMELEN
      MOV  CX,7
      SUB  CX,BX
B20:
      MOV  NAMEFLD[BX],20H
      INC  BX
      LOOP  B20
      RET
B10READ   ENDP

D10STOR  PROC  NEAR
     INC  NAMECTR
     CLD
     LEA  SI,NAMEFLD
     MOV  CX,6
     REP  MOVSB
     RET
D10STOR  ENDP

G10SORT  PROC NEAR
     SUB   DI,12
     MOV   ENDADDR,DI
G20:
     MOV  SWAPPED,0
     LEA  SI,NAMETAB
G30:
     MOV  CX,6
     MOV  DI,SI
     ADD  DI,6
     MOV  AX,DI
     MOV  BX,SI
     REPE CMPSB
     JBE  G40
     CALL H10XCHG
G40:
     MOV  SI,AX
     CMP  SI,ENDADDR
     JBE  G30
     CMP  SWAPPED,0
     JNZ  G20
     RET
G10SORT   ENDP

H10XCHG PROC NEAR
     MOV  CX,6
     LEA  DI,NAMESAV
     MOV  SI,BX
     REP  MOVSB
     MOV  CX,6
     MOV  DI,BX
     MOV  SI,AX
     REP  MOVSB
     MOV  CX,6
     LEA  SI,NAMESAV
     MOV  DI,AX
     REP  MOVSB
     MOV  SWAPPED,1
     RET
H10XCHG  ENDP

K10DISP  PROC  NEAR
     MOV  AH,9
     LEA  DX,MSG2
     INT  21H
     LEA  SI,NAMETAB
k20: LEA  DI,NAMESAV
     MOV   CX,6
     REP   MOVSB
     MOV   AH,9
     LEA   DX,NAMESAV
     INT   21H
     DEC   NAMECTR
     JNZ   K20
     RET
K10DISP   ENDP

CODE   ENDS
END   START

3 楼

明白了,太谢谢你了

我来回复

您尚未登录,请登录后再回复。点此登录或注册