在汇编中添加浮点/双精度数

时间:2012-08-07 19:56:13

标签: c assembly x86 x87

我正在尝试内联汇编,我试图在内联汇编中添加十进制数字(不,不是整数)。问题是,当我调用以下函数时:

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?

5 个答案:

答案 0 :(得分:7)

我在十年内没有完成x87汇编,但它应该是这样的:

fld num1   ; load num1 and push it onto the fpu stack
fld num2   ; load num2 and push it onto the fpu stack
faddp      ; pop two numbers, add them, push sum on the stack
fstp res   ; pop sum from the stack and store it in res

答案 1 :(得分:6)

你可能想要的指令是ADDSD,但我不确定。

以下是英特尔指令集手册的链接。 http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/

他们过去常常免费邮寄你的硬拷贝,但看起来已经不再适用了。

答案 2 :(得分:1)

您需要一组不同的指令来操作浮点数。以下是应该有所帮助的介绍:x86 Assembly: Floating Point

答案 3 :(得分:0)

上面的答案,你必须将操作数推入FP堆栈并弹出结果是正确的。

然而,“不正确的操作数大小”错误的直接原因是“扩展”寄存器,“e __”(例如eax)是32位,双精度浮点数是64位。

答案 4 :(得分:0)

试试这个:

_asm{

movq xmm0,[num1]
addpd xmm0, [num2];
movq [res],xmm0
// sse2
 }