Sequência de Fibonacci não recursiva em Assembly
-
09-12-2019 - |
Pergunta
Em alguns trabalhos de casa, tenho que criar um programa de Sequência de Fibonacci em Assembly.Eu criei este código, mas ele não parece estar funcionando corretamente e não sei por quê.Acredito que estou fazendo isso corretamente, mas o EAX permanece "2" a cada loop.
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
Solução
Poderia ficar assim (não testado):
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
Outras dicas
Seu loop simplifica isso em 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 você pode ver, eax = val + prev será avaliado como 2 quando prev for definido como 1.
Você deve elaborar a especificação do seu problema.Quantos inteiros você deseja imprimir?É para isso que serve count = 15?Nesse caso, você precisa diminuir a contagem a cada iteração e verificar se é diferente de zero.
Quanto à sequência de Fibonacci, você deveria fazer algo assim em seu loop:
// 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