開發環境: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; }
