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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top