哪几种情况中必须使用内联汇编或嵌入型汇编?
三、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);
}
图片新闻
技术文库
最新活动更多
-
即日-12.26立即报名>>> 【在线会议】村田用于AR/VR设计开发解决方案
-
1月8日火热报名中>> Allegro助力汽车电气化和底盘解决方案优化在线研讨会
-
1月9日立即预约>>> 【直播】ADI电能计量方案:新一代直流表、EV充电器和S级电能表
-
即日-1.14火热报名中>> OFweek2025中国智造CIO在线峰会
-
即日-1.16立即报名>>> 【在线会议】ImSym 开启全流程成像仿真时代
-
即日-1.20限时下载>>> 爱德克(IDEC)设备及工业现场安全解决方案
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论