【问题标题】:Debian linux compile fails: asm impossible constraintDebian linux 编译失败:asm 不可能的约束
【发布时间】:2012-07-22 08:50:27
【问题描述】:

这是一个我不知道从哪里开始的领域。 我正在尝试编译使用 G3Dlite 的二进制文件。 我已经遇到了一个未定义的“__decl”,我必须定义它,因为platform.h 中没有定义。 之后,编译器停止了这个错误:

./dep/include/g3dlite/G3D/AtomicInt32.h:124:44: error: impossible constraint in ‘asm’

第 124 行在这个函数中:

 /** Returns zero if the result is zero after decrement, non-zero otherwise.*/
int32 decrement() {
    #if defined(G3D_WIN32)
        // Note: returns the newly decremented value
        return InterlockedDecrement(&m_value);
        #elif defined(G3D_LINUX)  || defined(G3D_FREEBSD)
        unsigned char nz;

        asm volatile ("lock; decl %1;\n\t"
                      "setnz %%al"
                      : "=a" (nz)
                      : "m" (m_value)
                      : "memory", "cc");
        return nz;
   #elif defined(G3D_OSX)
        // Note: returns the newly decremented value
        return OSAtomicDecrement32(&m_value);
   #endif
}

我不确定 Linux 上的问题是什么。此代码已在其他平台上正常检出并编译,所以我想知道这是 g3d 代码还是我的本地操作系统的问题。

arcemu@raspberrypi ~ $ uname -a && gcc --version && cmake --version
Linux raspberrypi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux
gcc (Debian 4.6.3-8+rpi1) 4.6.3
cmake version 2.8.9-rc1

我阅读了许多相关帖子,这些帖子似乎表明不再支持“修改”。

谁能指出一个开始解决此问题的好地方?

谢谢。

【问题讨论】:

  • 你确信内联汇编应该在 ARM 上工作吗?

标签: gcc linux-kernel inline-assembly


【解决方案1】:

输出约束指定了一个 x86 寄存器 (EAX),这在 arm cpu 上是不可能的。此外,锁定前缀是特定于 x86 的平台,并且 arm 也不支持 decl 和 setnz 指令。

这是输出约束:

    : "=a" (nz)

它告诉 gcc 使用寄存器 eax 来保存结果,然后将其复制到变量 nz

【讨论】:

  • 好吧,这很有道理。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多