courses:embedded_system:c2asm_asm2c
C程序和汇编程序相互调用
求和:n + 2n + 3n + 4n + 5n
- main.c
#include<stdio.h> extern int fun_asm(void); // 声明被调用的汇编函数fun_asm int fun_c(int a, int b, int c, int d, int e) // 五个参数由R0~R3这4个寄存器和堆栈中的一个字单元进行传递 { return a+b+c+d+e; // 结果由R0寄存器返回 } int main(void) { fun_asm(); // 调用汇编函数fun_asm return 0; }
- fun_asm.s
PRESERVE8 EXPORT fun_asm ; 声明汇编函数fun_asm可以被外部调用 AREA F_ASM, CODE, READONLY IMPORT fun_c ; 导入要从C程序中调用的fun_c函数 fun_asm STR LR, [SP, #-4]! ; 因要调用另一个子程序 fun_c,保存LR中的返回地址 MOV R0, #2 ; 将第1个参数a需要的值,存入R0 = n = 2 ADD R1, R0, R0 ; 将第2个参数b需要的值,存入R1 = 2n = 4 ADD R2, R1, R0 ; 将第3个参数c需要的值,存入R2 = 3n = 6 ADD R3, R1, R2 ; STR R3, [SP, #-4]! ; 将第5个参数e需要的值,存入R3 = 5n = 10,并且入栈 ADD R3, R1, R1 ; 将第4个参数d需要的值,存入R3 = 4n = 8 BL fun_c ; 返回后,R0中就是5个数之和 ADD SP, SP, #4 LDR PC, [SP], #4 END