gpt4 book ai didi

c++ - 错误 : invalid instruction suffix for `cmpxchg'

转载 作者:行者123 更新时间:2023-11-30 04:20:17 25 4
gpt4 key购买 nike

我正在尝试编译另一个项目的代码,但我一直收到错误:“cmpxchg”的无效指令后缀。错误一直指向的代码行是:

inline bool CAS(long *ptr, long oldv, long newv) {
unsigned char ret;
/* Note that sete sets a 'byte' not the word */
__asm__ __volatile__ (
" lock\n"
" cmpxchgq %2,%1\n"
" sete %0\n"
: "=q" (ret), "=m" (*ptr)
: "r" (newv), "m" (*ptr), "a" (oldv)
: "memory");
return ret;
}

我想知道是否有人知道错误的原因以及可能的解决方案是什么?

最佳答案

正如评论员所提到的,问题在于 cmpxchg 末尾的“q”。汇编程序使用指令后缀字符来指示位宽,否则会产生歧义。

对于 64 位目标,此代码可以使用 gcc 进行良好编译。您会为 cmpxchgq 指令获得此输出。

f0 48 0f b1 16          lock cmpxchg %rdx,(%rsi)

那f0是LOCK前缀,48是REX.W前缀。真正的操作码是 0f b1。

为 32 位目标编译(gcc 选项 -m32),导致后缀错误。

如果您需要此代码在 32 位机器上运行,那么您会在此处遇到移植问题。对于 Linux,sizeof(long) 在 64 位机器上为 8,在 32 位机器上为 4。 IF 这是一个很大的假设,整个程序足够灵活以容忍从 8 字节到 4 字节的“长”,您只需将“q”后缀更改为“l”即可(这是一个小写的 L)。这为您提供了 32 位形式的“0f b1”指令:

 f0 0f b1 16             lock cmpxchg %edx,(%esi) 

如果不是,那么您可以尝试为 32 位目标重写程序集以使用 CMPXCHG8B,这是一条具有不同寄存器接触行为的不同指令。 CMPXCHG8B 不是直接替代品!

关于c++ - 错误 : invalid instruction suffix for `cmpxchg' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15373922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com