本人汇编小菜鸟,求大神汇编语言中,我写的冒泡排序程序为什么不能排序十位数以上的数?

2025-04-26 20:22:44
推荐回答(2个)
回答1:

程序略作修改:

        DATA  SEGMENT
       ARRAY  DB        0,1,5,3,9,2,4,2,1,7,10,20,50,80
      NUMBER  EQU       $-ARRAY
        DATA  ENDS

        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA
      START:  MOV       AX,DATA
              MOV       DS,AX
              MOV       BX,NUMBER
              MOV       DX,BX
       Z000:  DEC       BX
              MOV       CX,BX
              LEA       SI,ARRAY
       Z008:  MOV       AL,[SI]
              CMP       AL,[SI+1]
              JL        FDG
              XCHG      AL,[SI+1]
              MOV       [SI],AL
        FDG:  INC       SI
              LOOP      Z008
              DEC       DX
              CMP       DX,1
              JA        Z000

            ; 以下输出排序结果 
              LEA       SI,ARRAY
              MOV       CX,NUMBER
         @P:
              MOV       AL,[SI]
              MOV       AH,0
              MOV       BL,10
              DIV       BL
              PUSH      AX
              MOV       DL,AL
              OR        DL,30H
              MOV       AH,2
              INT       21H
              POP       AX
              MOV       DL,AH
              OR        DL,30H
              MOV       AH,2
              INT       21H
              MOV       DL,32
              INT       21H
              INC       SI
              LOOP      @P
                            
              MOV       AH,4CH
              INT       21H
        CODE  ENDS
              END       START

回答2:

“di=?” 不知道, [di] 传送到 bl、dl的是什么? bx的高位“bh=?”也不知道 !

程序看着有点乱。给你一个子程序,你研究下:

;===============================
; 单个字符串内部的排序(冒泡排序)----其实也适用于字节数据排序
sort  proc near
      ; 串长度置入cx,串(或数组)首地址置入 si
      push ax
      push cx
      push dx
      push si
      push di
      pushf
      push cx
      pop dx
      dec dx
@sortl1:
      mov cx,dx
      mov di,si
@sortl2:
      mov al,[di+1]
      cmp al,[di]
      ja @sortnext  ;从大到小还是从小到大,改这句即可, 或 jb/jg/jl
      xchg al,[di]
      mov [di+1],al
@sortnext:
      inc di
      loop @sortl2
      dec dx
      jnz @sortl1
      popf
      pop di
      pop si
      pop dx
      pop cx
      pop ax
      ret
sort  endp
;====================================

别看有那么多压栈、弹栈操作,关键的代码很少! 这个代码是最优的。把它研究透。