【问题标题】:Error compiling inline MMX assembler: Suffix or operands invalid编译内联 MMX 汇编程序时出错:后缀或操作数无效
【发布时间】:2013-01-16 21:05:59
【问题描述】:

以下代码:

simd(n, is)
long *is;
{   
   long i;
   asm("pxor %mm0,%mm0");
   for (i = 0; i < n; i += W) {

       asm("movq %0 %%mm1\n\t"
           "paddq %%mm1 %%mm0"
           :
           :"m"(is[i])          );

   }
   return 0;
}

我无法理解为什么它无法编译并出现以下错误:

/tmp/ccrDnFTm.s: Assembler messages:
/tmp/ccrDnFTm.s:29: Error: suffix or operands invalid for `movq'
/tmp/ccrDnFTm.s:30: Error: junk `%mm0' after register

为什么?

【问题讨论】:

  • 为什么在这个时代你还在编写使用 MMX 的代码?这是一个非常过时的指令集;除非你有充分的理由应该改用 SSE。
  • @StephenCanon:代码将在使用旧奔腾处理器的工业控制系统中运行。更换硬件是一种选择,但主板有定制的外围设备(模拟 I/O),复制成本很高。
  • 很好,这是一个难得的好理由。确保在使用 MMX 进行任何计算后发出 EMMS 指令,以便重置 x87 状态。不这样做是导致极难诊断错误的常见原因。

标签: c gcc assembly mmx


【解决方案1】:

操作数必须用逗号分隔:

movq %0, %%mm1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 2019-10-18
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多