
; Programa ensamblador DLX

; El programa principal es un bucle (termina cuando se detiene la simulacin)
	.text

; Como se usa recursividad se require una pila
; La pila se inicia en 0x0 y es creciente
; El puntero de la pila se actualiza segn:
; push (+4), pop (-4)
; Para procesador DLX32p (como tiene mal direccionada la memoria) se usa:
; push (+1), pop (-1)
ori r30,r0,0	; r30 (Puntero a la Pila)

main:

	; n = Valor al que hallar el fibonacci (fibonacci(n))
	ori r1,r0,10	; ej. f(10) = 55

	; Fibonacci (r11 = fibonacci(r1)
	jal fibonacci
	nop

	j main
	nop

;----------------------------------------------------------------
; Rutina de Clculo de la serie del Fibonacci (versin recursiva)
;----------------------------------------------------------------
; Parmetros de entrada:
;	r1 = n (Valor al que hallar el fibonacci (fibonacci(n)))
;
; Parmetros de salida:
;	r11 = fibonacci(n)
;
; Equivalencia de variables y registros:
;	r1 = n-1 y n-2 (para llamadas recursivas, por
;	     lo que se tiene que salvar)
;	r2 = Comparacin del caso base (n < 2),
;	     1 (para restarlo a n) y 4 (para actualizar pila)
;	r3 = Auxiliar para almacenar fibonacci(n-1)
;	r31 = Direccin de retorno (al ser recursivo
;	      se tiene que almacenar en la pila)
;----------------------------------------------------------------
fibonacci:

	; PASO 1: Salvar registros (en la Pila, por la recurvidad)
	sw 0(r30),r2	; push r2
	ori r2,r0,1
	add r30,r30,r2
	sw 0(r30),r1	; push r1
	add r30,r30,r2
	sw 0(r30),r3	; push r3
	add r30,r30,r2
	sw 0(r30),r31	; push r31
	add r30,r30,r2

	; PASO 2: Caso base (n < 2)
	ori r2,r0,2
	slt r2,r1,r2	; r2 = 1 (n < 2)
	beqz r2,mayorque2
	add r11,r0,r1	; return n
	j salir
	nop

	mayorque2:
	ori r2,r0,1
	sub r1,r1,r2	; n-1
	jal fibonacci	; fibonacci(n-1)
	nop
	add r3,r0,r11	; r3 = fibonacci(n-1)
	sub r1,r1,r2	; n-2
	jal fibonacci	; fibonacci(n-2)
	nop
	add r11,r3,r11	; fibonacci(n-1) + fibonacci(n-2)

	; Restaurar registros (desde la Pila)
	salir:
	ori r2,r0,1
	sub r30,r30,r2
	lw r31,0(r30)	; pop r31
	sub r30,r30,r2
	lw r3,0(r30)	; pop r3
	sub r30,r30,r2
	lw r1,0(r30)	; pop r1
	sub r30,r30,r2
	lw r2,0(r30)	; pop r2

	jr r31
	nop
