c++ - 内联 asm 中 cmpxchg 的段错误

标签 c++ gcc assembly inline-assembly

我正在使用内联汇编编写 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。知道我做错了什么吗?

最佳答案

可能错误在别处,因为您忘记告诉编译器您修改了 eaxedx。解决方法是将它们列为 clobbers(第 3 个冒号之后的部分)。除非您被迫使用内联汇编,否则请改用原子内置函数。

关于c++ - 内联 asm 中 cmpxchg 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23136847/

相关文章:

c - asm 内联函数中的 "@"是什么意思?

.net - .NET为什么不对SIMD固有的数学运算使用SIMD而不使用x87?

c - 组装指令解读

c++ - 如何创建具有 CUDA 支持的最新 Tensorflow 版本的调试版本?

c++ - move 语义和 cv::Mat

c++ - 为什么我不能链接到boost的线程库?

c - 如何检查 ARM 架构上的 C 应用程序中的内存泄漏

c - 使用GNU C内联汇编在VGA内存中绘制字符

assembly - TAOCP MIX汇编语言中 "ENT1 *"是什么意思?

c++ - 为什么 `packaged_task`没有推导指南?