我写了这个,但它不起作用(与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子集。
答案 0 :(得分:2)
x87 FPU寄存器就像一个堆栈,但只有8个;在fib
的条目和第一个call fib
之间,您将在FPU寄存器堆栈上留下一个额外的项目。
您应该仅在执行计算时使用FPU寄存器 - 使用主堆栈在递归调用中存储值。