Некорректный вывод в ряд Фибоначчи в MASM

Я работал над этим кодом для задания, похоже, не могу получить правильный результат. Кто-нибудь может мне помочь?

ПРИМЕЧАНИЕ: программа скомпилирована в MASM.

  1. Мне разрешено использовать только команды архитектуры reg-mem и reg-reg.
  2. Используйте только инструкции MOV, ADD, DEC, JMP или Jcc.
  3. Используйте только четыре основных регистра, т. Е. EAX, EBX, ECX и EDX , а также регистр ESI и их подрегистры для арифметических / логических операций.
  4. За исключением строковых переменных памяти, никакие другие переменные памяти не допускаются.

Ниже приведен код:

INCLUDE Irvine32.inc
.data

string1 byte "Enter number to generate Fibonacci series: ",0
string2 byte "Fibonacci is ",0

.code
main PROC
call    DumpRegs;
mov     edx,offset string1;
call    writestring;
call    ReadInt;
mov     ecx,eax;
mov     eax,1;
call    DumpRegs;
dec     ecx;
mov     esi,eax;
JMP     Jumpzero;
mov edx, offset string2;    
call writeint           ;   Display the contents of eax register on the output device

Jumpzero:
add     eax,esi;
call    DumpRegs;
inc     esi;
dec     ecx
jnz     Jumpzero
exit
MAIN ENDP   
END main

person user1797972    schedule 04.11.2012    source источник
comment
В чем проблема? Что на выходе? Какого результата вы ожидаете?   -  person m0skit0    schedule 04.11.2012
comment
Если мне нужна серия Фибоначчи из 4, то результат будет 1,1,2,4. При этом на выходе должно быть 1,1,2,3. Проблема, вероятно, где-то в цикле Jumpzero, но я не могу ее исправить.   -  person user1797972    schedule 04.11.2012
comment
@ user1797972 Почему вместо dec cx jnz Jumpzero вы не используете loop Jumpzero?   -  person Powerslave    schedule 14.04.2013
comment
Последовательность Фибоначчи можно рассматривать как начинающуюся с 0: 0,1,1,2,3,5,8, .... Выясните, должно ли первое число быть равным нулю или единице для этого задания.   -  person rcgldr    schedule 19.03.2017


Ответы (2)


О боже, люди учат, основываясь на этом материале Ирвина? Это многое объясняет.

Я думаю, вам нужно подумать об этом так:

нужно запомнить 3 числа:

  • текущий номер

  • предыдущий номер

  • сумма текущего и предыдущего

затем переместите текущий к предыдущему, суммируйте к текущему и продолжите.

Итак, если вы установите все как ebx = текущее значение, edx = предыдущее значение, ecx = количество значений для вывода

тогда вы можете использовать центральный цикл, например:

fib_loop:
    mov eax, ebx
    add eax, edx
    mov edx, ebx
    mov ebx, eax
    call writeint
    dec ecx
jnz fib_loop

ПРИМЕЧАНИЕ. Я беру поведение процедуры writeint из вашего комментария, что она отображает eax только на устройстве вывода, и предполагаю, что она не взаимодействует ни с одним из других регистров.

person Lambchops    schedule 19.03.2017

Для Фибоначчи нужно отслеживать только два числа. Если бы XCHG было разрешено, логика была бы такой:

    swap(A, B)
    A += B

Если нет, то для свопа необходима временная переменная:

    D = B
    B = A
    A = D
    A += B

Начальные значения для A и B зависят от того, каким должен быть первый вывод. Например, начните с A = 1 (fib (-1)), B = -1 (fib (-2)), тогда будет создана последовательность 0,1,1,2,3,5, .... Или начните с A = 0 (fib (0)), B = 1 (fib (-1)), чтобы получить последовательность 1,1,2,3,5, ...

person rcgldr    schedule 19.03.2017