#include<stdio.h>
int main()
{
int a,b=100;
int* p=&b;
__asm__(
"movl %1,%%eax\n\t"
"movl %%eax,%0\n\t"
:"=r" (a)
:"m" (p)
:"%eax"
);
printf("a=%d,b=%d\n",a,b);
}
\n\t是在内嵌多行汇编时应该加上,否则会出现莫名奇妙的错误。
%%eax有两个%%号是因为避免跟%1混淆
"=r"引号里面是加载码,"="号表示输出到a变量,"r"表示任意寄存器
"m"表示地址
:“eax”表示eax寄存器值会变,所以eax在此期间不要保存其他地址。
%0代表了变量a
%1代表了变量p
特别的:这里movl %1,%%eax\n\t并没有间接寻址。