彙編冒泡排序

datas segment
    message db 'sorted: ',0ah,0dh,'$'       ; 提示信息
    space db ' ','$'   ; 空格
    data  dw 0,1,2,3,4,6,5,7,8,9,10,11,12,13,14 ; 數組元素
    count dw 15   ; 數組的長度
datas ends


stacks segment
    dw 256 dup(?)
stacks ends


codes segment

start:
    mov ax,datas
    mov ds,ax
    mov si, 0  ;偏移地址初始化
    mov cx, count ;循環次數

;----------排序-----------
    mov cx, count  ; 循環次數
    mov di, 0

loop1:
    call sort
    add di, 2     ; 數組偏移位加一
    loop loop1

    mov dx, offset message  ; 打印提示文字
    mov ah, 9
    int 21h

    mov cx, count    ; 循環次數
    mov di, 0   ; 數組偏移位

loop2:
    call print ; 打印數字
    call PrintSpace  ; 打印空格
    add di , 2
    loop loop2

exit:    ; 退出
    mov ah, 4ch
    int 21h

; 在每個數字後輸出空格
PrintSpace proc near
    push ax  ; 保存數據
    push dx
    mov dx, offset space ;' '

    mov ah, 9
    int 21h

    pop dx  ; 數據還原
    pop ax
    ret 
PrintSpace endp


; 將數組中的元素一一輸出

print proc near
    push ax   ; 保存數據
    push bx
	push cx
	push dx 


    mov cx, 0
    mov bx, 10
    mov ax, data[di]
    last:
        mov dx, 0
        div bx ; DIV商放AX,餘數放入DX
        push dx
        inc cx ; 循環次數,表示數字的位數
        cmp ax, 0  ; 
        jnz last

    age:
        pop dx
        or dx, 30h  ; 將dx中的數值轉換成ASCII編碼以輸出在屏幕上  

        mov ah, 2
        int 21h         
        
        loop age    
        
        pop  dx     ; 數據還原
        pop  cx
	    pop  bx
	    pop  ax         
	    
	    ret

print endp



;---------數字排序---------------------
sort proc near
    push bx
    push dx
    mov  si,di ; 將SI賦值爲DI

loop1:
    add  si,2   ; 偏移加2,因爲數字定義爲DW
    mov  bx,data[di]  ; 第一個數
    cmp  bx,data[si] 
    ja   swap   ; 取的第一個數大於第二個數?
    jmp  next   ; 否則不修改,判斷是否爲最後一個數字

swap:    
    mov  dx,data[si]    ; 將這兩個數進行調換
    mov  data[di],dx
    mov  data[si],bx 
next:  
    mov ax, count    
    add ax,ax
    cmp si,ax   ; 如果SI偏移位大於最大的偏移位,則退出循環

    jl   loop1
    pop  dx
    pop  bx

    ret
    sort endp   

codes ends

    end start

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章