如何使用内联汇编模拟下面的c++代码

How do I mimic the following c++ code using inline assembly?

本文关键字:c++ 代码 模拟 何使用 汇编      更新时间:2023-10-16

我正在尝试使用原子内联汇编代码模拟以下代码:

struct Node{
    Node * next;
    int value;
}
typedef struct Node * Node_ptr;
Node_ptr store(Node_ptr ** L, Node_ptr * I){
    pthread_mutex_lock (&queue_mutex);
    Node_ptr tmp = **L; 
    **L = *I;
    pthread_mutex_unlock (&queue_mutex)
    return tmp;
}

这是我尝试过的:

Node_ptr tmp;
__asm volatile ("lock; movq %1, %%rax; movq %%rax, %0"
                    : "=r" (tmp)
                    : "r" (**L)
                    : "%rax"
                    );
__asm volatile ("lock; movq %1, %%rax; movq %%rax, %0"
                    : "=r" (**L)
                    : "r" (*I)
                    : "%rax"
                    );
return tmp;

然而,我得到一个"非法指令"错误,我有麻烦看到我错了。有没有人知道问题出在哪里?

感谢

编辑:添加node_ptr的定义

Intel的手册对LOCK前缀的主题有如下说明:

LOCK前缀只能加在以下说明后面而只有那些形式的指令才会到达目的地是一个内存操作数:ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, XCHG。如果LOCK前缀与其中一条指令和源代码一起使用operand是一个内存操作数,一个未定义的操作码异常(#UD)可能生成。还将生成一个未定义的操作码异常LOCK前缀用于上述列表之外的任何指令。

最好的方法(除了阅读intel的几千页厚的手册)是查看编译器为c++代码生成什么样的输出,这应该会给你一个想法。

您正在寻找的是CMPXCHG指令。(你仍然需要LOCK前缀)