Uploaded by benja Scaffidi

justificaciones

advertisement
Nombre: Benjamín Scaffidi
LU: 832/22
Aclaración:
Debido a la relativa simpleza de los ejercicios, opté por simplemente hacer uso de los
registros temporales, y no utilizar llamados. No estoy seguro si esto termina importando a la
correción, pero supongo no esta de mas mencionarlo.
Ej1:
El enunciado nos pide calcular una suma sobre todos los valores de un array de 12
elementos de 16 bits (media palabra), teniendo en cuenta sólo los bits ubicados en posiciones
pares. Para lograr esto, primero guardo en el los registros temporales t1, t3 y t4 la dirección
donde se ubica el primer elemento del array, la cantidad de elementos del mismo, y el valor 0
(para usarlo como acumulador), respectivamente.
Luego, utilizo una etiqueta loop para poder utilizarlo como posición de inicio del ciclo. En
cada iteración, uso un branch lógico para que, si el valor en t3 fuese 0, cortar el loop y que el
programa continúe la ejecución desde la posición de memoria correspondiente a la etiqueta
exit.
Caso contrario, sigo en el cuerpo del ciclo. Decremento t3 en 1, y guardo la media
palabra correspondiente a la iteración actual en el registro t2. Luego, primero cargo de manera
inmediata la máscara a usar en t5 (pues el valor de la misma no es representable con 12 bits
por lo que no puedo usar un andi para enmascarar sin este paso intermedio), y una vez hecho
esto enmascaro el valor de t2 aplicando and lógico entre t2 y t5, guardando el resultado en t2.
Finalmente, sumo al acumulador (t4) el valor en t2 e incremento a t1 en 2 bytes para cargar el
elemento correspondiente en la próxima iteración, antes de volver a la etiqueta loop mediante
un salto incondicional.
Ej2:
El enunciado nos pide que, dados dos arrays (src y dst) de 12 elementos de 32 bits (una
palabra) cada uno, apliquemos el o lógico entre los elementos en las mismas posiciones (de
sus respectivos arrays) y guardemos el resultado de dicha operación en dst, sobreescribiendo
el valor previo. Para lograr esto, primero cargo t1, t2 y t3 con la dirección donde se encuentra el
primer elemento de src, dst y la cantidad de elementos de ambos arrays, respectivamente.
Luego, utilizo una etiqueta loop para poder utilizarla como posición de inicio del ciclo. En
cada iteración, uso un branch lógico para que, si el valor en t3 fuese 0, cortar el loop y que el
programa continúe la ejecución desde la posición de memoria correspondiente a la etiqueta
imprimir.
Caso contrario, sigo en el cuerpo del ciclo. Decremento t3 en 1, y guardo la palabra de
src correspondiente a la iteración actual en el registro t4, y la correspondiente de dst en t5.
Luego, simplemente aplico el o lógico a ambos registros, guardando el resultado en t5..
Finalmente, guardo el valor de t5 en la posición de memoria indicada por t2, e incremento a t1 y
t2 en 4 bytes para cargar los elementos correspondiente en la próxima iteración, antes de
volver a la etiqueta loop mediante un salto incondicional.
Download