1

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

感谢您的所有回复。

4

2 回答 2

2

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

x86cdecl调用约定表明:

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

于 2014-05-09T06:39:35.677 回答
2

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

于 2014-05-09T11:17:54.347 回答