アセンブリ言語でフィボナッチ数列の実装をプログラミングしていると、奇妙なバグが発生します。最初は機能しますが、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 つのリマインダーだと思います。ご協力いただきありがとうございます。