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

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注