注册 登录
编程论坛 汇编论坛

帮忙看看问题出在哪儿?不能输出排序的结果

西天寒星 发布于 2010-11-22 22:54, 533 次点击
STACK  SEGMENT  STACK
         DB  200  DUP(0)
STACK  ENDS

DATA  SEGMENT
BUF1  DB  30H,10H,40H,20H,50H,70H,60H,90H,80H,0,0FFH
TAB1  DB  'pai xu qian de shun xu shi: ',0DH,0AH,'$'
N1=$-BUF1
BUF2  DB  22H,11H,33H,55H,44H,77H,66H,99H,88H,0AAH,0EEH,0
TAB2  DB  0DH,0AH,'pai xu qian de shun xu shi: ',0DH,0AH,'$'
N2=$-BUF2

DATA  ENDS

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

    MOV BX,AX
    LEA DX,TAB1
    MOV AH,9
    INT 21H
    MOV AX,BX

           LEA  BX,BUF1
           MOV  CX,N1
           CALL  SORT

    MOV BX,AX   
    LEA DX,TAB2
    MOV AH,9
    INT 21H
    MOV AX,BX

           LEA   BX,BUF2
           MOV  CX,N2
           CALL  SORT  
   
         MOV   AH,4CH
           INT    21H

SORT        PROC           
    PUSH   AX      
            PUSH   DX
            PUSH   SI
            PUSH   DI
            MOV    DX,CX
            DEC    DX
            MOV    SI,1
 
LOPI:  
    MOV    DI,SI
            INC    DI
            MOV    AL,[BX+SI-1]
LOPJ:
    CMP    AL,[BX+DI-1]
            JBE    NEXT
    XCHG   [BX+DI-1],AL
    MOV    [BX+SI-1],AL
NEXT:
    INC     DI
           CMP     DI,CX
           JBE      LOPJ
    CALL PRINTIT

          INC SI  
        CMP SI,DX
        JBE LOPI
           POP      DI
           POP      SI
           POP      DX
           POP      AX
           RET
SORT    ENDP

PRINTIT      PROC  
    MOV DL,AL
    MOV AH,2
    INT 21H
    RET
PRINTIT   ENDP

CODE    ENDS
        END  BEGIN
2 回复
#2
xiaomarn2010-11-23 19:16
程序代码:
STACK  SEGMENT  STACK
         DB  200  DUP(0)
STACK  ENDS

DATA  SEGMENT
    BUF1  DB  30H,10H,40H,20H,50H,70H,60H,90H,80H,0,0FFH
    N1=$-BUF1
    TAB1  DB  'pai xu qian de shun xu shi: ',0DH,0AH,'$'
   

    BUF2  DB  22H,11H,33H,55H,44H,77H,66H,99H,88H,0AAH,0EEH,0
    N2=$-BUF2
    TAB2  DB  0DH,0AH,'pai xu qian de shun xu shi: ',0DH,0AH,'$'
   

DATA  ENDS

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

    MOV BX,AX
    LEA DX,TAB1
    MOV AH,9
    INT 21H
    MOV AX,BX

           LEA  BX,BUF1
           MOV  CX,N1
           CALL  SORT

    MOV BX,AX  

    LEA DX,TAB2
    MOV AH,9
    INT 21H
    MOV AX,BX

           LEA   BX,BUF2
           MOV  CX,N2
           CALL  SORT

  

         MOV   AH,4CH
           INT    21H

SORT        PROC         

    PUSH   AX     

            PUSH   DX
            PUSH   SI
            PUSH   DI
           

            MOV    DX,CX
            DEC    DX
            MOV    SI,1

LOPI:

    MOV    DI,SI
            INC    DI
            MOV    AL,[BX+SI-1]
LOPJ:
    CMP    AL,[BX+DI-1]
            JBE    NEXT
    XCHG   [BX+DI-1],AL
    MOV    [BX+SI-1],AL
NEXT:
    INC     DI
           CMP     DI,CX
           JBE      LOPJ
    CALL PRINTIT
    call putspc

          INC SI

        CMP SI,DX
        JBE LOPI
           POP      DI
           POP      SI
           POP      DX
           POP      AX
           RET
SORT    ENDP


putspc proc
    push ax
    mov dl,' '
    mov ah,2
    int 21h
    pop ax
    ret
putspc endp

PRINTIT      PROC
    push cx
    mov cl,4
    rol al,cl
    mov dl,al
    and dl,0fh
    call putchar
    rol al,cl
    mov dl,al
    and dl,0fh
    call putchar
    pop cx
    RET
PRINTIT   ENDP

putchar proc
    push ax
    cmp dl,0ah
    jb put1
    add dl,7
put1:
    add dl,30h
    MOV AH,2
    INT 21H
    pop ax
    ret
putchar endp
CODE    ENDS
        END  BEGIN

#3
西天寒星2010-11-23 21:19
putspc proc
    push ax
    mov dl,' '       ;这两句什么意思
    mov ah,2
    int 21h
    pop ax
    ret
putspc endp

PRINTIT      PROC
    push cx             ;为什么是CX进栈
    mov cl,4
    rol al,cl
    mov dl,al
    and dl,0fh
    call putchar
    rol al,cl
    mov dl,al
    and dl,0fh
    call putchar
    pop cx
    RET
PRINTIT   ENDP

putchar proc
    push ax
    cmp dl,0ah         ;这句有什么用?
    jb put1
    add dl,7
put1:
    add dl,30h
    MOV AH,2
    INT 21H
    pop ax
    ret
putchar endp
还请帮忙解释一下。结果显示的有点不对。谢谢了。
1