6

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

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 这样的十进制结果的程序集?

4

5 回答 5

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
于 2012-08-07T20:05:51.373 回答
6

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

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

他们过去常常免费邮寄给你纸质版,但现在看来不再是这样了。

于 2012-08-07T20:31:16.133 回答
1

尝试这个:

_asm{

movq xmm0,[num1]
addpd xmm0, [num2];
movq [res],xmm0
// sse2
 }
于 2012-08-08T14:43:31.477 回答
1

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

于 2012-08-07T20:07:06.787 回答
0

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

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

于 2012-08-07T21:07:00.517 回答