当我尝试以原子方式递增数字时,我收到此错误。 (是的,我必须使用内联汇编和命令xaddl,而不是fetch_and_add等。)
tslock.c:23:3: error: matching constraint references invalid operand number
: "cc", "memory");
^
tslock.c:20:2: error: matching constraint references invalid operand number
__asm__ __volatile__ (
^
void atomicIncrement(int number){
int one = 1;
__asm__ __volatile__ (
"lock xaddl %1, %0;"
:: "0"(number), "m"(one)
: "cc", "memory");
printf("new value = %d\n", number);
}
答案 0 :(得分:1)
如果使用数字作为约束(操作数旁边的字符串),则表示“将此操作数放在与具有此数字的位置相同的位置”。
因此"0"(number)
表示number
与操作数0位于同一位置。但在这种情况下,number
是操作数0,因此不会实际上告诉编译器把它放在哪里。
您需要为number
使用不同的约束 - 例如“r”如果它应该在寄存器中,或者“m”如果它应该在内存中。