Linux 在64位体系结构上编译库:不正确的寄存器“%rax';与'l';后缀

Linux 在64位体系结构上编译库:不正确的寄存器“%rax';与'l';后缀,linux,gcc,assembly,x86-64,Linux,Gcc,Assembly,X86 64,我必须在64位体系结构上编译一个库,无论如何我都会遇到这个错误。 受错误影响的代码行位于assembler中,下面是一个示例(它们都非常相似): 你能帮我吗 我在linux 64位(ubuntu)下,使用gcc。使用k操作数修饰符选择32位子寄存器:xaddl%k0,%1 语法:xaddl%k0,%k1也是无害的,因为%1无论如何都是memaddr。 8位、16位、32位和64位的操作数修饰符分别为b、w、k、q 在我看来,输入列表中的第二个“m”。我可能错了,但我认为应该是: “1”(可索引

我必须在64位体系结构上编译一个库,无论如何我都会遇到这个错误。 受错误影响的代码行位于assembler中,下面是一个示例(它们都非常相似):

你能帮我吗


我在linux 64位(ubuntu)下,使用gcc。

使用
k
操作数修饰符选择32位子寄存器:
xaddl%k0,%1

语法:
xaddl%k0,%k1
也是无害的,因为
%1
无论如何都是memaddr。 8位、16位、32位和64位的操作数修饰符分别为
b
w
k
q


在我看来,输入列表中的第二个
“m”
。我可能错了,但我认为应该是:

“1”(可索引的[entityId])

对于
xadd
我认为这并不重要,但从技术上讲,这将是参数
%3
。 我个人认为:

: "=r" (indexToWrite), "+m" (indexTable[entityId]) : "0" (1)

是的,
“+m”
是完全合法的。它已经存在很长一段时间了,直到最近才作为一个错误在gcc的文档中得到纠正

那么
xaddq
怎么样?后缀
l
表示dwords<代码> RAX是QWord。您会考虑使用而不是自己构建吗?
: "=r" (indexToWrite), "+m" (indexTable[entityId]) : "0" (1)