ARM-C和汇编的混合编程

 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的值

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值