Нерекурсивная последовательность Фибоначчи в Сборке
-
09-12-2019 - |
Вопрос
В некоторых домашних задании я должен создать программу последовательности фибоначчи в сборке.Я создал этот код, но, похоже, не работает правильно, и я не уверен в том, почему.Я верю, что я делаю это правильно, но 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
.