ADS中C语言调用汇编语言-对C传入的数组通过汇编实现冒泡排序
还有一份不传数组,只传四个数的代码,不过不如这个方便,不放上来了。
有需要的可以留言,如果代码还在,我补上。我对这玩意非常不感兴趣,所以这个系列只会说明用法,不作深入探究与解释,当然,我解释不了也是原因之一。
原理解释
- 只要在上一篇冒泡排序的算法中,将被排序的地址,改成C传入的地址即可,再稍微适配一下即可。
改法解释
- startup.s代码中,只有正数第五条与倒数第二条指令能改,其他地方代码我也不清楚干嘛用的,模板就是这样。
- 把main1改成自己的函数名就行。
- 其它两个代码,EXPORT与extern那里改下就行,名字对应,错了一般就是这边问题。
- 注:startup.s里面有些忘删了的,但影响不大。
查看C变量值变化
- 双击变量名,右键被选中的变量名,add to watch。
- 在左侧新出现的窗口查看。
- 在C语言程序执行时才有值,跳到汇编时没有。
startup.s
; 起动文件。初始化C程序的运行环境,然后进入C程序代码。
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT main1 ; 声明C程序中的Main()函数
AREA Exp2,CODE,READONLY ; 声明代码段Exp2
ENTRY ; 标识程序入口
CODE32 ; 声明32位ARM指令
Reset LDR SP,=0x40003F00
; 初始化C程序的运行环境
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
CMP R0,R1
BEQ LOOP1
LOOP0 CMP R1,R3
LDRCC R2,[R0],#4
STRCC R2,[R1],#4
BCC LOOP0
LOOP1 LDR R1,=|Image$$ZI$$Limit|
MOV R2,#0
LOOP2 CMP R3,R1
STRCC R2,[R3],#4
BCC LOOP2
MOV R0,#0
LDR R1,=0x40009000
LDR R2,=DATA
B LOAD
DATA DCD 30,10,40,20
LOAD LDRB R3,[R2],#1 ; R3, Data temp storage
STRB R3,[R1],#1 ; Save data to memory
ADD R0,R0,#1 ; Counter increasement
CMP R0,#15 ; Compare counter with 15
BLS LOAD ; Stop data_load when counter == 15
B main1 ; 跳转到C程序代码main1()函数
END
BubbleSort1.c
#define uint32 unsigned int
extern uint32 bubbleSort1(uint32 *array);
void main1(void){
uint32 array[] = {1, 4, 2, 3, 8, 5, 6, 7, 9, 0};
bubbleSort1(array);
while(1);
}
bubble1.s
EXPORT bubbleSort1
AREA bubbleSort1,CODE,READONLY ; 声明代码段AddC
ENTRY ; 标识程序入口
CODE32 ; 声明32位ARM指令
START
MOV R6,#0 ; R6, Counter1 for bubble sort outer loop
LOOP_1
MOV R1,R0 ; R1, Num1's address1
ADD R2,R1,#4 ; R2, Num2's address2
MOV R5,#0 ; R5, Counter2 for bubble sort inner loop
LOOP_2
LDR R3,[R1] ; R3, Num1
LDR R4,[R2] ; R4, Num2
CMP R3,R4 ; Compare Num1 with Num2 to judge swap condition
STRHI R3,[R2] ; Condition True, Swap [R1] with [R2]
STRHI R4,[R1] ; Condition True, Swap [R1] with [R2]
ADD R1,R1,#4 ; Address1 increasement
ADD R2,R2,#4 ; Address2 increasement
ADD R5,R5,#1 ; Counter2 increasement
CMP R5,#9 ; Loop2 9 times to continue next step
BNE LOOP_2 ; Loop2 9 times to continue next step
ADD R6,R6,#1 ; Counter1 increasement
CMP R6,#9 ; Loop1 9 times to continue next step
BNE LOOP_1
MOV PC,LR ; 返回值为R0
END
共有 0 条评论