#include <stdio.h>
int main(void){
int xa=6;
int xb=2;
int result;
//使用占位符,由r表示,编译器自主选择使用哪些寄存器,%0,%1。。。表示第1、2。。。个变量
asm volatile(
"add %1,%2\n\t"
"movl %2,%0"
:"=r"(result):"r"(xa),"r"(xb));
printf("%d\n",result);
return 0;
}
result、xa、xb绑定的寄存器由编译器决定,前面的例子中我们采用直接指定的方式,在这里我们改成由编译器
自主选择,"r"是占位符,表示由编译器自主选择使用哪些寄存器,不指定哪个变量绑定在哪个寄存器上,
:"=r"(result):"r"(xa),"r"(xb)
那我们如何知道这些变量绑定在哪些寄存器上呢,不知道绑定的寄存器,如何对变量进行操作呢,可以使用
%0,%1这样的符号来代替要操作的寄存器,%后的数字表示第几个变量,如:%0,%1。。。表示第1、2。。。个变量。
:"=r"(result):"r"(xa),"r"(xb)
上面这个输出和输入列表已经指定了变量的顺序,
result是第0个,xa是第1个,xb是第2个
下面的例子完成 xb=xb-xa的计算,问题出现了,可能会导致xb被分配了2个寄存器:
:"=r"(xb):"r"(xa),"r"(xb));
使用引用占位符能有效地使用可用寄存器,在这里我们指定xb使用第0个变量绑定的寄存器
:"=r"(xb):"r"(xa),"0"(xb));
第0个变量就是xb,即xb绑定的寄存器被修改后,结果仍写回原寄存器
下面是完整例子
#include <stdio.h>
int main(void){
int xa=2;
int xb=6;
asm volatile(
"subl %1,%0\n\t"
:"=r"(xb):"r"(xa),"0"(xb));
printf("%d\n",xb);
return 0;
}
我们编译运行一下
$ gcc -o test test.c
$ ./test
4
用数字来表示变量的顺序也许很麻烦,我们可以使用更简单的方法,使用“[标识]”的格式标记绑定后的变量。 下面的代码完成xb=xb+xa的计算
#include <stdio.h>
int main(void){
int xa=6;
int xb=2;
asm volatile(
"add %[mya],%[myb]\n\t"
:[myb]"=r"(xb):[mya]"r"(xa),"0"(xb));
printf("%d\n",xb);
return 0;
}
我们使用m标记可以直接在内存中对数进行操作,前面的例子对变量进行操作时都需要将变量值存储在要修改的寄存器中,然后将它写回内存位置中.
#include <stdio.h>
int main(void){
int xa=2;
int xb=6;
asm volatile(
"subl %1,%0\n\t"
:"=r"(xb):"m"(xa),"0"(xb));
printf("%d\n",xb);
return 0;
}
我们直接从xa的内存地址中将xa取出,而不需要再将xa先存储在一个寄存器。
如果转载请注明来源,如有错误之处,请及时指出
分享到:
相关推荐
vc内联汇编示例代码,介绍了VC++的一些被封装的汇编代码,有愿意深入了解VC++的人请进
VB支持内联汇编的插件 VB支持内联汇编的插件
ibm-basics-inline-assembly,内联汇编介绍
VC内联汇编资料 VC内联汇编资料 VC内联汇编资料 VC内联汇编资料
易语言学习-WonderWall内联汇编支持库(11-28).zip
ARM GCC 内联汇编参考手册
行业-电子政务-内联发电机.zip
针对软件代码混淆算法中的内联方法存在混淆结果单一性问题,提出了一种多态内联代码混淆算法。基于有限状态自动机(FSM)建立了算法理论模型,对每个内联的方法体选择差异性的混淆实现,并通过理论分析说明了提出的...
ARM GCC 内联汇编参考手册 - 中文版
内联汇编2.rar
1. NEON优化库(Optimized libraries) 2. 向量化编译器(Vectorizing compilers) 3. NEON intrins
工程主要时C++内联汇编的示例,内部简单的用汇编实现了函数传参及调用,循环以及if语句的实现
Keil_内联汇编的设置问题。
行业资料-电子功用-内联式非晶硅太阳能电池及制造方法的说明分析.rar
易语言置入代码内联汇编源码,置入代码内联汇编,减法1,加法1,乘法1,除法1
gcc 内联汇编官方手册最新版 ThisHOWTOexplainstheuseandusageoftheinlineassemblyfeatureprovidedbyGCC.
网络游戏-基于浮点数运算内联函数库的神经网络优化方法.zip
行业资料-电子功用-内联式超薄弱光型非晶硅光电池生产线的说明分析.rar
在Visual_C++中使用内联汇编 本文档主要详细介绍如何在c/c++代码内涵汇编代码,推荐给学习c/c++的同学们下载
行业资料-电子功用-内联式低内压高电位输出镍氢动力蓄电池及其制备的说明分析.rar