【问题标题】:Taylor series expotential function in assembly装配中的泰勒级数指数函数
【发布时间】:2014-05-09 06:35:28
【问题描述】:

我正在尝试根据这个方程在汇编中实现指数函数算法: 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 。我完全不知道这段代码有什么问题。

感谢您的所有回复。

【问题讨论】:

  • 为什么nfloat 而不是int
  • 因为我想如果我将它与另一个浮点值进行比较,我应该使用浮点数。

标签: linux assembly x86 att taylor-series


【解决方案1】:

FPU 堆栈不是无穷无尽的。在您的循环中,您推送(fld)比弹出(fstp)更多的值。所以堆栈变满了,每次新的推送都会产生一个 NaN。

【讨论】:

  • 非常感谢,我不知道这会产生错误。
【解决方案2】:

你的函数没有返回任何值。

x86 cdecl calling convention 表示:

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

【讨论】:

  • 是的,你是对的,我不小心在 end: 之后删除了 line flds 结果。它没有帮助,它仍然没有返回任何东西,因为 -nan 的错误。
  • @user3448282 那么是时候打破调试器了。逐步检查您的函数,并在此过程中验证值。
  • 我做到了,在第二次迭代中,当它应该 mul xn*x 它返回 -nan 值。
猜你喜欢
  • 2014-04-03
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2016-07-26
  • 2017-06-22
  • 2014-02-23
相关资源
最近更新 更多