arm中ads实现c和汇编混合编译的方法
四、在汇编中调用C的函数
在汇编语言中调用C语言的函数,需要在汇编中IMPORT对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理。
下面是一个汇编语言调用C语言函数例子:
//C语言文件*.c
int cFun(int a, int b, int c){
return a+b+c;
}
;汇编语言文件*.S
AREA asmfile, CODE, READONLY
IMPORT cFun
start
mov r0, #0x1
mov r1, #0x2
mov r2, #0x3
bl cFun
nop
nop
b start
END
在汇编语言中调用C语言的函数,参数的传递也是按照ATPCS规范来实现的。
在这里简单介绍一下部分ATPCS规范:
子程序间通过寄存器R0~R3来传递参数。
A.在子程序中,使用寄存器R4~R11来保存局部变量。
B.寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。
C.寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。
D.寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。
E.寄存器R15是程序计数器,记作PC
F.参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。
G.结果为一个32位整数时,可以通过寄存器R0返回
H.结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。
以上通过几个简单的例子演示了嵌入式开发中常用的C 和汇编混合编程的一些方法和基本的思路,其实最核心的问题就是如何在C 和汇编之间传值,剩下的问题就是各自用自己的方式来进行处理。以上只是抛砖引玉,更详细和复杂的使用方法要结合实际应用并参考相关的资料。
armads混合编 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)