欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言:使用冒泡排序算法将10个数按从小到大顺序排列

程序员文章站 2022-04-04 11:05:41
...

汇编语言:冒泡排序算法

题目描述

自定义一组有首地址为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

排序结果

冒泡排序前运行前内存数据内容:
汇编语言:使用冒泡排序算法将10个数按从小到大顺序排列

冒泡排序后:
汇编语言:使用冒泡排序算法将10个数按从小到大顺序排列

冒泡排序运行正确,此题目完成!