如何在 VS c++ 中使用 IA32 指令“fabs”?
-
21-12-2019 - |
题
这是我第一次尝试使用汇编,我只是尝试使用英特尔架构指令 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
将获取浮点堆栈顶部操作数的绝对值并将结果存回同一位置。
不隶属于 StackOverflow