#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;
}
我们编译运行一下
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;
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。