C++ 如何模拟以下c++;使用内联汇编的代码?
我尝试使用原子内联汇编代码模拟以下代码:C++ 如何模拟以下c++;使用内联汇编的代码?,c++,mutex,inline-assembly,C++,Mutex,Inline Assembly,我尝试使用原子内联汇编代码模拟以下代码: 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_unl
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的定义。英特尔手册在
LOCK
前缀的主题上说明了以下内容:
锁定前缀只能在以下说明的前面
而且只适用于目的地
操作数是内存操作数:ADD、ADC和、BTC、BTR、BTS、CMPXCHG、,
CMPXCH8B、DEC、INC、NEG、NOT或SBB、SUB、XOR、XADD和XCHG。如果
锁定前缀与这些指令之一和源一起使用
操作数是内存操作数,可能存在未定义的操作码异常(#UD)
将生成。如果发生以下情况,还将生成未定义的操作码异常:
锁定前缀与上面列表中未列出的任何说明一起使用
这里最好做的事情(除了阅读英特尔几千页厚手册),就是看编译器为C++代码生成什么样的输出,这应该给你一个想法。
< P>英特尔的手册中说下面的关于“代码”主题的锁前缀: 锁定前缀只能在以下说明的前面 而且只适用于目的地 操作数是内存操作数:ADD、ADC和、BTC、BTR、BTS、CMPXCHG、, CMPXCH8B、DEC、INC、NEG、NOT或SBB、SUB、XOR、XADD和XCHG。如果 锁定前缀与这些指令之一和源一起使用 操作数是内存操作数,可能存在未定义的操作码异常(#UD) 将生成。如果发生以下情况,还将生成未定义的操作码异常: 锁定前缀与上面列表中未列出的任何说明一起使用这里最好做的事情(除了阅读英特尔几千页厚手册),就是看编译器为C++代码生成什么样的输出,这应该给你一个想法。
< P>你所寻找的是LOCK
前缀。)您要查找的是CMPXCHG
指令。(您仍然需要LOCK
前缀。)只允许在一些指令中使用LOCK
前缀<代码> MOV 可能不是其中之一。这个例子看起来像C,而不是C++代码,如果我们知道NoDEY-PTR定义为什么,它会有帮助。我想你想使用锁XCHG,但是这取决于NoDEY-PTR是什么。看看使用gcc原子内部函数是否有更好的帮助:只允许在一些指令上使用锁前缀<代码> MOV 可能不是其中之一。这个例子看起来像C,而不是C++代码,如果我们知道NoDEY-PTR定义为什么,它会有帮助。我想你想使用锁XCHG,但是这取决于NoDEY-PTR是什么。看看使用gcc原子内部函数是否有更好的帮助:编译器只需生成一个调用pthread\u mutext\u lock
。他感兴趣的(我想)是在这个函数中发生了什么;除非存在争用,否则它不会调用操作系统。@James说得很对,但没有什么能阻止你仅仅使用调试器并进入其中。。那么,您可能需要使用KDB来获得真正有趣的东西。编译器只需生成一个调用pthread\u mutex\u lock的。他感兴趣的(我想)是在这个函数中发生了什么;除非存在争用,否则它不会调用操作系统。@James说得很对,但没有什么能阻止你仅仅使用调试器并进入其中。。你可能需要使用KDB来获取真正有趣的东西。