C++ 内联asm中cmpxchg的分段故障

C++ 内联asm中cmpxchg的分段故障,c++,gcc,assembly,inline-assembly,C++,Gcc,Assembly,Inline Assembly,我正在使用内联asm编写我的\u simple\u互斥体。下面注释掉的代码部分工作正常,但是,带有cmpxchg的版本以segfault终止。我在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

我正在使用内联asm编写我的\u simple\u互斥体。下面注释掉的代码部分工作正常,但是,带有cmpxchg的版本以segfault终止。我在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
。你知道我做错了什么吗?

可能是因为你忘记告诉编译器你修改了
eax
edx
。解决方法是将它们列为clobber(第三个冒号后面的部分)。除非您被迫使用内联asm,否则请改用原子内置。

是的,丢失了阻塞寄存器。谢谢你的快速回复