汇编(四)

  使用汇编语言实现冒泡排序算法,对数据段中的数据进行由小到大排序。

  冒泡排序算法:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序每遍历一次就可以将当前剩下数据中的最大值推向“顶端”。

  在学习了基本的汇编指令后,又了解了冒泡排序的基本思想,那么用汇编实现冒泡排序还是一件挺容易的事。如果用高级语言实现过冒泡,那就再好不过了。用汇编实现只不过是换了一种语言工具而已。

  其具体实现如下,其中在数据段中定义了score,包含15个字节变量,该代码就是对这15个字节变量进行排序。

;采用冒泡排序法对分数进行排序
;将最大值保存在max中,将最小值保存在min中
stack segment stack
    db 2014 dup(?)
stack ends
data segment
    score db 20,10,3,40,50,44,56,30,5,43,12,34,34,44,89
    br db 0dH,0aH,'$'
    min db ?
    max db ?
    maxAddr dw ?
data ends
code segment 'code'
    assume cs:code,ds:data,ss:stack
start:
    mov ax,data
    mov ds,ax
    mov ax,offset score
    add ax,sizeof score
    dec ax
    mov maxAddr,ax
    mov cx,14
    mov si,0
lp1:                    ;外循环
    mov bx,si
lp2:                    ;内循环
    mov di,bx            
    inc di                ;di=bx+1
    mov al,score[di]
    cmp score[bx],al
    jg chgval
    jmp lp2End
chgval:                    ;若数据顺序错误,交换他们的值
    xchg score[bx],al
    mov score[di],al
    jmp lp2End
lp2End:
    inc bx
    cmp bx,maxAddr
    jnl lp1End
    jmp lp2
lp1End:
    dec maxAddr
    loop lp1
done:
    ;将最大值保存到max中,最小值报保存到min中
    mov si,offset score
    mov al,score[si]
    mov min,al
    add si,sizeof score
    dec si
    mov al,score[si]
    mov max,al
    
    mov si,0
    mov cx,8
    mov bl,score[si]

    mov dx,offset br
    mov ah,09H
    int 21H
    mov ax,4c00H
    int 21H
    
code    ends
    end start
原文地址:https://www.cnblogs.com/xiongmao-cpp/p/4920462.html