lunes, 21 de mayo de 2012

TEMA 2 - PROGRAMACIÓN EN ENSAMBLADOR MARS


En el tema 2 aprendimos a programar en el lenguaje ensamblador del procesador MIPS 32 usando el simulador MARS. Algunas de las características del lenguaje ensamblador para este procesador son que solo permite una instrucción por linea, las etiquetas se indican colocando dos puntos detrás del nombre de la etiqueta, el símbolo almohadilla indica el inicio de un comentario, su sintaxis es sencilla, y es muy usado en diversos dispositivos y por ello se dispone de una amplia documentación acerca de este lenguaje ensamblador.


Cada instrucción se compone del código de operación y los operandos. Los operandos serán los operandos fuente (con los que haremos la operación) y el operando destino (donde almacenaremos el resultado). El código de operación es de 6 bits, y como cada instrucción es de 32 bits quedan 26 para indicar los operandos. Las instrucciones pueden ser de tipo aritméticas, lógicas, de desplazamiento, de manipulación de constantes, de carga, de almacenamiento, de comparaciones, saltos condicionales o saltos incondicionales.  Dependiendo de cual sea el formato de la instrucción (R (registro), I (inmediato) o J(salto)) la distribución de estos 26 bits para los operandos seguirá un esquema distinto. El lenguaje ensamblador, al programar directamente para el procesador, guarda los datos con los que está trabajando en registros.


Con una idea básica sobre el MIPS 32 comenzamos a programar con el simulador MARS. Las primeras instrucciones que utilizamos fueron algunas como lw o sw (load word y store word respectivamente para cargar y guardar palabras cargándolas o escribiéndolas en la memoria) para pasar a trabajar con vectores, que son declarados en la cabecera .data, en los problemas 1 y 2. A partir del problema 3 empezamos a trabajar también con llamadas al sistema, que nos permitían, por ejemplo, imprimir datos en pantalla. Éstas vienen detalladas en la sección de ayuda del MARS.


Desde el problema 6 en adelante utilizamos las sumas de elementos con la instrucción add , la multiplicación por un número con la instrucción mul, y el desplazamiento lógico a la izquierda con la instrucción sll, que funciona como si se multiplicase el número por dos elevado al número de bits desplazados. Esto lo usaríamos para acceder a las diferentes posiciones de los vectores, ya que según el tipo de dato del vector, los elementos ocuparían un número de bytes distinto, por lo tanto, para acceder al siguiente elemento debíamos desplazarnos tantos bytes como tuviera el tipo de dato del vector.

 Todas las instrucciones las integramos, más tarde, en bucles siguiendo la estructura de éstos en el lenguaje ensamblador del MIPS 32. Ésta es indicar el comienzo del bucle con una etiqueta y definir al final del bucle cual es la condición que se debe cumplir para que la ejecución salte de nuevo a la etiqueta bucle comenzando el bucle de nuevo, y repitiéndose este proceso hasta que la condición dejara de cumplirse, en cuyo caso continuaría la ejecución del programa.


Veamos un ejemplo de práctico en el siguiente ejercicio, que resume casi todo lo aprendido en el tema: Realizar un programa en ensamblador que se ajuste a una de las dos estructuras de BUCLE (DO-WHILE ó FOR) y que contenga una decisión (IF – ELSE) en su interior. El programa no debe exceder 12 instrucciones. Se aconseja adjuntar un comentario a cada instrucción, en el que se indique qué realiza. 


Programa de ejemplo. Clic para ampliar.


No hay comentarios:

Publicar un comentario