jueves, 25 de abril de 2013

Práctica 1: Ensamblador

  • El entorno
Lo primero que necesitamos es conocer el entorno de Mars:

La primera imagen corresponde al entorno de edición, aquí se edita el código que queremos ensamblar, y la segunda imagen corresponde al entorno de ejecución, aquí podemos ver que ocurre en cada instrucción y en memoria que manejamos.


  • Problemas
Cómo una pequeña guía dejamos la solución a todos los problemas que hemos hecho durante la práctica:








  • FAQs
¿Qué es ensamblador?

Es un lenguaje de programación de bajo nivel, para los computadores, microprocesadores, microcontroladores, y otros circuitos integrados programables.


¿Por qué debería interesarme el lenguaje ensamblador?

Para comprender qué sucede cuando un computador ejecuta una sentencia de alto nivel, determinar el tiempo de ejecución de una instrucción de alto nivel, y que es útil para compiladores, sistemas operativos, juegos, etc.


¿Cómo puedo comenzar a programar en ensamblador?

Lo primero que necesitas es un entorno de programación adecuado, usaremos Mars, es un software libre y gratuito que podremos descargar de esta página: http://www.softpedia.com/get/Programming/Coding-languages-Compilers/Vollmar-MARS.shtml
Una vez en la página cliquearemos en la imagen a la izquierda que pone DOWNLOAD en azul, y luego elegiremos un enlace a la derecha, “Softpedia Secure Download (US)” no debería dar problemas, y ya solo queda esperar a que nos pida permiso para descargarlo.
También debes tener instalado y actualizado JAVA.


Una vez abierto el programa, ¿Cómo funciona este entorno?

Como en todo programa arriba a la izquierda tiene dos iconos iluminados, el primero es el de crear un archivo nuevo, y el segundo es el abrir un archivo guardado anteriormente. También podemos observar que debajo de estos dos iconos, encontramos dos pestañas, EDIT y EXECUTE, en EDIT escribiremos el código, todas las instrucciones, y en EXECUTE, observaremos las secuencias de instrucciones que se ejecutarán, y en las que podremos poner puntos de ruptura, son puntos situados a la izquierda de cada instrucción, con los que le indicamos al programa que haga una parada, para estudiar como avanza la ejecución.
También encontramos una tabla a la derecha, es una tabla en el que irá almacenando en los registros, los cambios que se vallan realizando, según las instrucciones.


Tengo escrito las instrucciones, pero no sé como ejecutarlo, y la pestaña de “execute” sigue vacía, ¿Qué sucede?

En Mars, todo código debes guardarlo antes de ejecutarlo, y una vez guardado se iluminará un botón con un destornillador cruzado por una llave, ese es el botón de ensamblar, una vez pulsado, nos llevará a la pestaña de “execute” y se iluminarán los iconos para controlar el avance o retroceso del código, podemos darle al botón de “play”, para que el programa se ejecute entero, o si le damos al botón que tiene un “1”, avanzaremos paso a paso, viendo como se ejecuta cada instrucción y viendo los cambios en los registros. También podemos modificar a la velocidad que se ejecuta con “play”, en la barra de la derecha, si bajamos la velocidad, irá a tantas instrucciones por segundo como indiquemos.


¿Puedo indicar con algún comentario que hace cada instrucción?

Si, debes poner antes del comentario “#”, esto separará la instrucción del comentario, y tendrás el resto de la línea para comentar.


¿Cómo puedo imprimir o pedir un dato entero por pantalla?

Para imprimir, primero debes cargar en $v0 el código 1, que se usa para imprimir un entero, ese entero que quieres imprimir debe estar guardado en el registro $a0, y una vez completado estos dos pasos, usaremos la llamada al sistema “syscall”. Y para pedir un entero simplemente cargamos en $v0 el código 5, y hacemos la llamada al sistema “syscall”, y guardará el dato que se le introduzca a continuación en $v0. Lo siguiente que deberías hacer es mover ese dato a un registro más seguro.
El ultimo icono con el símbolo “?”, es la ayuda, ahí podrás encontrar todas las instrucciones, directivas y llamadas al sistema que puedes usar.


¿Hay alguna forma de trabajar con varios datos?

Si, usando vectores, estos debes declararlos en la cabecera, debajo de “.data”, indicando el tipo de datos, número de posiciones e incluso el contenido, si queremos introducir los datos por pantalla y guardarlos en el vector, reservaremos espacio con la directiva “.space”. Una cosa que debes tener en cuenta, es que el nombre que le demos al vector no hace referencia a todo el vector (como en C++), sino que señala a la dirección de memoria del primer elemento. Dependiendo del tipo de dato, tendremos que tener en cuenta cuantos bytes usa para cada elemento del vector, es decir si es de tipo “half”, es decir, 2 bytes, el segundo elemento estará situado a 2 bytes por delante del inicial, el tercero estará a 2 bytes más del segundo, es decir, multiplicar por 2 el tamaño del tipo de dato, y sumárselo a la posición inicial, y así sucesivamente.

  • Sugerencias
-Al principio tuvimos algunos problemas para entender cómo se programaba en ensamblador ya que era la primera vez que lo hacíamos, es recomendable trabajarlo en casa independientemente.

-Quizá convenga primero trabajar cada instrucción por separado, esto ayudaría a comprender mejor como funciona el lenguaje y que hace cada instrucción.