如何使用内联汇编模拟下面的c++代码
How do I mimic the following c++ code using 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_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
前缀)
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值