2.10 C和汇编混合编程

本文介绍了C语言与ARM汇编的混合编程,包括ATPCS规则、堆栈使用、子程序调用方法、ARM编译器内嵌汇编(ANSIC和GNU扩展)、以及如何在汇编中调用C子程序。
摘要由CSDN通过智能技术生成

C和汇编混合编程

1 ATPCS规则

ATPCS: ARM-Thumb Procedure Call Standard

1.1 堆栈使用规则

使用满递减FD堆栈,入栈出栈操作使用LDMFD/STMFD

1.2 子程序调用基本规则

  1. 子程序间通过寄存器R0-R3传递参数和返回结果。
    参数多于4个,其余的使用堆栈传参
  2. 子程序中使用R4-R11保存局部变量
  3. R12作为过程调用中的临时寄存器,用于保存SP,记作IP
  4. R13作为数据栈指针,记作sp
  5. R14作为连接寄存器,记作lr,保存子程序的返回地址
  6. R15作为程序计数器,记作pc

2 ARM编译器内嵌汇编

2.1 ANSI C 内嵌汇编

ARM编译器对ANSI C进行扩展,使用__asm在C语言中内嵌汇编

__asm
{
	/* 汇编代码块 */
}

在这里插入图片描述

在这里插入图片描述

2.2 GNU内嵌汇编

GNU编译器对ANSI C扩展,使用__asm__修饰,表示后面的代码为
内嵌汇编,其后可选择使用__volatile__告诉编译器不要优化代码。

__asm __volatile__
{
	/* 汇编代码块 */
}

内嵌单行汇编代码示例

asm(“mov r0,r0”); /*NOP example*/

2.3 汇编中调用C子程序

  1. 根据ATPCS参数规则,完成参数传递
  2. 满足C语言能够参数传递和保存局部变量的堆栈环境
  3. 使用BL func即可
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值