sábado, 21 de marzo de 2015

MIPS: Como calcular la siguiente fila a una dada en la pirámide de Tartaglia.

Buenas gente. Hace una semana se me ocurrió plantear éste ejercicio para mis alumnos de Computadores. Ya lo hemos hecho bien y os lo traigo aquí.
Decir que lo hemos desarrollado en forma de función para poder utilizarlo más adelante en otras funciones más complejas.
La función toma en $3 la dirección donde comienza el array, en $7 el tamaño del array y en $2 la dirección de memoria donde guardaremos el resultado (sería algo así como pasar un parámetro por referencia en C o C++).

He de decir, por último, que para que funcione bien con el primer elemento no hay que pasarle un [1], sino un [1, 1]. Ésto lo hemos hecho por temas de simplicidad, pero si hiciera falta cambiarlo, sería muy simple.

Dicho ésto, os dejo aquí el código ;)

.data
array: .word 1 3 3 1
tam: .word 4
res: .word -1

.text

 lw $7, tam($0) #Tamaño
 la $3,array
 la $2,res
 jal Tar
 li $2,10
 syscall
 
Tar: add $8,$0,$2 #Indice Mem. Res
 add $5,$3,$0 #Índice Mem. Array
 addi $6,,$0,1  #Constante 1
 sw $6,0($8) #res[0]=1
 addi $10,$0,1  #i del For 
loop: slt $4,$10,$7
 beq $4,$0,FinFor
 lw $12,0($5) #Array +$8 
 addi $5,$5,4 
 addi $8,$8,4  #Sumamos 4 al Índice
 lw $13,0($5) #Array +$8
 add $21,$12,$13 #Guarda en $21 la suma $12+$13
 sw $21,0($8) #Guarda en $21 en res $8
 addi $10,$10,1 #i++
 j loop  #Bucle
FinFor: addi $8,$8,4  #Suma 4 a lo que hay en $8
 sw $6,0($8) 
 jr $31

No es complicado, ¿verdad? Si no lo entendéis del todo escribidme y subo el código que se usaría en C++ o Java con la misma función, para que lo entendáis mejor.

Saludos;)

No hay comentarios:

Publicar un comentario