内联asm中cmpxchg的分段错误

segmentation fault with cmpxchg in inline asm

本文关键字:分段 错误 cmpxchg asm 内联      更新时间:2023-10-16

我正在使用内联asm编写my_simple_mutex。下面注释掉的代码部分运行良好,但是,带有cmpxchg的版本以segfault终止。我在cygwin中使用g++4.8.2。

void simple_mutex::spin_lock(){
        /*asm ("spin_lock:nt"
             "rep; nop;nt"
             "lock; bts $0x00, %0;nt"
             "jc spin_lock;nt"
             :"=m"(lock)
             :"m"(lock)
             :
             );
             */
        asm ("spin_lock:nt"
             "rep; nop;nt"
             "movl $0x00, %%eaxnt"
             "movl $0x01, %%edxnt"
             "lock; cmpxchg %%edx, %0nt"
             "jnz spin_lock;nt"
             :"=m"(lock)
             :"m"(lock)
             :
             );
}

变量lock的类型为int。你知道我做错了什么吗?

故障可能在其他地方,因为您忘记告诉编译器您修改了eaxedx。修复方法是将它们列为clobber(第三个冒号后面的部分)。除非您被迫使用内联asm,否则请使用原子内建。