哪几种情况中必须使用内联汇编或嵌入型汇编?

一口Linux
关注

三、C语言和汇编相互调用

C和汇编相互调用要特别注意遵守相应的ATPCS规则。

1. C调用汇编

例1:c调用汇编文件中函数带返回值简化代码如下,代码架构可以参考《7. 从0开始学ARM-GNU伪指令、代码编译,lds使用》。

;.asm                                    
add:
add r2,r0,r1
mov r0,r2
   MOV pc, lr

main.c

extern int add(int a,int b);
printf("%d ",add(2,3));
a->r0,b->r1返回值通过r0返回计算结果给c代码

例2,用汇编实现一个strcopy函数

;.asm
.global strcopy
strcopy:      ;R0指向目的字符串 ;R1指向源字符串
LDRB R2, [R1], #1   ;加载字字符并更新源字符串指针地址
STRB R2, [R0], #1   ;存储字符并更新目的字符串指针地址
CMP R2, #0   ;判断是否为字符串结尾
BNE strcopy   ;如果不是,程序跳转到strcopy继续循环
MOV pc, lr   ;程序返回
//.c
#include <stdio.h>
extern void strcopy(char* des, const char* src);
int main(){
const char* srcstr = "yikoulinux";
char desstr[]="test";
strcopy(desstr, srcstr);
return 0;

2. 汇编调用C//.c
int fcn(int a, int b , int c, int d, int e)

return a+b+c+d+e;

;.asm ;
.text .global _start
_start:
STR lr, [sp, #-4]! ;保存返回地址lr
ADD R1, R0, R0 ;计算2*i(第2个参数)
ADD R2, R1, R0 ;计算3*i(第3个参数)
ADD R3, R1, R2 ;计算5*i
STR R3, [SP, #-4]! ;第5个参数通过堆栈传递
ADD R3, R1, R1 ;计算4*i(第4个参数)
BL fcn ;调用C程序
ADD sp, sp, #4 ;从堆栈中删除第五个参数
.end

假设程序进入f时,R0中的值为i ;

int f(int i){
return fcn(i, 2*i, 3*i, 4*i, 5*i);
} 

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存