ADS中C语言调用汇编语言-对C传入的数组通过汇编实现冒泡排序

文章首发及后续更新:https://mwhls.top/2529.html
新的更新内容请到mwhls.top查看。
无图/无目录/格式错误/更多相关请到上方的文章首发页面查看。

还有一份不传数组,只传四个数的代码,不过不如这个方便,不放上来了。
有需要的可以留言,如果代码还在,我补上。

我对这玩意非常不感兴趣,所以这个系列只会说明用法,不作深入探究与解释,当然,我解释不了也是原因之一。

原理解释
  • 只要在上一篇冒泡排序的算法中,将被排序的地址,改成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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值