【发布时间】:2012-08-07 19:56:12
【问题描述】:
我正在尝试使用内联汇编,并尝试在内联汇编中添加十进制数(不,不是整数)。问题是,当我调用以下函数时:
inline double ADD(double num1, double num2) {
double res;
_asm{
push eax; push the former state of eax onto stack
mov eax, num1;
add eax, num2;
mov res, eax;
pop eax; restore the former state of eax now that we are done
} return res;}
编译器抱怨内联汇编中的操作数大小不正确(所有汇编行,不包括 push 和 pop 指令行)。所以只好改成整数类型,比如unsigned long,然后就可以了,不过当然只支持整数类型;十进制结果四舍五入。
有没有办法在汇编中添加允许像 8.4 这样的小数结果?
【问题讨论】:
-
注:二进制浮点数(
float、double等)不是十进制浮点数,不是实数(在数学意义上)。 -
1.8 和 9.8 都不能完全表示为双精度。
-
@FredOverflow 引用的内容是您应该关心的众多原因之一(其他资源有大量资源,但它们进行了深入解释,因此需要大量数学和/或有点摆弄知识才能很好地理解,所以让我们把它留在那里)。遗憾的是,它在大多数情况下都会检查出来,但您会在此类计算中遇到“奇怪的错误”,所以我想我会警告您。只需搜索 SO 即可查看数百个示例 - 这是最常见的问题之一。
-
请不要
push eax。这是唯一不需要保存的寄存器,因为它会返回结果。 -
仅供参考,eax 为 32 位宽,但双精度为 64 位。那永远行不通。