Странная ошибка добавления языка ассемблера

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


person Nathan    schedule 07.11.2013    source источник
comment
покажите нам также процесс DumpRegs   -  person Sten Petrov    schedule 08.11.2013


Ответы (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
person Sten Petrov    schedule 07.11.2013

Все выходные данные представлены в шестнадцатеричном формате. 0xD — 13, 0x15 — 21, 0x22 — 34 и так далее. Таким образом, вычисления кажутся правильными, но ваша процедура DumpRegs делает что-то странное.

person PMF    schedule 07.11.2013