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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top