0

我正在用汇编语言编写斐波那契数列的实现,我遇到了一个奇怪的错误。一开始它可以工作,但是当我达到 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”。那么,我该如何解决这个问题,更重要的是,我想了解这里发生的事情导致了这个问题。谢谢!

编辑:好吧,我看到了我的愚蠢错误。显然所有的输出都是十六进制的。好吧,我想这只是另一个提醒我不要操之过急。再次感谢你的帮助!

4

2 回答 2

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
于 2013-11-07T22:02:00.773 回答
0

你所有的输出都是十六进制的。0xD 是 13,0x15 是 21,0x22 是 34,依此类推。所以计算似乎是正确的,但是您的 DumpRegs 过程正在做一些奇怪的事情。

于 2013-11-07T22:11:39.293 回答