4

我正在为一些 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 64bit
  • 处理器:Intel i5 - 2430M 64bit(检查两次:D)
  • 问题:FPU 不能添加两个数字 :(

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

提前谢谢大家!

4

2 回答 2

4

好的,所以最后发现我的问题与 FPU 寄存器被组织为堆栈的事实有关,而我没有给予足够的关注,这导致了垃圾和不需要的剩余物。从“标准”版本到“流行”版本的指令有帮助!

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

如果有人感兴趣 - 我正在做一个课堂作业,我必须从装配中另一个(地心模型)的角度计算一个行星的运动。可以在此处查看转换为处理的最终结果。

于 2012-06-05T02:09:06.530 回答
0

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

另外,应该是

  FADD st1, st0

将两个数字相加。否则它将使第二个值加倍。

于 2012-06-03T23:36:53.233 回答