如何在x86-64汇编中使用浮点数?

时间:2012-06-03 23:28:11

标签: assembly x86-64 nasm intel fpu

我正在努力解决一些x86-64程序集,浮点数让我很头疼。例如,当我运行此代码时:

section .data
     omega:  dq 2.0
     omega2: dq 3.0

section .text
global func

func: push rbp
      mov rgp, rsp

      FINIT

      FLD qword [omega]
      FLD qword [omega2]
      FADD st0, st0

      mov rsp, rbp
      pop rbp
      ret

从C代码调用此函数:printf("%Lf \n", func() ); 不幸的是结果是一些奇怪的数字......我尝试使用FIADD添加两个整数,并且它工作正常。我已经挖掘了大量材料,但也许有人可以指点我体面的FPU教程,或分享她/他的经验和智慧:))

总结要领:

  • 语言:x86-64汇编程序
  • 汇编程序:从存储库安装的nasm v.2.09.04
  • 编译器(用于C):gcc v.4.5.2(随Ubuntu一起安装)
  • 操作系统:Oracle VM上的Ubuntu 11.04 64位
  • 主机操作系统:Windows 7 SP1 64位
  • 处理器:Intel i5 - 2430M 64bit(检查两次:D)
  • 问题:FPU无法添加两个数字:(

以防万一:最后我希望使用FSINCOS和其他花哨的FPU指令,但看到甚至简单的添加失败......

提前全部谢谢!

2 个答案:

答案 0 :(得分:3)

好吧,所以最后我发现我的问题与FPU寄存器被组织成一个堆栈的事实有关,我没有足够重视它导致垃圾和不需要的剩余物。从“标准”转换为“弹出”版本的指令有帮助!

无论如何 - 感谢所有打扰阅读的人,非常感谢! :)

如果有人感兴趣 - 我正在做一个课程作业,我必须从另一个(地心模型)的视图中计算一个行星的运动。 The final result translated to processing can be viewed here.

答案 1 :(得分:0)

printf%f的L限定符使该参数成为long double(80位浮点数),这不是汇编数据类型。删除L,它将默认为double(64位浮点数),这是您正在计算的。

此外,它应该是

  FADD st1, st0

将两个数字加在一起。否则它将使第二个值加倍。