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

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

2020-12-14 09:10
一口Linux
关注

ARM系列文章,请点击以下汇总链接:

《从0学arm合集》

一、gcc 内联汇编

内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编。

程序中使用饱和算术运算(Saturating Arithmetic)程序需要对协处理器进行操作在C程序中完成对程序状态寄存器的操作格式:__asm__ __volatile__("asm code"
:output
:input
:changed registers);

asm或__asm__开头,小括号+分号,括号内容写汇编指令。指令+ 用双引号引上。

参数

「asm code」主要填写汇编代码:


"mov r0, r0 "
"mov r1,r1 "
"mov r2,r2"

「output(asm->C)」用于定义输出的参数,通常只能是变量:

:"constraint" (variable)
"constraint"用于定义variable的存放位置:
r 表示使用任何可用的寄存器
m 表示使用变量的内存地址
+ 可读可写
= 只写
& 表示该输出操作数不能使用输入部分使用过的寄存器,只能用"+&"或"=&"的方式使用

「input(C->asm)」用于定义输入的参数,可以是变量也可以是立即数:

:"constraint" (variable/immediate)
"constraint"用于定义variable的存放位置:
r 表示使用任何可用的寄存器(立即数和变量都可以)
m 表示使用变量的内存地址
i 表示使用立即数

Note:

使用__asm__和__volatile__表示编译器将不检查后面的内容,而是直接交给汇编器。如果希望编译器为你优化,__volatile__可以不加没有asm code也不能省略""没有前面的和中间的部分,不可以相应的省略:没有changed 部分,必须相应的省略:最后的;不能省略,对于C语言来说这是一条语句汇编代码必须放在一个字符串内,且字符串中间不能直接按回车换行,可以写成多个字符串,注意中间不能有任何符号,这样就会将两个字符串合并为一个指令之间必须要换行,还可以使用 使指令在汇编中保持整齐举例

例1:无参数,无返回值这种情况,output和input可以省略:

asm
( //汇编指令
 "mrs r0,cpsr     "
 "bic r0,r0,#0x80 "
 "msr cpsr,r0     "
);

例2:有参数 ,有返回值让内联汇编做加法运算,求a+b,结果存在c中

int a =100, b =200, c =0;
asm

 "add %0,%1,%2 "
 : "=r"(c)
 : "r"(a),"r"(b)
 : "memory"
);

%0 对应变量c%1 对应变量a%2 对应变量b

例3:有参数 2 ,有返回值

让内联汇编做加法运算,求a+b,结果存在sum中,把a-b的存在d中

asm volatile

 "add %[op1],%[op2],%[op3] "
 "sub %[op4],%[op2],%[op3] "
 :[op1]"=r"(sum),[op4]"=r"(d)
 :[op2]"r"(a),[op3]"r"(b)
 :"memory"
);

%0 对应变量c%1 对应变量a%2 对应变量b

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

发表评论

0条评论,0人参与

请输入评论内容...

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

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

暂无评论

暂无评论

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

    粤公网安备 44030502002758号