0

アセンブリ言語でフィボナッチ数列の実装をプログラミングしていると、奇妙なバグが発生します。最初は機能しますが、8 + 13 (つまり、16 進数で 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 です。

ご覧のとおり、これは "D" である正しい Fib シーケンスから逸脱しています。どうすればこれを修正できますか? さらに重要なことに、ここで何が起こっているのかを理解したいと思います。ありがとう!

編集:さて、私は私のばかげた間違いを見ます。明らかに、すべての出力は 16 進数です。ええと、これは私が性急にならないようにするためのもう 1 つのリマインダーだと思います。ご協力いただきありがとうございます。

4

2 に答える 2

2

更新リマーク: あなたのコードは機能します。ほとんどの出力が 16 進文字にならず、10 進数のように見えるため、混乱しています。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 に答える