汇编实现对十个数冒泡排序
1.题目
如上图,将DATA1数组中存放的10个数,从小到大排序并存放到DATA2数组中。要求画出流程图,编写代码并给出注释;提交利用Keil软件执行后,DATA2数组在存储器中数据的结果截图。
2.流程图
3.代码及注释
1.文字版
AREA RESET,CODE ;代码区
EXPORT __Vectors
EXPORT Reset_Handler
__Vectors
DCD __initial_sp
DCD Reset_Handler
Reset_Handler PROC
NOP
NOP
DATA1 ;开辟了一块空间,储存了十个数
DCD 10,-1,3,7,16,5,15,2,6,3;
ENTER ;排序的入口
LDR R1 , =DATA1 ;将DATA1的首地址给R1
LDR R2 , =DATA2 ;将DATA2的首地址给R2
MOV R0 , #0 ;用来计数
FILL_DATA2_WITH_DATA1 ;把DATA1的数复制进DATA2
LDR R3 , [R1,R0] ;将指向DATA1的地址对应的数字暂时存进R3
STR R3 , [R2,R0] ;将存入R3的对应DATA1里的数字放入DATA2对应的地方
ADD R0 , #4 ;将R0移动,使R0+R1或者R0+R2指向后一个数字
CMP R0 , #36 ;比较R0与36的大小,如果小于等于则说明还未完成复制过程
BLE FILL_UNFINISH ;如果未完成,则跳转到未完成代码区域
BGT FILL_FINISH ;如果已完成,则跳转到已完成代码区域
FILL_UNFINISH ;未完成从DATA1到DATA2的复制过程
B FILL_DATA2_WITH_DATA1 ;回去继续进行从DATA1到DATA2的复制过程
FILL_FINISH ;已完成从DATA1到DATA2的复制过程
MOV R5 , #0 ;再准备一个计数单位,用于冒泡外层计数
;冒泡排序
OUT_LOOP ;外层循环
MOV R4 , #0 ;为下一层循环提供一个计数变量
ADD R5 , #1 ;循环一次加1
MOV R9 , #10 ;限定次数
CMP R5 , R9 ;有十个数,那么外层循环应该进行十次
BLE INNER_LOOP ;如果R5<=10,说明还需要继续排序
BGT SORT_FINISH ;如果R5>10,排序结束
INNER_LOOP ;内层循环
LDR R6 , [R2,R4] ;将DATA2中的一个数取出,放进R6
ADD R4 , #4 ;指针后移
MOV R10 , #36 ;设置限定数
CMP R4 , R10 ;比较R4与限定数
BGT OUT_LOOP ;如果R4大于36,则内层循环已经结束,回到外层
LDR R7 , [R2,R4] ;将DATA2里的下一个数取出来,放进R7
CMP R6 , R7 ;比较R6与R7,即相当于比较C语言中的arr[j]与arr[j+1]
BLE LESS_THAN ;如果R6小于等于R7,不需要改变,可以继续内层循环
BGT GREATER_THAN ;如果R6大于R7,即arr[j]>arr[j+1],则需要交换两者位置
LESS_THAN ;R6小于等于R7,不需要改变
B INNER_LOOP ;回内层继续循环
GREATER_THAN ;R6大于R7,进行交换操作
STR R6 , [R2,R4] ;将R6对应的数放到R7里
ADD R8 , R2 , R4 ;将R7的地址给R8
SUB R8 , R8 , #4 ;R8自减得到R6的地址
STR R7 , [R8] ;将R7的值给R6
B INNER_LOOP ;交换完成后去到下一个内层循环
SORT_FINISH ;排序结束
B .
ENDP
AREA STACK,DATA ;数据区
DATA2
DCD 1,2,3,4,5,6,7,8,9,10
SPACE 0x100
__initial_sp
END