1、ATPSC规范
ARM公司专门为ARM处理器编写的一套标准和规范。
PCS即Procedure Call Standard(过程调用规范),ATPCS即ARM-THUMB procedure call standard。
(1) ARM处理器默认采用满减栈
(2)函数的参数传递通过R0-R3进行传递,如果函数的参数小于等于4个时,通过R0-R3进行传递,如果函数的参数大于4个时,前四个使用R0-R3传递,其余的使用压栈的方式传递
(3)函数的返回值通过R0进行返回。
2、汇编调用C函数
软件:Keil uVision5
以 add_func 函数为例:
start.s 文件
@ arm - c
.text
.globl _start
_start:
@ 1. 初始化栈指针,在c语言代码运行前完成初始化栈
ldr sp, =0x40000800
@ 2. 通过汇编语言bl跳转调c语言函数
@ 2.1 给c语言函数传参
mov r0, #1 @r0寄存器赋值为1
mov r1, #2 @r1寄存器赋值为2
mov r2, #3 @r2寄存器赋值为3
mov r3, #4 @r3寄存器赋值为4
@ 2.2 bl调用c函数
bl add_func
stop:
b stop
.end
add_func.c 文件
int add_func(int a,int b,int c,int d)
{
return (a+b+c+d);
}
执行结束之后,查看R0寄存器中的值是否为运算的结果。函数的返回值通过R0进行返回,从r0寄存器中获取C函数运行的结果。
执行结果:
3、C调用汇编函数
软件:Keil uVision5
以 add_func 函数为例:
start.s 文件
@ c - arm
.text
.globl _start
_start:
@ 1. 初始化栈指针,在c语言代码运行前完成初始化栈
ldr sp, =0x40000800
@ 2. bl 调用main.c文件的main 函数
bl main
stop:
b stop
.end
main.c 文件
//使用extern声明汇编函数
extern int add_func(int a,int b,int c, int d);
int sum=0;
int main()
{
sum = add_func(1,2,3,4);
while(1)
{
}
return 0;
}
add_func.s 文件
@ 定义一个汇编函数
.text
@ 声明add_func为全局变量函数,可在外部调用
.globl add_func
@函数传参,设返回值
add_func:
add r0,r0,r1
add r0,r0,r2
add r0,r0,r3
mov pc,lr
.end
Keil uVision5查看sum的值