我正在努力解决一些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教程,或分享她/他的经验和智慧:))
总结要领:
以防万一:最后我希望使用FSINCOS
和其他花哨的FPU指令,但看到甚至简单的添加失败......
提前全部谢谢!
答案 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
将两个数字加在一起。否则它将使第二个值加倍。