【ARM学习笔记】C与汇编混合编程—冒泡排序算法

概述

通过c语言作为主函数,利用汇编语言进行冒泡排序算法程序设计,从而实现C语言与汇编语言的混合使用,实现冒泡排序方法。

开发环境

CoderWarrior arm developer suit、AXD Debugger

程序代码

C语言代码

#include <stdio.h>
#define N 6
extern void sort(char * ,int);

int main()
{
	char  a[N]={'a','z','c','q','w','e'};     
	int i;
	printf("排序前:\n");
	for(i=0;i<N;i++)
		printf("%c\t",a[i]);
	sort(a,N);
	printf("\n 排序后: \n");
	for(i=0;i<N;i++)
		printf("%c\t",a[i]);
	return 0;
}

代码实现步骤:

  1. 声明静态子函数,用来实现汇编算法
  2. 初始化char类型数组,用于排序
  3. 在控制台上输出对应的排序前,排序后的数组
  4. 利用sort函数,进行冒泡排序,并在控制台中输出

汇编语言代码

	area sort ,code ,readonly
	export sort
start
	mov r3,r0
	mov r7,r1  		;第一层计数,i=N
loop0
	sub r7,r7,#1   ;r7=i=N-1,倒计数
	cmp r7,#0
	beq endh		;相等时跳转
	mov r2,#0 		;第二层循环计数,j=0
loop
	add r4,r2,#1
	ldrb r5,[r3,r2]
	ldrb r6,[r3,r4]
	cmp r5,r6
	bgt jh          ;r5>r6,交换
	b judge         ;不交换
jh 
	strb r5,[r3,r4]
	strb r6,[r3,r2]
	b judge
	
judge	
	;add r3,r3,#1
	add r2,r2,#1    ;j=j+1
	cmp r2,r7       ;内循环次数, i与j
	bne loop       ;不相等,跳转
	b loop0

endh
	end

代码实现步骤

  1. 将数组地址r1,复制到r3中;将传入的数据个数N(r1),复制到r7中
  2. 在loop0处,是外层循环的开始,先进行减一操作,此时r7=i=N-1,r7进行倒计数来控制外层循环
  3. 初始化r2,用于控制内层循环,r2=j
  4. Loop处,为内层循环的开始,先初始化r4,作为r4=j+1,来控制数组第二个比较的位数
  5. 用ldrb,从内存中装载到寄存器中,进行比较
  6. 符合r5>r6,跳转到jh中,进行数组位置交换,将大的数据放到后面,然后进行跳转judge;不符合则跳转到judge中,进行加法,即r2=j=j+1,实现内层循环次数加1
  7. 用r2与r7中数据来比较,判断是否完成内层循环次数,可参考如下图

正常情况下,冒泡排序采用
for(i=0;i<n-1;i++)
for(j=0;j< n-i-1;j++)

倒着计数与正常情况计数下的次数比较(假设共5个数据)

倒着计数次数(外层)正着计数次数(外层)循环计数次数(内层)
414
323
232
141

8) 内层循环结束,跳转到外层循环处,进行下一轮循环,每一次内层循环,都会将最大的数据放到循环所处的最高位。
9) 数据排序次数结束,跳转到endh,结束冒泡排序算法

结果显示

在这里插入图片描述

AXD调试

点击运行,进入到主函数处
在这里插入图片描述
进行单步执行,进行数据初始化
在这里插入图片描述
到sort函数处,step in进入此函数,进行算法调试
在这里插入图片描述
在途中,r0为0x07fffff0存储的是数组的首地址,r1为0x00000006存储的是数组的个数
在这里插入图片描述
以下在内存中,储存的是数组数据
在这里插入图片描述
可以看出,在原顺序’a’,‘z’,‘c’,‘q’,‘w’,‘e’,z>c,因此跳转到jh中,进行数据交换,到内存中,可以看到数据已经交换完成在这里插入图片描述
继续进行单步调试,内层循环后,进入到外层循环,进入下一轮内层循环,直到最后,数组排序完成结束。

代码详情地址

本文章冒泡算法是采用倒序计数,实验详细代码可参考:
https://github.com/CFC-F/ARM-LearningProcess/tree/master/ARMProjects/buttle_sort/buttle_sort
正序计数算法代码可参考:
https://github.com/CFC-F/ARM-LearningProcess/blob/master/ARMProjects/buttle_sort/buttle-sort1
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言可以在ARM架构中实现冒泡排序算法。首先,我们可以使用汇编语言编写一个函数来实现冒泡排序。这个函数可以接受一个字符数组和数组的长度作为参数。然后,我们可以通过使用汇编指令来执行冒泡排序的步骤。 首先,我们可以使用str指令来交换数组中相邻的元素。为了实现冒泡排序,我们需要一个内部循环来比较和交换相邻的元素,直到数组被完全排序。我们可以使用cmp指令来控制内部循环的次数。然后,我们可以使用bne指令来跳转到内部循环的开始,直到数组被完全排序。 同时,我们还需要一个外部循环来控制整个排序的次数。我们可以使用cmp指令来控制外部循环的次数。然后,我们可以使用bne指令来跳转到外部循环的开始,直到数组被完全排序。 为了实现这个汇编程序,我们可以参考提供的C语言汇编语言混合使用的代码。通过仿照C语言的代码流程,我们可以分步骤编写汇编代码。首先,我们需要编写交换数据的汇编代码。然后,我们需要考虑内部循环的代码,以及外部循环的代码。 总之,使用ARM汇编语言实现冒泡排序需要编写交换数据的汇编代码,并通过内部循环和外部循环来实现排序算法。你可以参考提供的C语言汇编语言混合使用的代码,并根据这个代码来编写你的汇编程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【ARM学习笔记】C与汇编混合编程冒泡排序算法](https://blog.csdn.net/qq_43401552/article/details/105686643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ARM C语言调用汇编函数 实现冒泡排序](https://blog.csdn.net/ZHJ123CSDN/article/details/105511944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值