viernes, 16 de enero de 2015

Programa Fibonacci en x86/ARM [ARM]

Parte ARM


Algoritmo para calcular el valor de la sucesión de Fibonacci de una posición dada

Elección de los registros:


- r0 contendrá el número, en hexadecimal, la posición de la sucesión de Fibonacci de la que se
  quiere calcular el valor.

- r1 al principio tendrá el valor de la primera posición de la sucesión, el valor 0, luego irá
  actualizando su valor a la posición n-2

MOV r1,#0

- r2 al principio contendrá el valor de la segunda posición de la sucesión, el valor 1, luego irá
  actualizando su contenido con la posición n-1

MOV r2,#1

- r3 será el encargad de hacer de contador del bucle para el programa, se inicializa con el valor 2,
  pues se calculará a partir de esa posición

MOV r3,#2

- r4 contendrá el resultado final del bucle

Llamadas a las subrutinas:

Hay tres subrutinas las que se puede llamar dependiendo de la posición que se desee calcular.

- FIB1:

FIB1 MOV r4,r1
MOV pc,r14

Pone en el registro de resultados el valor de la primera posición y actualiza el contador del programa.
Se llama cuando se quiere saber el valor de la posición primera de la sucesión

CMP r0,#1
BLEQ FIB1

- FIB2:

FIB2 MOV r4,r2
MOV pc,r14

Pone en el registro de resultado el valor de la segunda posición y actualiza el contador de programa.
Se llama cuando se quiere saber el valor de la posición segunda de la sucesión.

CMP r0,#2
BLEQ FIB2

- FIBR:

FIBR ADD r4,r2,r1
MOV r1,r2
MOV r2,r4
ADD r3,r3,#1
CMP r3,r0
BLT FIBR
MOV pc,14

Es la función que lleva el peso del algoritmo, calcula el número correspondiente a la posición y actualiza el contador de programa.
Se la llama cuando se quiere calcular una posición superior a la segunda.

CMP r0,#2
BLEQ FIB2
BLGT FIBR

Esta subrutina será explicada en profundidad en la siguiente entrada.

La subrutina FIB:

FIBR ADD r4,r2,r1
MOV r1,r2
MOV r2,r4
ADD r3,r3,#1
CMP r3,r0
BLT FIBR
MOV pc,r14

Lo primero que hace esta subrutina es sumar f(n-1) + f(n-2) con n >2, es decir, guarda en r4 la suma de r2 y r1.

ADD r4,r2,r1

Luego actualiza los registros, r1 contendrá el valor de r2.

MOV r1,r2

r2 se actualizará con el valor de r4.

MOV r2,r4

Se incrementa r3 en uno.

ADD r3,r3,#1

de está forma, al ser r3 n+1, r2 y r1 pasan a ser f(n-1) y f(n-2) respectivamente
A continuación se compara r3 con r0, repitiéndose el bucle mientras r3 sea menor que r0
CMP r3,r0
BLT FIBR

Al final el bucle se actualiza el contador de programa.

MOV pc,r14

Tras lo cual terminará el programa dejando el resultado en el registro r4.

Damián Nimo Márquez

No hay comentarios:

Publicar un comentario