汇编冒泡排序

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

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