用ARM汇编对十个数进行排序(冒泡实现)

题目:代码区有十个数字,存放在DATA1,现在需要将这个十个数从小到大排序并存放在数据区的DATA2中。

先直接上一个冗杂一点的代码,不过应该比较好理解。因为KEIL的注释复制过来会乱码,所以复制过来的时候把注释都删了。但是代码后面有截图,截图里有注释,基本每一步都注释过,绝对看得懂。

	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
	LDR R2 , =DATA2
	MOV R0 , #0 
	
	
FILL_DATA2_WITH_DATA1 
	
	LDR R3 , [R1,R0] 
	STR R3 , [R2,R0] 
	ADD R0 , #4 
	CMP R0 , #36 
	BLE FILL_UNFINISH
	BGT FILL_FINISH 


FILL_UNFINISH 

	B FILL_DATA2_WITH_DATA1 


FILL_FINISH 
	
	MOV R5 , #0 
	


OUT_LOOP 

	MOV R4 , #0 
	ADD R5 , #1 
	MOV R9 , #10 
	CMP R5 , R9 
	BLE INNER_LOOP 
	BGT SORT_FINISH 
	

INNER_LOOP 
	
	LDR R6 , [R2,R4] 
	ADD R4 , #4 
	MOV R10 , #36 
	CMP R4 , R10 
	BGT OUT_LOOP 
	LDR R7 , [R2,R4] 
	CMP R6 , R7 
	BLE LESS_THAN
	BGT GREATER_THAN 
	

LESS_THAN 
	B INNER_LOOP 

GREATER_THAN 
	STR R6 , [R2,R4] 
	ADD R8 , R2 , R4 
	SUB R8 , R8 , #4 
	STR R7 , [R8] 
	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



截图,包含注释:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述




这是Debug的截图

这是DEBUG的图片




再给一个精炼的代码:

		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;
main      
        MOV R0,#0
		MOV R7,#0
		LDR R6,=DATA1   
        LDR R2,=DATA2

LOOP5
        LDR R8,[R6,R7]
		STR R8,[R2,R7]
		ADD R7,#4
		CMP R7,#40
		BLT LOOP5
		BGE LOOP1
			
LOOP1  
        ADD R1,R0,#4
        B LOOP2
        
LOOP2  
        LDR R3,[R2,R0]
        LDR R4,[R2,R1]
        CMP R3,R4
        BGT EXCHANGE 
        B LOOP3          
EXCHANGE  
        STR R3,[R2,R1]
        STR R4,[R2,R0] 
        B LOOP3        
LOOP3 
        ADD R1,R1,#4
        MOV R5,#40 
        CMP R1,R5
        BLT LOOP2
        BGE LOOP4 
LOOP4	
        ADD R0,R0,#4
        CMP R0,#36
        BLT LOOP1
        BGE STOP
STOP
        B STOP
        B       main
 		B .
 		ENDP
 


 		AREA STACK,DATA
	 
DATA2
 		DCD 0,0,0,0,0,0,0,0,0,0 ;
 		SPACE 0x100
__initial_sp

 		END
  • 13
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
使用ARM汇编指令实现冒泡排序的关键是编写内层循环的代码,其中涉及到据交换和循环次的控制。首先,可以使用STR(据装载指令)来实现据的交换。接着,通过CMP指令来控制内层循环的次。最后,编写外层循环的代码,同样使用CMP指令来控制整个排序的次。以下是一个用ARM汇编指令实现冒泡排序的例子: ``` .section .data numbers: .byte 5, 8, 2, 1, 9, 3, 6, 7, 4 @ 待排序的组 .section .text .global _start _start: LDR r1, =numbers @ 加载组的地址 LDR r2, =9 @ 组长度 MOV r3, #0 @ 外层循环计器 outer_loop: MOV r4, #0 @ 内层循环计器 MOV r5, r2 @ 将组长度保存到r5中 inner_loop: LDRB r6, [r1 @ 加载当前元素到r6 LDRB r7, [r1, #1 @ 加载下一个元素到r7 CMP r6, r7 @ 比较两个元素的大小 BLE swap @ 如果r6小于等于r7,则交换两个元素 increment: ADD r1, #1 @ 组指针加1 ADD r4, #1 @ 内层循环计器加1 CMP r4, r5 @ 比较内层循环计器和组长度 BNE inner_loop @ 如果内层循环计器不等于组长度,则继续内层循环 decrement: SUB r5, #1 @ 组长度减1 CMP r5, #1 @ 比较组长度和1 BNE outer_loop @ 如果组长度不等于1,则继续外层循环 exit: B exit swap: STRB r7, [r1 @ 将r7的值存储到当前元素位置 STRB r6, [r1, #1 @ 将r6的值存储到下一个元素位置 B increment @ 继续增加内层循环计器,进行下一次循环 ``` 这段代码使用ARM汇编指令实现冒泡排序算法。在排序前,先定义了一个待排序的组numbers。然后使用LDR指令加载组的地址和长度。之后,使用外层循环和内层循环实现冒泡排序的逻辑。最后,通过STRB指令将交换后的值存储到对应的位置。请注意,在实际使用中,可能需要根据具体情况对代码进行修改和调试。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧州刺史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值