我必须在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位的操作数修饰符分别为b
、w
、k
、q
。
输入列表中的第二个"m"
对我来说似乎很可疑。我可能错了,但我认为应该是:
"1" (indexTable[entityId])
与xadd
我不认为这很重要,但这将在技术上是参数%3
否则。我个人认为:
: "=r" (indexToWrite), "+m" (indexTable[entityId]) : "0" (1)
是的,"+m"
是完全合法的。它已经存在很长时间了,直到最近才作为gcc 文档中的一个错误被纠正!