内联汇编的原子增量

时间:2015-12-07 21:14:52

标签: c inline

当我尝试以原子方式递增数字时,我收到此错误。 (是的,我必须使用内联汇编和命令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);

}

1 个答案:

答案 0 :(得分:1)

如果使用数字作为约束(操作数旁边的字符串),则表示“将此操作数放在与具有此数字的位置相同的位置”。

因此"0"(number)表示number与操作数0位于同一位置。但在这种情况下,number 操作数0,因此不会实际上告诉编译器把它放在哪里。

您需要为number使用不同的约束 - 例如“r”如果它应该在寄存器中,或者“m”如果它应该在内存中。