汇编(四)
使用汇编语言实现冒泡排序算法,对数据段中的数据进行由小到大排序。
冒泡排序算法:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序每遍历一次就可以将当前剩下数据中的最大值推向“顶端”。
在学习了基本的汇编指令后,又了解了冒泡排序的基本思想,那么用汇编实现冒泡排序还是一件挺容易的事。如果用高级语言实现过冒泡,那就再好不过了。用汇编实现只不过是换了一种语言工具而已。
其具体实现如下,其中在数据段中定义了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
——来自 熊猫 [http://www.cnblogs.com/xiongmao-cpp/]