Нерекурсивная последовательность Фибоначчи в Сборке

StackOverflow https://stackoverflow.com//questions/9607217

Вопрос

В некоторых домашних задании я должен создать программу последовательности фибоначчи в сборке.Я создал этот код, но, похоже, не работает правильно, и я не уверен в том, почему.Я верю, что я делаю это правильно, но EAX остается «2» каждая петля.

    INCLUDE Irvine32.inc
    .data
        prev DWORD ?
        next DWORD ?
        val DWORD ?
        count DWORD ?
        total DWORD ?

        myMsg BYTE "Fibonacci Sequence ",0dh,0ah,0

   .code
    main PROC
       mov ecx,15
       mov val,1
       mov prev,-1
       mov eax,1
       mov edx,OFFSET myMsg
       call WriteString

    L1:
       mov count,ecx
       mov ebx,val
       add ebx,prev
       mov total,ebx
       mov ebx,val
       mov prev,ebx
       mov eax,total
       mov val, ebx
       call WriteInt
       call Crlf
       loop L1

    exit
    main ENDP
    END main
.

Это было полезно?

Решение

может выглядеть так (непроверенно):

    mov  ecx, 15
    mov  eax, 0    ;a = 0
    mov  ebx, 1    ;b = 1
_fib:
    mov  edx, eax 
    add  edx, ebx  ;sum = a + b
    mov  eax, ebx  ;a = b
    mov  ebx, edx  ;b = sum
    loop _fib
.

Другие советы

Ваш цикл упрощает это в псевдокоде:

L1:
   count = ecx; // count === 15
   eax = total = val + prev; // prev = -1 => eax = 0. prev = 1 => eax = 2
   prev = val; // sets prev = 1, val doesn't change so prev = 1 after the first iteration
.

Как вы можете видеть, eax= val + prev будет оценивать 2, как только предыдущая установка на 1.

Вы должны уточнить спецификацию вашей проблемы.Сколько целых чисел вы хотите распечатать?Это какой счет= 15 для?В этом случае вам необходимо уменьшить количество с каждой итерацией и проверять, что он не равен нулю.

Что касается последовательности Fibonacci, вы должны делать что-то подобное в вашей петле:

// lets say that eax is the current integer in the sequence and prev is the previous integer
// then the next integer = eax + prev
ebx = eax + prev
prev = eax
eax = ebx
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top