【发布时间】:2015-05-26 20:10:51
【问题描述】:
我目前正在研究函数,它使用 C 和 64 位汇编组合(C 使用 asm 函数)计算 sin(x) 函数的泰勒近似值。 我对汇编和低级编程比较陌生,但我仍然没有得到一些东西。
让我们在 C 中调用函数:
float taylor(float fi, float n);
其中fi是角度,n是步数。我明白了,在汇编部分中,fi 存储在 xmm0 寄存器中,n 存储在 rax 寄存器中。
- 我应该将返回值放在哪个寄存器的末尾? (作为浮动)
-
我计算 x^3、x^5、x^7 等的方法是简单地将 xmm 寄存器的值乘以自身,但如何除以整数阶乘? (x^3/3!等等)。有什么办法可以把 f.e. 3! = 6 到 xmm 寄存器使其浮动,所以它会被视为 6.0?我不知道如何划分这两个数字。我尝试了类似的方法:
movq $6, %rbx movq %rbx, %xmm1 divpd %xmm0, %xmm1但它给出了 NaN 的结果(给定示例参数:6 10) - 我不知道如何使它工作......
【问题讨论】:
-
对于返回寄存器分配,您必须查看调用约定。您使用的是什么操作系统/编译器?
-
从标题我认为这将是一个更有趣的问题.. 实际的 SSE 整数除法很烦人,但这正是您不想要的。
-
@Dani: Linux 2.6.32-73-server x86_64,使用AS和GCC编译
标签: assembly floating-point x86-64 sse