Secuencia Fibonacci no recursiva en el montaje
-
09-12-2019 - |
Pregunta
En algunas tareas, tengo que crear un programa de secuencia de Fibonacci en el ensamblaje.Creé este código, pero no parece estar funcionando correctamente y no estoy seguro de por qué.Creo que estoy haciendo esto correctamente, pero EAX sigue siendo "2" cada bucle.
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
Solución
podría parecer esto (no probado):
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
Otros consejos
Su bucle se simplifica a esto en Pseudocódigo:
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
Como puede ver, EAX= VAL + PREV evaluará a 2 una vez que se ponga preview en 1.
Debe elaborar la especificación de su problema.¿Cuántos enteros quieres imprimir?¿Es esto para lo que es el conteo= 15?En ese caso, debe estar decreciente cuenta con cada iteración y comprobación de ver que no es cero.
En cuanto a la secuencia Fibonacci, debe estar haciendo algo como este en su bucle:
// 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