【发布时间】:2021-05-11 08:06:33
【问题描述】:
您好,我正在尝试使用 gcc 7.5 版本在 Linux 上编译以下汇编代码,但不知何故得到了错误
错误:助记符中的字符“(”无效
bool InterlockedCompareAndStore128(int *dest,int *newVal,int *oldVal)
{
asm(
"push %rbx\n"
"push %rdi\n"
"mov %rcx, %rdi\n" // ptr to dest -> RDI
"mov 8(%rdx), %rcx\n" // newVal -> RCX:RBX
"mov (%rdx), %rbx\n"
"mov 8(%r8), %rdx\n" // oldVal -> RDX:RAX
"mov (%r8), %rax\n"
"lock (%rdi), cmpxchg16b\n"
"mov $0, %rax\n"
"jnz exit\n"
"inc1 %rax\n"
"exit:;\n"
"pop %rdi\n"
"pop %rbx\n"
);
}
任何人都可以建议如何解决这个问题。检查了许多关于汇编代码的在线链接和教程,但无法关联确切的问题。 提前感谢您的帮助。
在 Windows 中,我可以看到上述函数的实现如下:
function InterlockedCompareExchange128;
asm
.PUSHNV RBX
MOV R10,RCX
MOV RBX,R8
MOV RCX,RDX
MOV RDX,[R9+8]
MOV RAX,[R9]
LOCK CMPXCHG16B [R10]
MOV [R9+8],RDX
MOV [R9],RAX
SETZ AL
MOVZX EAX, AL
end;
对于 PUSHNV ,我在 Linux 上找不到与此相关的任何内容。所以,基本上我正在尝试在 Linux 上用 c++ 实现相同的功能。
【问题讨论】:
-
该代码中有七个
(s。编译器指的是哪一个? -
您是否考虑过使用某人向您推荐的atomic builtins last time?至于当前的问题,
lock (%rdi)对我来说看起来不太正确,该论点不应该在 cmpxchg16b 之后进行吗? -
@dratenik 在windows中命令是lock cmpxchg16b [rdi](在delphi中)它在Linux上转换为c++,所以在Linux中src和dest对于mov来说是相反的,但我不太确定锁 。也许你是对的。
-
@dratenik 我尝试了原子内置函数,他们努力获得 8 字节(64 位)的值,但我需要 16 字节(128 位),这是我无法使用原子函数实现的。比如上面的代码中,dest参数应该是16个字节。
-
@molbdnilo 当前指向指令“mov 8(%rdx), %rcx\n”