我目前正在研究函数,它使用C& C来计算sin(x)函数的泰勒近似。 64位汇编组合(C使用asm函数)。 我对组装起来不太新。低级编程,我仍然没有得到一些东西。
让我们在C中调用函数:
float taylor(float fi, float n);
其中fi是角度,n是步数。我知道了,在汇编部分fi存储在xmm0寄存器中,n存储在rax寄存器中。
我通过简单地将xmm寄存器保持值乘以它来计算x ^ 3,x ^ 5,x ^ 7等,但是如何将它除以整数阶乘? (x ^ 3/3!等等)。有没有办法把f.e. 3! = 6进入xmm寄存器使其浮动,所以它将被视为6.0?我不知道如何划分这两个数字。我尝试过类似的东西:
movq $6, %rbx
movq %rbx, %xmm1
divpd %xmm0, %xmm1
但是它给出了NaN的结果(给出了示例参数:6 10) - 我不知道如何让它工作......
答案 0 :(得分:1)
你应该花点时间研究一下指令集参考,这样你至少可以大致了解你有什么样的可能性。此外,您应该阅读适用于调用约定的ABI文档。
那说,你的第一个问题的答案是浮点返回值应该在xmm0
中传回,你可以使用CVTSI2SS
(或CVTSI2SD
进行双精度转换为整数浮点数)。
另请注意,您应该使用正确的标量/打包和浮点/双版本。 divpd
包含两倍,而你需要标量单,所以你真的想要divss
。
PS:你的问题不是关于FPU或MMX。相反,它是关于SSE。