Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Practica 1 EC - enunciado, Ejercicios de Ingeniería Infórmatica

Asignatura: estructuras de computadores, Profesor: Jose Jose, Carrera: Ingeniería Informática + Administración y Dirección de Empresas, Universidad: URJC

Tipo: Ejercicios

2013/2014

Subido el 13/05/2014

mgale
mgale 🇪🇸

5

(1)

1 documento

1 / 14

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
ESTRUCTURA DE COMPUTADORES
Grado en Ingeniería Informática
CURSO 2013-2014
Práctica 1:
Programación en ensamblador MIPS con
el simulador MARS
Susana Mata Fernández
Escuela Técnica Superior de Ingeniería Informática
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe

Vista previa parcial del texto

¡Descarga Practica 1 EC - enunciado y más Ejercicios en PDF de Ingeniería Infórmatica solo en Docsity!

ESTRUCTURA DE COMPUTADORES

Grado en Ingeniería Informática

CURSO 2013-

Práctica 1:

Programación en ensamblador MIPS con

el simulador MARS

Susana Mata Fernández

Escuela Técnica Superior de Ingeniería Informática

1. Objetivos

En esta práctica vamos a utilizar el simulador MARS para escribir un programa en ensamblador MIPS (ver el apéndice para un sencillo tutorial sobre MARS). En concreto el programa va a leer un fichero de texto y va a hacer un cifrado mediante sustitución de caracteres. Para ello utilizará una clave donde para cada carácter se especifica cuál es el carácter por el cual se deberá sustituir. Adicionalmente, el programa descifrará el texto previamente cifrado y comprobará que recupera el mensaje original.

2. Especificaciones

Reservaremos un máximo de 1000 bytes para almacenar el texto (incluido el byte de final de cadena). El texto estará en formato ASCII en un fichero externo (no vale en formato Word u otro programa, así que tendréis que modificarlo con el bloc de notas u otro editor similar), que deberá estar situado en la misma carpeta que el fichero Mars.jar (en caso contrario, habrá que especificar la ruta hasta llegar a él). Por simplicidad, el texto se compondrá exclusivamente de letras mayúsculas, se habrán eliminado todas las tildes y diéresis, las Ñ se habrán sustituido por N. Se permitirán espacios en blanco, números y signos de puntuación.

Análogamente reservaremos un máximo de 1000 bytes para almacenar el texto cifrado y otros 1000 bytes para almacenar el texto recuperado al descifrar el texto cifrado.

La clave se almacenará en un array de 26 bytes. El primer byte almacenará el carácter por el que se deberá sustituir la “A”, el segundo byte almacenará el carácter por el que se deberá sustituir la “B”, y así sucesivamente para las 26 letras del abecedario. Se deberán implementar las siguientes funcionalidades:

  1. Cifrado del texto original Una vez leído el fichero de texto, deberemos cifrarlo: recorrer el texto carácter a carácter (byte a byte) para sustituir cada una de las letras por aquella que nos indique la clave. Solamente se sustituirán las letras mayúsculas de la “A” a la “Z”. El resto de caracteres se dejarán sin modificar. Recordad que el código ASCII de la “A” es el 0x41 y que las demás letras restantes tienen códigos correlativos (la “Z” es el 0x5A).

El resultado del cifrado se almacenará en el vector etiquetado como textocifrado. Tendrá el mismo tamaño que el texto original y deberá finalizar con un carácter nulo.

  1. Descifrado del texto cifrado A continuación haremos la operación contraria, es decir, partiremos del texto cifrado que acabamos de obtener y lo descifraremos para recuperar así el texto original. El resultado de esta operación de descifrar se almacenará en el vector etiquetado como textodescifrado.
  2. Comprobación de consistencia Finalmente comprobaremos si la operación de cifrado y descifrado ha sido consistente, es decir, si al descifrar el texto cifrado recuperamos el original. Esto se realizará comparando el textooriginal y el textodescifrado.

Tabla de códigos ASCII. La “A” es 0x41 y la “Z” es 0x5A.

3. Subrutinas

A continuación se explican las subrutinas que vienen implementadas en el código que se distribuye con la práctica, a partir del cual tendréis que programar las funcionalidades que se os piden en este enunciado.

3.1. Subrutina abrirFichero

Esta subrutina se encarga de abrir un canal de comunicación entre el simulador MARS y el fichero que contiene el texto (pero no lee su contenido). Para ello se encargará primero de preguntar al usuario el nombre del fichero que queremos abrir. Recordemos que esto significa primero mostrar una cadena de texto con un mensaje y después requerir al usuario que introduzca una cadena de texto por teclado (aquí hay dos servicios implicados). La apertura del fichero con ese nombre indicado se realiza mediante el servicio 13. Consultad la ayuda para más detalles sobre este servicio.

Precaución: el servicio 8 de lectura de cadena por teclado termina la cadena leída con el byte 0x0A (carácter “nueva línea”). Hay que sustituir este byte por el byte nulo para poder luego leer el fichero, ya que de lo contrario el servicio 13 no encontrará el fichero y dará error.

Como resultado, esta subrutina devolverá un código numérico de 4 bytes que identificará al fichero recién abierto. En caso de que el código sea un número negativo, significará que ha ocurrido un error y así lo deberá hacer constar el programa, abortando su ejecución.

Sus parámetros son:

  • Salida: o Código identificador del fichero, que deberá devolverse por el registro $v0. o Código de error, que valdrá 0 si no ha habido error, y tendrá cualquier otro valor si se produjo error (fichero con ese nombre no encontrado, por ejemplo). Deberá devolverse por el registro $v1.
  • No tiene parámetros de otro tipo.

3.2. Subrutina leerFichero

Esta subrutina se encarga de leer el fichero, una vez que éste ha sido abierto correctamente.

Precaución: el servicio 14 de lectura de fichero no coloca el byte nulo de fin de cadena después del último byte leído. Hay que hacerlo a mano para posteriormente poder encontrar el final del texto.

En caso de que se produzca un error en la lectura del fichero, la subrutina deberá indicarlo en su correspondiente parámetro de salida y la ejecución del programa quedará abortada.

Sus parámetros son:

4. Entrega de la práctica

La práctica se realizará en grupos de 2 personas y su entrega se realizará a través del campus virtual dentro de la fecha establecida por el profesor. El material se encontrará también en el campus virtual y se compone de este enunciado junto con un código fuente básico del cual partirán los alumnos y completarán adecuadamente.

Será necesario entregar:

  • Memoria explicativa del desarrollo de la práctica, en formato .pdf. Esta memoria deberá contener, como mínimo, los siguientes puntos: o Índice o Introducción donde se explique el problema a abordar o Análisis del código fuente inicial que se distribuye con la práctica. o Explicación detallada de la solución implementada para realizar cada uno de los pasos que se piden en este enunciado, así como los problemas encontrados. o Pruebas que se han hecho y los resultados obtenidos. o Conclusión y opinión personal
  • Código fuente del programa realizado por los alumnos 5. Otras consideraciones sobre la práctica

Será imprescindible añadir comentarios a todas las líneas de código ensamblador, ya que éstas suelen ser más difícil de comprender, no sólo para una tercera persona, sino también para su propio autor pasado un tiempo. Para ello podéis usar las almohadillas (#).

Además puede resultar de ayuda dibujar un diagrama de flujo esquemático para cada subrutina y para el programa principal, que permita representar de manera clara y concisa la estructura del programa. Se recomienda usar la siguiente notación:

Apéndice. Guía de uso e instalación del simulador de

MIPS Mars

A.1. Descargar e instalar el programa

El programa MARS es un entorno de desarrollo y simulación interactivo para poder programar en ensamblador para MIPS, orientado al uso a nivel educativo en concordancia con el libro “Computer Organization and Design,” de Patterson y Hennessy.

Es un programa gratuito, de código abierto y codificado en Java, por lo que debería funcionar correctamente en cualquier sistema que tenga instalado la última versión de la máquina virtual de Java. Para instalar la máquina virtual de Java, se puede descargar la última versión desde su página oficial: http://java.com/es/

El simulador MARS se puede descargar desde la web oficial de su autor, en la página de la universidad de Missouri:

http://courses.missouristate.edu/KenVollmar/MARS/download.htm

A fecha de agosto de 2013, la última versión disponible es la 4.4.

Descargaos el archivo Mars.jar, que es el ejecutable que contiene el simulador. Una vez instalada la máquina virtual de java, simplemente habrá que hacer doble clic en el archivo Mars.jar para iniciar el simulador. Se puede instalar en cualquier carpeta del equipo. Más sencillo imposible.

A.3. Creación de un nuevo archivo ensamblador

Para poder realizar una simulación, primero será necesario crear un archivo que contenga el código en ensamblador de nuestra aplicación. Para ello, podemos pinchar sobre el botón “New”, o bien seleccionar el menú “File” y la opción “New”:

Se abrirá una ventana del editor de texto, que nos permitirá escribir nuestro programa en ensamblador:

En caso de tengamos nuestro código ya creado, podemos cargarlo en el editor, pinchando sobre el botón “Open”, o bien seleccionamos el menú “File” y la opción “Open”:

Según vayamos avanzando en el programa, será necesario salvar nuestro código. Para ello, se pinchará sobre el botón “Save”, o “Save as” (buscad también en el menú “File”). La opción “Save” guarda el programa activo con el nombre que ya tiene (en caso de no haberlo grabado todavía, preguntará con qué nombre queremos guardarlo). Por otro lado, la opción “Save as” permite salvar el fichero con otro nombre distinto del que ya tiene.

A.4. Compilación y ensamblado

Una vez tenemos nuestro código escrito, será necesario ensamblarlo para más tarde realizar la ejecución y depuración del programa. Para ello, se pinchará sobre el icono “Assemble”, o bien seleccionar el menú “Run” opción “Assemble”.

Esto generará el código objeto en memoria, activando las ventanas de simulación. En caso de que nuestro código tuviera errores, se nos mostrarían a través de la ventana “Mars Messages”:

A.5. Ejecución del programa

Una vez hayamos ensamblado nuestro programa sin errores, podremos pasar a ejecutarlo. Para ello utilizaremos los botones “Go” y “Step”. El botón “Go” realizará la ejecución completa del programa, mientras que el botón “Step” permitirá ir instrucción a instrucción en la ejecución del programa, lo cual nos permitirá apreciar los cambios en los registros y la memoria que va realizando cada una de las instrucciones:

Si elegimos el botón “Step”, se nos irá iluminando en la ventana “Text Segment” la próxima instrucción que se ejecutará. Además, podremos ver la actualización de los registros en memoria que se estarán modificando. Para ello, tendremos que consultar la ventana “Registers”:

Si nuestro programa necesita escribir algún mensaje o mostrar algún dato, se podrá visualizar en la ventana “Run/IO”. Esta ventana servirá también para poder leer datos que se pidan al usuario:

Además, en caso de ser necesario, se podrán colocar puntos de ruptura o “breakpoints” en el código, para facilitar la depuración. Para ello, se podrá seleccionar la instrucción sobre la que se colocará el punto de ruptura en la ventana “Text Segment”, señalando la casilla en la columna “Bkpt”:

De esta forma, cuando pulsemos el botón “Go”, se parará la ejecución en ese punto, y se podrá continuar la simulación paso a paso. Una vez hemos acabado nuestra simulación, se puede resetear el estado de la CPU pulsando sobre el botón “Reset”, opción que también encontraremos en el menú “Run”:

Esto limpiará los registros, la memoria y devolverá la simulación a su estado inicial. También es posible volver atrás un paso, pulsando sobre el botón “BackStep”.

Para más información, consultad la ayuda del programa. Allí encontraréis un listado de todas las instrucciones, así como las pseudoinstrucciones y las directivas. Por último, los llamados “syscalls” os permitirán realizar operaciones de entrada/salida, como escribir en la consola o leer un dato del teclado, entre otras.