【问题标题】:Compile GCC Inline Assembly into Microsoft Visual C++ 2008将 GCC 内联汇编编译成 Microsoft Visual C++ 2008
【发布时间】:2014-02-03 22:55:05
【问题描述】:

我无法将此 GCC 内联程序集编译为 Microsoft Visual C++ 2008 程序集

GCC 内联汇编:

__asm__(
    "smull %0, %1, %2, %3     \n\t"
    "mov   %0, %0,     LSR #16 \n\t"
    "add   %1, %0, %1, LSL #16  \n\t"
    : "=&r"(lo), "=&r"(hi)
    : "r"(rb), "r"(ra));

编译器说:

错误 C2143:语法错误:在 ':' 之前缺少 ')'

完整的功能是:

static __inline Word32 mull(Word32 a, Word16 b)
{
    register Word32 ra = a;
    register Word32 rb = b;
    Word32 lo, hi;

    __asm__(
        "smull %0, %1, %2, %3     \n\t"
        "mov   %0, %0,     LSR #16 \n\t"
        "add   %1, %0, %1, LSL #16  \n\t"
        : "=&r"(lo), "=&r"(hi)
        : "r"(rb), "r"(ra));

    return hi;
}

谢谢。

【问题讨论】:

  • 内联asm的MS扩展名是__asm,它的语法一般有很大的不同。另外我不太确定它是否支持 ARM 上的内联汇编。 (可能需要一个单独的 .asm 文件。)
  • 你能试着把它翻译成MS扩展吗? @asveikau
  • 再补充一点:一般来说,如果某些函数或调用以下划线开头(如__asm__()),您应该始终假设它不适用于其他编译器,因为它不是一部分的标准。

标签: c gcc assembly arm inline-assembly


【解决方案1】:

Visual Studio 不支持 ARM 内联汇编。请参阅:Inline assembly is not supported on the ARM。您需要将汇编代码逆向工程为 C,或者使用单独的汇编程序并将其链接为单独的函数。

看起来这个函数只是做一个 32 x 32 -> 64 位有符号乘法,然后将 64 位结果右移 16 位并将其截断为 32 位:

static __inline Word32 mull(Word32 a, Word16 b)
{
    return (Word32)(((Word64)a * (Word64)b) >> 16);
}

【讨论】:

  • 是的,C 的逆向工程将是一个解决方案,但我该怎么做呢?据我了解,程序集将两个参数相乘,然后右移 16 位和左移 16 位,我不知道 C 等效源代码是什么 :(
  • 只需阅读 ARM 指令的描述,然后在 C 中实现它们。您可以使用 gcc 代码来验证您的 C 解释。见:infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/…
  • 我尝试将其转换为 C 但我对汇编指令非常困惑,任何指南将不胜感激:)
  • 好的 - 我已将代码转换为 C,我认为它是正确的,但您需要对其进行测试。
  • 谢谢@Paul R 我会测试它。
猜你喜欢
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 2013-07-23
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多