【问题标题】:How to use IA32 instruction 'fabs' in VS c++?如何在 VS c++ 中使用 IA32 指令“fabs”?
【发布时间】:2013-11-17 22:55:04
【问题描述】:

这是我第一次尝试使用汇编,我只是尝试使用英特尔架构指令FABS。 (参考第 399 页上的 this document)。

这只是为了清除符号位。

我对汇编知之甚少,涉及来源和目的地,但我没有看到对该指令符号的任何引用。

以下是我使用它的尝试之一(使用 Visual Studio 2012,C++):

double myabs(double x){
  __asm(fabs(x));
return x;
}

这个特殊的尝试给出了错误 C2400: inline assembler syntax error in 'opcode';找到'('


请注意,我想使用汇编指令,并且对可用的其他/“更好”选项不感兴趣。

【问题讨论】:

  • 不需要内联汇编。编译器很可能会自行内联 fabs() 函数调用。

标签: c++ visual-studio-2012 assembly x86 x87


【解决方案1】:

几个指针:首先 - 你使用的是 gcc 风格的内联汇编,你可以使用 MS 风格 -

__asm{ ... }

第二个 - 指令不是函数,所以括号也是错误的。

最后但最重要的 - fabs 不带参数,它只在 FP 堆栈的顶部工作。您需要先在此处显式加载变量。试试这个:

__asm {
    fld x
    fabs
    fstp x
}

无论如何,使用旧的 x87 指令可能不是一件好事,它可能效率很低 - 您应该考虑切换到 SSE 解决方案,请参阅 - How to absolute 2 double or 4 floats using SSE instruction set? (Up to SSE4)

【讨论】:

    【解决方案2】:

    使用 VC++,您不必将汇编语言括在括号中。正确的语法更像是:

    __asm fabs
    

    或:

    __asm { 
        fabs
        // possibly more instructions here
    }
    

    在您的具体情况下,您可能需要以下内容:

    __asm { 
        fload x // load x onto F.P. stack
        fabs    // take absolute value
        fstp x  // store back to x and pop from F.P. stack.
    }
    

    就源和目标而言,x86 上的浮点使用堆栈。除非您另外指定,否则大多数指令(加载/存储除外)从堆栈顶部获取操作数并将结果也存放在堆栈顶部。例如,在没有给出操作数的情况下,fabs 将取浮点堆栈顶部的操作数的绝对值并将结果存回原处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多