linux c和c 混合编程 pdf,嵌入式Linux下C和汇编的混合编程

存器R0~R3中,如果参数个数多于4个,将剩余的字数据通过数据栈来传递;

●如果包括浮点参数则要通过相应的规则将浮点参数转换为整数参数,然后依次将各

参数传送到寄存器R0~R3中。如果参数多于4个,将剩余字数据传送到数据栈中,

入栈的顺序与参数顺序相反,即最后一个字数据先入栈。

4. 子程序结果返回规则

●结果为一个32位的整数时,通过寄存器R0返回;结果为一个64位整数时,通过寄存

器R0,R1返回。

●结果为一个浮点数时,可以通过浮点运算部件的寄存器F0、D0或者S0来返回;结果

为复合型的浮点数(如复数)时,可以通过寄存器F0~Fn或者D0~Dn来返回。

●对于位数更多的结果,需要通过内存来传递。

2.6.1.3 ARM开发工具编译环境和GNU编译环境的差别

ARM开发工具编译环境(如ads)和GNU编译环境下内嵌汇编的格式和伪操作是不同的。后文将不介绍ARM开发工具编译环境下的混合编程实现,但是,读者对于两者的伪操作上区别还是需要了解的,以便在需要的时候将ARM开发工具编译环境下的汇编移植到GNU编译环境

bd637551d30ba3430fa1026cb45ad6e5.png

另外,对于注释,在ARM开发工具编译环境中注释行以“;”开始。GNU环境注释行以“#”开始,行较多时将内容放在“/*”和“*/”之间。

2.6.2 C调用汇编

在C中调用汇编文件中的函数,要做的主要工作有两个,一是在C中声明函数原型,并加extern关键字;二是在汇编中用global 导出函数名,并用该函数名作为汇编代码段的标识,最后用mov pc, lr返回。然后,就可以在C 中使用该函数了。从C的角度,并不知道该函数的实现是用C还是汇编。更深的原因是因为C的函数名起到表明函数代码起始地址的作用,这个和汇编的label是一致的。

以下给出一个调用的例子,程序包括两个文件:main.c和Asmfile_gnu.s。main.c用c实现,包含主函数,负责调用Asmfile_gnu.c的global asmDouble,并将调用前后的值输出;Asmfile_gnu.c用ARM汇编实现,包含被调用函数“global asmDouble”,实现整数的倍乘。

main.c:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值