ARM中C和匯編的相互調用(5個數求和、字符串拷貝)


開發環境:Keil5

工程目錄:

 

 

一、匯編調用C——多數相加

  使用匯編調用C,需要注意的是參數的傳遞。不同於X86的傳參規則,在ARM體系中,如果形參的個數不超過4個,使用特殊寄存去R0~R3傳遞;而如果參數大於4個,就要將多出來的那部分參數使用堆棧傳遞。

  壓棧的之后移動位置指針,壓棧順序別忘了是最后一個參數先入棧->倒數第二個參數->,,,,

  下面的代碼實現了五個參數求和,首先使R0=0,R1=1,R2=2,R3=3,第五個參數使用棧傳遞,並移動堆棧指針。

(1)startup.s

Stack_Size EQU 0x100         ;初始化棧的大小為256B
    AREA STACK, NOINIT, READWRITE, ALIGN = 3
Stack_Mem SPACE Stack_Size
__initial_sp

    PRESERVE8
    THUMB
        
    AREA RESET, DATA, READONLY;中斷向量表 
        DCD __initial_sp
        DCD Reset_Handler
    AREA RESET, DATA, READWRITE
    



    AREA Sum, CODE, READONLY ;聲明一個叫Sum的代碼段,可讀
Reset_Handler PROC;          ;復位函數,從這里開始執行
    IMPORT  main             ;main函數不在此文件中,所以需要引入
    IMPORT  sum5             ;sum5函數不在此文件中,所以需要引入
    

CALLSUM5
    MOV R0,#0
    MOV R1,#1
    MOV R2,#2
    MOV R3,#3
    MOV R4,#4                ;前4個參數使用R0~R3傳遞,
    STR R4,[SP, #-4]!        ;第5個使用棧傳遞
    BL  sum5                 ;調用c程序
    LDR  R0, = main   
    BX      R0               ;回到C的main函數
    ENDP
    END

(2)main.c

int sum5(int a, int b, int c, int d, int e) {
    return (a+b+c+d+e);
}    
int main(void) {

    return 0;
}

 

二、C調用匯編——strcopy

  邏輯上比較好理解,首先在匯編文件中定義C要調用的函數,然后在.c文件extern這個函數,調用即可。

(1)startup.s

    AREA |.text|, CODE, READONLY ;聲明一個叫|.text|的代碼段,可讀    
Reset_Handler PROC
    IMPORT  main                 ;main函數不在此文件中,所以需要引入
    EXPORT  Reset_Handler        ;聲明外部函數

    LDR     R0, =main
    BX      R0
    ALIGN
    ENDP    
    
    
    
    AREA SCopy, CODE, READONLY          
    EXPORT strcopy               ;想要被外部調用,必須聲明函數
strcopy
    LDRB R2,[R1],#1              ;B 代表一個字節,#1 代表 R1 的地址 1
    STRB R2,[R0],#1
    CMP  R2,#0                   ;0 是字符串額結束標志,比較R2和0就可以看到字符串是否結束
    BNE  strcopy                 ;跳轉指令,不相等的時候跳轉到上面,形成了循環
    BX   LR                      ;返回現場

    END    

(2)main.c

extern void strcopy(char *d, const char *s);

int main(void) {
    const char  srcstr[] = "ABCDEFGH";//0x41-0x48
          char  dststr[] = "abcdefgh";//0x61-0x68
    strcopy(dststr, srcstr);

    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM