哪几种情况中必须使用内联汇编或嵌入型汇编?
三、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);
}
图片新闻
最新活动更多
-
11月8日立即预约>> 筑梦启光 砺行致远 | 新天激光数字化产研基地奠基仪式
-
即日-11.13立即报名>>> 【在线会议】多物理场仿真助跑新能源汽车
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
11月29日立即预约>> 【上海线下】设计,易如反掌—Creo 11发布巡展
-
11月30日立即试用>> 【有奖试用】爱德克IDEC-九大王牌安全产品
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论