调用函数排序c语言程序,ARM C语言调用汇编函数 实现冒泡排序

使用冒泡排序将指定数组排序后输出

排序函数使用汇编语言编写,C语言调用汇编语言

在控制台显示排序前后的结果

一、问题分析

二、代码编写

2.1 C语言代码

2.2 汇编代码

三、ADS调试

3.1 运行ADS软件,进入调试界面

3.2 汇编函数调试

3.3 执行结果

一、问题分析

本程序的关键是如何使用汇编语言实现冒泡排序算法。可以仿照C语言的代码流程,分步骤写出汇编的代码。首先要写出最内层的代码部分,也就是数据交换的汇编代码,数据交换可以使用str数据装载指令实现。之后要考虑内层循环的代码,可以通过cmp指令控制循环次数。最后是编写最外层的循环代码,也是使用cmp指令,来控制整个排序的次数。

二、代码编写

2.1 C语言代码

#include

extern void sort(char* num, int count);

int main(){

char number[10] = {'a', 'c', 'b', 'e', 'd', 'f', 'h', 'g', 'j', 'i'};

printf("Before: %s\n", number);

sort(number, 10);

printf("After: %s\n", number);

return 0;

}

C语言中比较重要的是,首先要声明外部函数sort,也就是由汇编代码实现的函数。其代码流程为:

初始化1个10字节的char类型的数组

在控制台输出初始化的数据

调用汇编函数进行排序

显示排序后的结果

2.2 汇编代码

area sort, code, readonly

global sort

start

mov r2, #-1; r2->i, i=-1

sub r8, r1, #1; r1->count

loop

cmp r2, r8; 控制外层循环

bge stop

add r2,r2, #1; i=i+1

mov r3, #-1; r3=j, j=-1

loop0

add r3, r3, #1; j=j+1

add r4, r3, #1; r4=j+1

sub r7, r8, r2; 控制内层循环

cmp r3, r7

bge loop

ldrb r5, [r0, r3]; r5=a[j]

ldrb r6, [r0, r4]; r6=a[j+1]

cmp r5, r6; 比较 a[j] 和 a[j+1]

blt loop0

swap

strb r5, [r0, r4]; 交换 a[j] 和 a[j+1]

strb r6, [r0, r3]

b loop0

stop

end

汇编语言代码是仿照的C语言的冒泡排序流程实现的,其大致流程为:

首先初始化R2,R2用来控制外层循环的次数。

数组个数由R1传递进来,然后复制到R8中保存

外层LOOP循环开始,首先判断以下外层循环次数,如果外层循环结束,就直接跳转至STOP结束循环。类似于C语言for循环里面的判断。

如果外层循环未结束,那么外层循环要实现的就是分别初始化外层R2和内层R3的循环次数。

进入内层循环,用R3表示内层循环次数,R4表示内层次数加一。

判断内层循环是否已经结束,如果应该结束,就跳转至外层循环。

内层循环未结束,就继续执行,使用ldrb指令将内存中的数据装入寄存器R5和R6。

使用cmp比较R5和R6的数值,如果R5数据交换完成过后,进行下一轮内层循环。

结束

三、ADS调试

3.1 运行ADS软件,进入调试界面

e6b2b8f7c3ee47fca0257b8b8c7030a4.jpg

首先显示的是一堆汇编代码,直接点击运行,让程序停到主函数入口处。

9a38d829fd134fc59c7452939250624f.jpg

接下来是初始化数据,单步执行即可。

396742659ea743d0a9f88eddcfca9cd7.jpg

现在程序已经运行到了sort函数的代码行,step in进入该函数。

3.2 汇编函数调试

7b15091ff5ed4e64849fefaa70c7d4f2.jpg

可以看到,此时R0和R1的数值分别是0x07FFFFF0和0x0000000A。这两个数分别表示C语言代码中number数组的首地址,以及number数组的字符个数。

现在内存里的数值如下:

78b90d7084fb4ad68066466a259f2713.jpg

可以看到,现在前三个数是61、63、62,分别对应acb字符。

第一轮内层循环,因为61<63,所以就跳转到了第二轮内层循环。第二轮内层循环是,63>63,所以就会进入交换数据的程序片段。

2f7ac4efe63444ae9ca8fe8557c051d9.png

经过交换之后,现在内存中的数值已经变成了61、62、63。

818563ed515a4c3a83279318934cc6e8.png

下面继续单步执行,等到第一轮所有的内层循环结束之后,数据就变成了下面的效果。

1f3e7e7892bd4fd980419fa20d49077b.png

可以看到,最大的数据6A已经跑到了最高的位置0x7FFFFF9。

接下来的循环,因为数据已经拍好了,所以就不会再有数据交换了。如果此时数据还没有排好,之后的每一轮循环,都会将最大的数据放到高的位置,直到循环结束。

3.3 执行结果

最后,程序执行的结果如下:

e2ad66fcb029466ead14f018aa221635.png

汇编函数执行成功。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值