奇怪的汇编语言添加错误

时间:2013-11-07 21:50:01

标签: assembly x86 masm32 irvine32

我正在用汇编语言编写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”。那么,我该如何解决这个问题,更重要的是,我想了解这里发生的事情。谢谢!

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

2 个答案:

答案 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程序正在做一些奇怪的事情。