2

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

//=== get the index to write ===///
__asm__ __volatile__ ("lock; xaddl %0,%1"
            : "=r" (indexToWrite), "=m" (   indexTable[entityId] )
            : "0" (1), "m" ( indexTable[entityId] ));

你能帮我吗?

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

4

1 回答 1

5

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

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


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

"1" (indexTable[entityId])

xadd不认为这很重要,但从技术上讲,%3否则这将是争论。就个人而言,我会选择:

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

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

于 2013-04-16T04:09:36.883 回答