【发布时间】:2013-05-22 15:09:48
【问题描述】:
我编写了一个包含内联汇编代码的简单程序。 我的代码只是添加变量 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;
【问题讨论】:
标签: c++ c gcc assembly inline-assembly