在 64 位体系结构上编译库:与"l"后缀一起使用的寄存器"%rax"不正确



我必须在64位架构上编译一个库,无论如何我得到了这个错误。受错误影响的代码行在汇编中,这里有一个示例(它们都非常相似):

//=== get the index to write ===///
__asm__ __volatile__ ("lock; xaddl %0,%1"
            : "=r" (indexToWrite), "=m" (   indexTable[entityId] )
            : "0" (1), "m" ( indexTable[entityId] ));
你能帮我一下吗?

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

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

语法:xaddl %k0,%k1也是无害的,因为%1无论如何都是内存地址。8位、16位、32位和64位的操作数修饰符分别为bwkq


输入列表中的第二个"m"对我来说似乎很可疑。我可能错了,但我认为应该是:

"1" (indexTable[entityId])

xadd我不认为这很重要,但这将在技术上是参数%3否则。我个人认为:

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

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

最新更新