我正在用汇编语言编写斐波那契数列的实现,我遇到了一个奇怪的错误。一开始它可以工作,但是当我达到 8+13(即十六进制的 8+D)时,它给了我 15。我正在使用 Visual Studio 10 / MASM 32 编译/运行它
这是我的代码(Irvine32 是一个包含一些实用函数的库),然后我将解释运行它时得到的输出:
TITLE Fibonacci
INCLUDE Irvine32.inc
.data
.code
main PROC
mov eax, 0
mov ebx, 1
mov ecx,12 ; set the loop counter to 12
;the 12 registry dumps display fib(1)-fib(12) in the eax register.
;As this is iteration based instead of loop based, the math comments
;in the loop are slighty off at the begining because of the edge condition
;so my comments about fib(n-1), etc. are valid only at fib(n) where n >= 2
fib:
mov edx,eax ;store fib(n-1) in a register temporarily
;although the first time the loop runs,
add eax,ebx ;add fib(n-1) to fib(n-2) to get fib(n)
mov ebx,edx ;replace fib(n-2) with (fib n-1)
;at this point, eax holds fib(n), and ebx hold fib(n-1), which will be
;used to calculate fib (n+1) for the next loop iteration
call DumpRegs
loop fib
exit; exit the program
main ENDP
END main ; first procedure called is main
我的eax
寄存器转储DumpRegs
依次为 1、1、2、3、5、8、D、15、22、37、59、90
如您所见,这偏离了正确的 Fib 序列,即“D”。那么,我该如何解决这个问题,更重要的是,我想了解这里发生的事情导致了这个问题。谢谢!
编辑:好吧,我看到了我的愚蠢错误。显然所有的输出都是十六进制的。好吧,我想这只是另一个提醒我不要操之过急。再次感谢你的帮助!