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

这只是为了清除符号位。

我对汇编的了解很少涉及源和目的地,但我没有看到任何对此指令的符号的引用。

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

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

此特定尝试给出错误 C2400:“操作码”中的内联汇编器语法错误;成立 '('


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

有帮助吗?

解决方案

几个指针:首先 - 您正在使用内联装配的MS样式,您可以使用 -

__asm{ ... }
.

第二 - 说明没有函数,所以括号也有错误。

最后但最重要的 - fabs不接受参数,它只是在FP堆栈的顶部工作。您需要首先明确地在那里加载变量。尝试:

__asm {
    fld x
    fabs
    fstp x
}
.

无论如何,使用旧的x87说明可能不是一件好事,它可能是非常效率的 - 你应该考虑切换到SSE解决方案,见 - 使用SSE指令集绝对2双或4个浮点数?(最多sse4)

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top