内联asm中cmpxchg的分段错误

时间:2014-04-17 15:08:59

标签: c++ gcc assembly inline-assembly

我正在使用内联asm编写my_simple_mutex。下面代码中注释掉的部分工作正常,但是,cmpxchg的版本以段错误终止。我在cygwin中使用g ++ 4.8.2。

void simple_mutex::spin_lock(){
        /*asm ("spin_lock:\n\t"
             "rep; nop;\n\t"
             "lock; bts $0x00, %0;\n\t"
             "jc spin_lock;\n\t"
             :"=m"(lock)
             :"m"(lock)
             :
             );
             */

        asm ("spin_lock:\n\t"
             "rep; nop;\n\t"
             "movl $0x00, %%eax\n\t"
             "movl $0x01, %%edx\n\t"
             "lock; cmpxchg %%edx, %0\n\t"
             "jnz spin_lock;\n\t"
             :"=m"(lock)
             :"m"(lock)
             :
             );

}

变量lock的类型为int。我有什么想法吗?

1 个答案:

答案 0 :(得分:1)

可能是其他地方的错误,因为您忘记告诉编辑器您修改了eaxedx。修复是将它们列为clobbers(第3个冒号后面的部分)。除非你被迫使用内联asm,否则请使用原子内置。