C和汇编混合编程
1 ATPCS规则
ATPCS: ARM-Thumb Procedure Call Standard
1.1 堆栈使用规则
使用满递减FD堆栈,入栈出栈操作使用LDMFD/STMFD
1.2 子程序调用基本规则
- 子程序间通过寄存器R0-R3传递参数和返回结果。
参数多于4个,其余的使用堆栈传参 - 子程序中使用R4-R11保存局部变量
- R12作为过程调用中的临时寄存器,用于保存SP,记作IP
- R13作为数据栈指针,记作sp
- R14作为连接寄存器,记作lr,保存子程序的返回地址
- 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子程序
- 根据ATPCS参数规则,完成参数传递
- 满足C语言能够参数传递和保存局部变量的堆栈环境
- 使用BL func即可