GCC的嵌入汇编语言识别声明符
然而,GCC的嵌入汇编语言还识别声明符
例如,下面的GCC代码有什么问题?
=r
和=&r
。这些对我有意义: =r
让汇编器将一个输入寄存器重用为输出寄存器。然而,GCC的嵌入汇编语言还识别声明符
+r
和+&r
。这些对我来说不太好理解。毕竟,+r
和+&r
之间的区别不是无关紧要的吗?只使用+r
难道不足以告诉编译器为单个变量保留一个寄存器吗?例如,下面的GCC代码有什么问题?
#include <stdio.h>
int main()
{
int a = 0;
printf("Initially, a == %d.\n", a);
/* The architecture is amd64/x86-64. */
asm(
"inc %[a]\n"
: [a] "+r" (a)
: : "cc"
);
printf("However, after incrementation, a == %d.\n", a);
return 0;
}
顺便注意一下,我的内联汇编缺少输入声明,因为在我的(也许是错误的)想法中,+r
包括了输入、破坏和输出等所有内容。请问我误解了什么?
背景
我曾经在程序设计中使用过8位和16位微控制器的汇编语言,但几乎没有在托管环境下编写汇编语言的经验。
&
)修饰符的文档对于在读写操作数上使用它的用法有这样一种说法:此外,如果早期破坏操作数也是一个读/写操作数,则该操作数仅在使用后才被写入。 - Michael Petch+&r
告诉编译器什么,因为编译器从一个简单的+r
中已经知道了这些东西。 - thb