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