泰勒级数在装配中的指数函数

时间:2014-05-09 06:35:29

标签: linux assembly x86 att taylor-series

我正在尝试根据以下等式在程序集中实现指数函数算法: http://upload.wikimedia.org/math/4/5/9/4597c1e758b3aeb83adcb03d3f75d00e.png

汇编中的代码:

.data
x:
    .space 8
result:
    .space 8
counter:
    .space 8
factorial:
    .space 8
n:
    .space 8
xn:
    .space 8
.text
.global expot
expot:
    pushl   %ebp
    movl    %esp, %ebp
    flds    8(%ebp)     # wczytaj x
    fstps   x
    flds    12(%ebp)    # wczytaj precyzje
    fstps   n
    fldz    
    fstps   result
    fld1
    fstps   factorial
    fld1
    fstps   counter
    fld1
    fstps   xn

loop:
    flds    factorial
    flds    xn
    fdiv    %st(1)
    fldl    result
    fadd    %st(1), %st(0)
    fstps   result

    flds    counter
    fcom    n
je end

    flds    xn
    fmul    x
    fstps   xn

    fld1
    flds    counter
    fadd    %st(1)
    fstps   counter

    flds    counter
    flds    factorial
    fmul    %st(1)
    fstps   factorial
jmp loop

end:
leave
ret

我的代码在C:

#include <stdio.h>

extern float expot (float x, float n);

int main(void)
{
    float x = expot (1, 4);
    printf ("%f\n", x);
    return 0;
}

我的问题是这个函数没有返回任何内容。当我用gdb调试它时,我看到在第二次迭代中,当它应该计算x ^ n时,结果是-nan然后它应该计算2!它再次返回-nan。我完全不知道这段代码有什么问题。

感谢您的所有回复。

2 个答案:

答案 0 :(得分:2)

您的函数未返回任何值。

x86 cdecl calling convention表示:

  

整数值和存储器地址在EAX寄存器中返回,浮点值在ST0 x87寄存器中。

答案 1 :(得分:2)

FPU堆栈并非无穷无尽。在你的循环中,你推(fld)的值多于pop(fstp)。因此堆栈变满,每次新推送产生NaN。