汇编语言:冒泡排序算法
题目描述
自定义一组有首地址为data的10个字的数组,请利用冒泡排序算法来编写程序,使该数组中的数按照从小到大的次序有序化。(注:10个字可以自己定义。)
datas segment
data1 dw 7,5,3,2,6,9,10,1,8
datas ends
冒泡排序是一种较为简单的排序算法,需要使用嵌套循环。每一个外循环会将未排序数据中的最大值排到末尾,每一个小循环会将相邻两个数比较大小,从而使较大的数下沉,较小的数上浮。
本题中,我们需要使用条件转移指令,比较指令(CMP),交换指令(XCHG)。值得一提的是,CMP和XCHG的两个操作数不能同时为内存中的数据,但可以一个是寄存器,一个是内存数据。所以,在比较和交换数据的时候,我们需要将其中一个内存数据放到寄存器中。
(代码中有注释,可直接看代码)
思路:
将循环次数放入CX(设需要排序的数据有N个,则需要执行N-1个循环,即此时应MOV CX,9)。
1.CX-1判断CX是否符合循环条件,当CX=0时,程序结束;否则,SI置零,BX置2倍的CX作为小循环的判断条件(若数据使用DB定义则无需使用BX,可直接使用CX);
2.将DATA1[SI]放入AX寄存器中,并与DATA1[SI+2]作比较(由于本体数据定义时DW,所以用+2,若使用DB定义数据则应+1),若小于等于,则执行第3步;否则交换DATA1[SI]和DATA1[SI+2];
3.比较SI和BX,相等时执行第1步,否则,SI+2,跳转到第二步。
以上就是一个较为简单的冒泡排序法步骤,接下来看代码:
DATAS SEGMENT
DATA1 DW 7,5,3,2,6,9,10,1,8
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,9
L1: ;最外层循环
MOV SI,0 ;设置SI为零
CMP CX,0 ;判断循环是否结束
JE EXIT
DEC CX ;cx-1
MOV BX,CX
ADD BX,CX ;将bx置为cx的2倍,用来判断SI结束时的大小
;若数据以字节定义,则只需要将bx置为cx即可
L2:
MOV AX,DATA1[SI] ;不能直接比较内存中的数字,所以我们需要将其中一个数字放到寄存器AX中
CMP AX,DATA1[SI+2] ;比较两个数
JLE L3 ;小于等于的话,则直接跳到下一对数据的比较
XCHG AX,DATA1[SI+2] ;若大于,则通过两个XCHG语句,交换两内存中的数字
XCHG AX,[SI]
;内层循环结束时跳到外层循环
L3:
CMP SI,BX
JE L1
ADD SI,2 ;si+2,开始下一对数的比较
JMP L2
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
排序结果
冒泡排序前运行前内存数据内容:
冒泡排序后:
冒泡排序运行正确,此题目完成!