Gcc 长变量原子增量的指令编码

Gcc 长变量原子增量的指令编码,gcc,assembly,x86-64,atomic,inline-assembly,Gcc,Assembly,X86 64,Atomic,Inline Assembly,我需要得到一个长变量的原子增量的指令编码。我正在考虑编写一些内联gcc程序集,并使用gdb反汇编输出来获得答案。这就是我所做的 #include <stdint.h> int lock_inc(uint64_t *value) { __asm__ __volatile__ ( "lock inc %0;\n" : : "r"(value) : "memory" ); } uint64_t value = 0; int main() {

我需要得到一个长变量的原子增量的指令编码。我正在考虑编写一些内联gcc程序集,并使用gdb反汇编输出来获得答案。这就是我所做的

#include <stdint.h>

int lock_inc(uint64_t *value) {

  __asm__ __volatile__
  (
   "lock inc %0;\n"
   :
   : "r"(value)
   : "memory"
  );
}

uint64_t value = 0;

int main() {

  lock_inc(&value);

}
#包括
int lock_inc(uint64_t*值){
__asm\uuuuuuuuuuuuuuuuuu挥发性__
(
“锁公司%0;\n”
:
:“r”(值)
:“内存”
);
}
uint64_t值=0;
int main(){
洛克尤公司(和价值);
}
但是当我试图编译它时,我得到了以下错误

lockinc.c:汇编程序消息:lockinc.c:5:错误:应为可锁定 “lock”之后的指令


我做错了什么?顺便说一句,如果有人知道直接答案(编码),那也很好。(我指的是一些直接获得它的网站,但不确定答案。我觉得让gcc这样做会更容易。)

你不能使用锁定寄存器。约束必须使用“m”,而不是“r”。另外,由于您同时在读和写,“value”应该是一个标有“+”的输出。为什么不直接使用“同步”、“添加”和“获取”呢?

您的使用手册怎么说?我不认为你会在没有打开手册并随时准备咨询的情况下从事此类工作。合理的建议。:)。我想我是想找到一个简单的解决办法。一个不需要asm的“怎么做”问题:stackoverflow.com/questions/2353371/how-to-do-an-atomic-increment-and-fetch-in-cGot it根据您的建议进行操作。谢谢我不能使用uuu sync_add_和_fetch,因为这段代码需要在运行时生成,然后执行。顺便说一下,答案是“f0 48 ff 05 0a 04 20 00”,在我的例子中,它翻译成“lock incq 0x20040a(%rip)”,其中f0是锁前缀,48是REX前缀,ff是incq的操作码。@chamibuddhika在代码示例/答案中嵌入像
0x20040a
这样的神奇常量是。。。很少有真实(正确)的答案。特别是当你谈论生成的代码时。根据这段代码在内存中的位置,“魔力”将发生变化。更好的办法是把精灵放回瓶子里;-)对:)。但我的要求是使用锁和所需前缀对指令本身进行编码,忽略“0x20040a”部分,它只是指令的操作数部分,无论如何都会更改。