1

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

这只是应该清除符号位。

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

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

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

这种特殊的尝试给出了错误 C2400: inline assembler syntax error in 'opcode'; 成立 '('


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

4

2 回答 2

2

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

__asm{ ... }

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

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

__asm {
    fld x
    fabs
    fstp x
}

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

于 2013-11-17T23:07:46.737 回答
1

使用 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将取浮点堆栈顶部的操作数的绝对值并将结果存回相同的位置。

于 2013-11-17T23:10:23.313 回答