我写了一个包含内联汇编代码的简单程序。我的代码只是添加变量 a 和 b 并在 b 中返回结果。
令我困惑的是为什么下面的代码会生成这条指令 movl 28(%esp), %ecx。
我不完全理解修饰符 + 和 = 在输入和输出列表中的作用。因此,如果您能对此有所了解,我们将不胜感激。
#include <cstdio>
int main( int argc , char ** argv )
{
int a = 2, b = 7;
__asm__
(
"addl %1,%0;"
:"+r"(b)
:"r"(a), "r"(b)
);
printf("b = %d\n",b);
return 0;
}
movl $2, 24(%esp) movl $7, 28(%esp) movl 24(%esp), %edx movl 28(%esp), %ecx movl 28(%esp), %eax addl %edx,%eax movl %eax, 28(%esp)
我接下来要展示的内容是错误的。但这是为了让我更好地了解 GCC 中发生的事情。
好的,现在我从 +r 更改为 =r。这是 GCC 生成的汇编代码。
#include <cstdio>
int main( int argc , char ** argv )
{
int a = 2, b = 7;
__asm__
(
"addl %1,%0;"
:"=r"(b)
:"r"(a), "r"(b)
);
printf("b = %d\n",b);
return 0;
}
movl $2, 24(%esp) movl $7, 28(%esp) movl 24(%esp), %eax movl 28(%esp), %edx addl %eax,%eax; movl %eax, 28(%esp)
现在输出为 4,这是错误的。我的问题是为什么使用 "=r" GCC 决定为 b 重用寄存器 eax,如本指令所示 addl %eax,%eax;