Assembly x86汇编程序中带浮点数的斐波那契函数

Assembly x86汇编程序中带浮点数的斐波那契函数,assembly,x86,Assembly,X86,我写了这个,但它不起作用(n>6时崩溃): 我做错了什么和/或应该如何做 注意:我知道有一条指令要加载1.0。我这样做只是为了保持一致性,以最小化我必须处理的x86子集。x87 FPU寄存器就像一个堆栈,但只有8个;在fib的条目和第一个调用fib之间,您将在FPU寄存器堆栈上留下一个附加项 您应该仅在执行计算时使用FPU寄存器——使用主堆栈跨递归调用存储值。您是否尝试在调试器中单步执行代码?@PaulR我只是在Windows下的记事本中编写x86 asm,使用NASM编译,然后在MinGW s

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

我做错了什么和/或应该如何做


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

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


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

您是否尝试在调试器中单步执行代码?@PaulR我只是在Windows下的记事本中编写x86 asm,使用NASM编译,然后在MinGW shell中与GCC链接。我不知道有什么更好的Windows工具。你会推荐什么?我不是Windows用户,但我知道你可以将gdb作为Cygwin的一部分,而且我相信一定还有很多其他Windows特定的调试器可供选择。如果你要做任何严肃的编程,那么你真的需要掌握一个像样的调试器。啊,太明显了。谢谢!:-)
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