我正在努力处理一些 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 添加两个整数,并且效果很好。我已经翻阅了大量 Material ,但也许这里有人可以给我指点像样的 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 64 位(检查两次 :D)
  • 问题:FPU 不能将两个数字相加 :(

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

    提前谢谢大家!

    最佳答案

    好吧,最后结果证明我的问题与事实有关,FPU 寄存器被组织成一个堆栈,我没有足够注意它导致垃圾和不需要的剩余物。从“标准”版本切换到“流行”版本的说明很有帮助!

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

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

    关于assembly - 如何在 x86-64 汇编中使用浮点数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10874796/

    10-10 18:22
    查看更多