在64位体系结构上编译库:错误的寄存器`%rax'与`l'后缀一起使用

Pha*_*ate 2 linux assembly gcc x86-64

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

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

你能帮我吗?

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

Bre*_*ale 5

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

语法:xaddl %k0,%k1也是无害的,因为%1无论如何都是mem addr.8,16,32,和64位操作数改进剂是b,w,k,q分别.


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

"1" (indexTable[entityId])

随着xadd我不认为它很重要,但是这在技术上是争论%3否则.就个人而言,我会选择:

: "=r" (indexToWrite), "+m" (indexTable[entityId]) : "0" (1)
Run Code Online (Sandbox Code Playgroud)

是的,"+m"完全合法.它已经很长一段时间了,最​​近才被纠正为gcc 文档中的一个错误!