我正在用汇编语言编写Fibonacci序列的实现,我遇到了一个奇怪的错误。它最初工作,但是当我达到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
的{{1}}个注册转储按顺序排列
1,1,2,3,5,8,D,15,22,37,59,90
正如您所看到的,这会偏离正确的Fib序列,即“D”。那么,我该如何解决这个问题,更重要的是,我想了解这里发生的事情。谢谢!
编辑:好吧,我看到了我的愚蠢错误。显然所有的输出都是十六进制的。嗯,我想这只是另一个提醒我不要仓促。再次感谢你的帮助!
答案 0 :(得分:2)
更新备注: 您的代码有效,您只会因为大多数输出不会产生十六进制字母而看起来像小数字而感到困惑。 15H是21D,这是正确的数字。
这应该有效:
mov ax,0
mov bx,1
mov cx,12
step:
add ax, bx
call DumpAX
push ax ; or you can use DX to swap values of ax and bx - or xor op if you wish
push bx
pop ax
pop bx
loop step
exit
答案 1 :(得分:0)
所有您的输出均为十六进制。 0xD为13,0x15为21,0x22为34,依此类推。所以计算似乎是正确的,但你的DumpRegs程序正在做一些奇怪的事情。