侵权投诉
订阅
纠错
加入自媒体

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

2020-12-14 09:10
一口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);
} 

<上一页  1  2  3  4  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    电子工程 猎头职位 更多
    扫码关注公众号
    OFweek电子工程网
    获取更多精彩内容
    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号