Я программирую реализацию последовательности Фибоначчи на ассемблере и получаю странную ошибку. Сначала это работает, но когда я достигаю 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
Как видите, это отклоняется от правильной последовательности Фибоначчи, где она "D". Итак, как я могу это исправить, и, что более важно, я хочу понять, что здесь происходит, чтобы вызвать это. Спасибо!
edit: Хорошо, я вижу свою глупую ошибку. Очевидно, что все выходные данные в шестнадцатеричном формате. Что ж, думаю, это просто еще одно напоминание, чтобы я не торопился. Еще раз спасибо за помощь!