Fibonacci函数与x86汇编程序中的浮点数

时间:2012-04-01 09:17:33

标签: assembly x86

我写了这个,但它不起作用(与n> 6崩溃):

section .data
    one: dq 1.0
    two: dq 2.0

        section .text
fib:
    call    print_float
    fld qword [two]
    fcomip
    ja  fin
    fld st0     ; copy arg
    fld qword [one]
    fsub
    call    fib     ; st0=fib(n-1), st1=arg
    fld st1
    fld qword [two]
    fsub
    call    fib     ; st0=fib(n-2), st1=fib(n-1), st2=arg
    fadd            ; st0=fib(n-2)+fib(n-1), st1=arg
    fstp    st1     ; st0=fib(n-2)+fib(n-1)
fin:
    ret

我做错了什么和/或我该怎么做?

注意:我知道有一条加载1.0的指令。我只是这样做是为了保持一致性,以便最小化我必须处理的x86子集。

1 个答案:

答案 0 :(得分:2)

x87 FPU寄存器就像一个堆栈,但只有8个;在fib的条目和第一个call fib之间,您将在FPU寄存器堆栈上留下一个额外的项目。

您应该仅在执行计算时使用FPU寄存器 - 使用主堆栈在递归调用中存储值。