Assembly x86汇编程序中带浮点数的斐波那契函数
我写了这个,但它不起作用(n>6时崩溃): 我做错了什么和/或应该如何做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
注意:我知道有一条指令要加载
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