我正在尝试根据以下等式在程序集中实现指数函数算法: 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。我完全不知道这段代码有什么问题。
感谢您的所有回复。
答案 0 :(得分:2)
答案 1 :(得分:2)
FPU堆栈并非无穷无尽。在你的循环中,你推(fld)的值多于pop(fstp)。因此堆栈变满,每次新推送产生NaN。