Universidad Carlos III de Madrid Grupo de Arquitectura de Computadores ESTRUCTURA DE COMPUTADORES Práctica de Programación en el ensamblador de MIPS. Ingenierı́a en Informática ii [email protected] Curso 2006/2007 Índice 1 2 3 INFORMACIÓN GENERAL 1.1 Información general sobre la práctica . . . . 1.2 Lugar de realización . . . . . . . . . . . . 1.3 Protección frente a copias . . . . . . . . . . 1.4 Tutorı́as y notificaciones . . . . . . . . . . 1.5 Recomendaciones generales . . . . . . . . 1.5.1 Sobre las aulas Linux . . . . . . . . 1.5.2 Sobre el enunciado de las prácticas . . . . . . . 3 3 3 3 4 4 4 4 . . . . . . . . . 5 5 5 6 6 7 7 8 9 11 MATERIAL DE APOYO 3.1 Recursos en Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Material a entregar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Bibliografı́a y Material de Consulta . . . . . . . . . . . . . . . . . . . . . . . . 11 12 12 13 . . . . . . . . . . . . . . . . . . . . . PRACTICA DE ENSAMBLADOR 2.1 Objetivo de la práctica . . . . . . . . . . . . . . 2.2 Representación de un polinomio en memoria . . 2.3 Descripción de las funciones . . . . . . . . . . . 2.3.1 Imprimir un polinomio . . . . . . . . . . 2.3.2 Suma de dos polinomios . . . . . . . . . 2.3.3 Regla de Ruffini . . . . . . . . . . . . . 2.3.4 Codificación ASCII de un polinomio . . 2.3.5 Copia de un polinomio utilizando la pila. 2.3.6 Valor numérico de un polinomio (real). . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 INFORMACIÓN GENERAL Información general sobre la práctica Este documento contiene el enunciado de la primera práctica de Estructura de Computadores. La información adicional relacionada con la entrega (plazos, material, forma de entrega , etc. ) se describe en el documento Normas de la asignatura y en particular en el apartado Normas de las prácticas. 1.2 Lugar de realización El lugar destinado para la realización de las prácticas serán las aulas Linux. Se indica en los enunciados posibles herramientas para la realización de las prácticas en otras aulas (ó en casa si dispone de PC) pero no olvide que la práctica ha de funcionar en las aulas Linux. 1.3 Protección frente a copias Se dedicará especial atención a comprobar que las prácticas no sean iguales (copiadas). Para evitar problemas de confidencialidad y posibles copias, deberá tenerse especial cuidado en proteger la propia cuenta de accesos no deseados. Para ello se deben seguir, al menos, las siguientes pautas: • En cuanto le abran cuenta, proceda a entrar en la misma para protegerla: – Ponga inmediatamente una palabra clave de acceso a su cuenta usando el mandato passwd. Siga las recomendaciones del laboratorio de Informática para elección de una buena clave. – Proteja el directorio home de su cuenta contra todo tipo de acceso de cualquier otro usuario usando el mandato: chmod 700 $HOME. – Cambie la mascara de creación de ficheros para proteger cualquier fichero que cree en su cuenta. Para ello añada al final del archivo .bashrc el mandato umask 077. login: MiCuenta Password: MiPasswordInicial sh> passwd Old password: MiPasswordInicial New password: MiComplejaPalabraClave Retype new password: MiComplejaPalabraClave sh> chmod 0700 $HOME sh> echo umask 0077 >> $HOME.bashrc. • No saque listados relativos a su práctica si no puede esperar a recogerlos. • Si sospecha que le han robado un listado (o disquete) con la solución de alguna práctica, comunı́quelo al profesor de la misma utilizando correo electrónico (mandato mail) y, MUY IMPORTANTE, adjunte una copia de la versión perdida. 3 1.4 Tutorı́as y notificaciones • Los horarios de tutorı́as estarán expuestos en la página Web de la asignatura (y en Aula Global). Los alumnos deberán respetar los horarios de tutorı́as. No serán atendidos fuera de dicho horario. • Las preguntas acerca de la asignatura, la teorı́a o la práctica serán atendidas por correo electrónico o en el grupo de noticias de la asignatura. Se recomienda a los alumnos utilizar este método por ser el más efectivo. • En el caso de consultas sobre prácticas, intente incluir en el mensaje toda la información que considere relevante para que el profesor pueda responder a la cuestión planteada (extractos de trazas, ejemplos, etc.). • Las notificaciones a los alumnos se harán mediante notas en el tablón de anuncios y mediante correo electrónico, por lo que los alumnos deberán estar atentos a dichos medios de comunicación. 1.5 Recomendaciones generales Se recomienda conocer la normativa de la asignatura. Para ello ha de consultar la página Web de la misma (http://www.arcos.inf.uc3m.es/∼ii ec). 1.5.1 Sobre las aulas Linux • Para obtener información relativa a la apertura de cuentas, consejos para la elección de la palabra clave, etc. consulte la página Web del laboratorio: http://www.lab.inf.uc3m.es/ • Ha de realizar una copia de seguridad preventiva periódicamente. • En caso de duda sobre cualquier mandato o servicio del sistema operativo UNIX utilice el mandato man, para obtener ayuda (man ¡mandato¿). • Dispone de varios editores para el desarrollo de la práctica: – vi: El editor estándar de UNIX. – emacs: Editor que posee una gran potencia. • Aunque es posible editar con editor en otro sistema operativo siempre que se guarde como archivo de tipo texto ASCII y se conviertan los retornos de carro al formato de UNIX. 1.5.2 Sobre el enunciado de las prácticas Antes de empezar una práctica, lea detalladamente el enunciado de la misma para obtener una idea clara de qué es concretamente lo que se le pide. En caso de duda, consulte el material recomendado, con sus compañeros y con los profesores. Ün aspecto muy importante para la correcta realización de las prácticas es respetar en todo momento el formato de la entrada y salida que se indica. Para ello se recomienda prestar mucha atención a los ejemplos que se ponen en cada uno de los enunciados. 4 2 2.1 PRACTICA DE ENSAMBLADOR Objetivo de la práctica Esta práctica permite la familiarización del alumno con el lenguaje ensamblador del MIPS R2000, con el uso de diferentes formatos de representación, con el empleo de funciones y con el manejo de la memoria del computador. 2.2 Representación de un polinomio en memoria Un polinomio se representará en memoria como una secuencia de bytes. El primer byte representa el grado del polinomio (n) y a continuación, se ubicarán todos los coeficientes del polinomio desde el mayor grado (n) hasta el término independiente. Tanto el grado como los coeficientes del polinomio, deberán ser números enteros comprendidos entre [-255..+255]. El polinomio se representa ”ordenado” y ”completo”, es decir, si en el polinomio no existe término para xm , con 0 ≤ m ≤ n, se escribirá el coeficiente 0 en dicha posición. Por tanto, el número de bytes necesarios para almacenar en memoria un polinomio será: Memoria (bytes)=1 Byte (Grado) + 1 Byte * Grado + 1 Byte (Término Independiente) Por ejemplo, dada el siguiente polinomio P(x): P(x)= 25x4 - 13x3 + 4x - 8 su representación en memoria utilizando el simulador de MIPS, SPIM, serı́a como se muestra en la figura 1. Figura 1: Representación en memoria de P(x) Cuando se pasa un polinomio como argumento de entrada a una función, le pasaremos la dirección de memoria del primer byte del polinomio (es decir, el byte que contiene el grado del polinomio). Téngase en cuenta, que esto permite que se pase a una función la dirección de memoria 0 (conocida como puntero nulo). 5 2.3 Descripción de las funciones El alumno deberá realizar la implementación de una biblioteca de funciones para el manejo de polinomios. Para ello se deben implementar las siguientes funciones: 1. Imprimir un polinomio. 2. Suma de dos polinomios. 3. División de dos polinomios (Regla de Ruffini). 4. Codificación ASCII de un polinomio. 5. Copia de un polinomio utilizando la pila. 6. Valor numérico de un polinomio (real). NOTAS: • Todas las funciones descritas en este cuaderno de prácticas son obligatorias. • Las funciones implementadas deben tener el nombre indicado en las siguientes secciones, se ha de tener en cuenta que un nombre en mayúsculas es diferente de otro en minúsculas. Por ejemplo, los siguientes nombres de funciones corresponden a subprogramas diferentes: plxImprimir, plximprimir, PlxImprimir, etc. • Han de respetarse los formatos de salida para las funciones a desarrollar. • También han de respetarse los parámetros y valores devueltos no pudiendo usarse otros parámetros y resultados de los expuestos. 2.3.1 Imprimir un polinomio Se deberá implementar la función plxImprimir. Toma un único operando: • En el registro $a0 se pasará la dirección de memoria del polinomio a imprimir. La función plxImprimir recorre los coeficientes del polinomio cuya dirección es recibida como argumento para imprimirlos en pantalla. Por ejemplo, dada la dirección de memoria 0X10010060 correspondiente a un polinomio (ver Figura 1), la función plxImprimir imprimirá en pantalla el polinomio siguiente: P(x)= 25x4 - 13x3 + 0x2 + 4x - 8 La salida por pantalla correspondiente al polinomio anterior deberá ser la siguiente: P(x)= 25x4 - 13x3 + 0x2 + 4x1 - 8 Si la dirección de memoria del polinomio es el puntero nulo, la impresión no se realiza y se devuelve en $v0 el valor -1. En caso de cualquier otro error (por ejemplo, si el polinomio es vacı́o, es decir, el grado es igual a 0) se devolverá igualmente el valor -1 en el registro $v0. Por el contrario, si el polinomio se puede imprimir correctamente, entonces la función devolverá en el registro $v0 el valor 1. 6 2.3.2 Suma de dos polinomios Se deberá implementar la función plxSuma. Toma tres operandos: • En el registro $a0 se pasará la dirección de memoria del primer polinomio a sumar. • En el registro $a1 se pasará la dirección de memoria del segundo polinomio a sumar. • En el registro $a2 se pasará la dirección de la memoria reservada estáticamente para almacenar el polinomio suma. La función plxSuma calcula el polinomio suma S(x) de los dos polinomios recibidos como argumento. Dados dos polinomios P(x) Y Q(x) la suma de ambos es otro polinomio S(x) cuyos elementos se obtienen sumando los coeficientes de grado n (0 ≤ n ≤ grado) del polinomio P(x) con el coeficiente correspondiente del polinomio Q(x). El grado del polinomio S(x) será el mayor de los grados de P(x) y Q(x). Como ejemplo se muestra el siguiente: P (x) = 25x4 − 13x3 + 0x2 + 4x − 8 Q(x) = −12x6 + 0x5 + 0x4 + 0x3 + 5x2 + 0x + 1 S(x) = −12x6 + 0x5 + 25x4 − 13x3 + 5x2 + 4x − 7 Si la dirección de memoria de cualquiera de los dos polinomios recibidos como argumento es el puntero nulo, no se ejecutará la función y se devolverá en el registro $v0 el valor -1. Si alguno de los polinomios es vacı́o, igualmente se devolverá en el registro $v0 el valor -1. En caso de que la suma se pueda realizar correctamente se devolverá en el registro $v0 el valor de éxito 0. NOTAS: • Reserva de memoria en el Segmento de Datos: Se deberá reservar estáticamente la memoria utilizada para almacenar el polinomio resultado, cuya dirección deberá pasarse como argumento a la función en el registro $a2. • Para evitar desbordamiento al realizar la suma, se utilizará una palabra de memoria (32 bits) para almacenar cada uno de los resultados de la suma (grado, coeficientes y término independiente). 2.3.3 Regla de Ruffini Se deberá implementar la función plxRuffini. Toma tres operandos: • En el registro $a0 se pasará la dirección de memoria del polinomio dividendo D(x). • En el registro $a1 se pasará un número entero ”a” comprendido entre [-255..+255]. Por tanto, el divisor d(x) se expresará de la forma x+a. 7 • En el registro $a2 se pasará la dirección de la memoria reservada estáticamente para almacenar el polinomio cociente. La función plxRuffini divide el polinomio dividendo D(x) entre el polinomio divisor d(x) aplicando la regla de Ruffini. Por ejemplo, dado el polinomio D(x) = 25x4 - 13x3 + 0x2 + 4x - 8 y el valor a = 3 (d(x) = x - 3), la regla de Ruffini se aplicará de la siguiente manera: 25 13 0 4 -8 -75 -264 792 2288 25 88 -264 796 -2280 donde el polinomio cociente C(x) es 25x3 + 88x2 + -264x1 + 796 y el resto R(x) es -2280. Si la dirección de memoria del polinomio recibido como argumento es el puntero nulo, no se ejecutará la función y se devolverá en el registro $v0 el valor -1. En caso de cualquier otro error (por ejemplo, grado del polinomio 0 o negativo) se devolverá igualmente el valor -1 en el registro $v0. En caso de que no exista ningún error se devolverá en el registro $v0 el código de éxito 0 y en el registro $v1 el resto de la división R(x). -3 NOTAS: • Reserva de memoria en el Segmento de Datos: Se deberá reservar estáticamente la memoria utilizada para almacenar el polinomio resultado, cuya dirección deberá pasarse como argumento a la función en el registro $a2. • Para evitar desbordamiento al realizar la suma, se utilizará una palabra de memoria (32 bits) para almacenar cada uno de los resultados de la suma (grado, coeficientes y término independiente). 2.3.4 Codificación ASCII de un polinomio Se deberá implementar la función plxASCII. Toma dos operandos: • En el registro $a0 se pasará la dirección de memoria del polinomio para el que se calculará la cadena ASCII. • En el registro $a1 se pasará la dirección de la memoria reservada estáticamente para almacenar la cadena ASCII resultante. La función plxASCII toma el polinomio recibido como argumento y devuelve una cadena de caracteres ASCII que se creará de la siguiente manera: 1. Se agrupan los elementos del polinomio de dos en dos desde el elemento grado hasta el elemento término independiente. 2. Se lee un grupo de dos bytes (utilizando para ello el tipo de datos half ). 3. Se calcula la operación módulo 127 sobre el resultado calculado en el paso anterior (resto de 127). 8 4. Se escribe el resultado en la cadena ASCII resultante. 5. Se vuelve al punto 2. 6. Por último, se escribe el carácter terminador de cadena al final de la cadena ASCII resultado. Por ejemplo, dada la dirección de memoria 0X10010060 correspondiente a un polinomio (ver Figura 1), la función plxAscii deberá calcular la siguiente cadena: Cadena ASCII de P(x)= 25x4 - 13x3 + 0x2 + 4x - 8 = 6tw Si la dirección de memoria del polinomio recibido como argumento es el puntero nulo, no se ejecutará la función y se devolverá en el registro $v0 el valor -1. En caso de cualquier otro error (por ejemplo, grado del polinomio 0 o negativo) se devolverá igualmente el valor -1 en el registro $v0. En caso de que no exista ningún error se devolverá en el registro $v0 el valor de éxito 0. NOTAS: • Para el desarrollo de las funciones que se describen a continuación es necesario que el primer byte del polinomio esté alineado en memoria (es decir, en una posición de memoria que sea múltiplo de la longitud de la palabra en bytes). • Reserva de memoria en el Segmento de Datos: Se deberá reservar estáticamente la memoria utilizada para almacenar la cadena ASCII resultante, cuya dirección deberá pasarse como argumento a la función en el registro $a1. • Téngase en cuenta la cantidad de memoria (en bytes) necesaria para albergar una cadena ASCII y el carácter delimitador de cadenas. 2.3.5 Copia de un polinomio utilizando la pila. Se deberá implementar la función plxCopiaPila. Toma tres operandos: • En el registro $a0 se pasará la dirección de memoria del polinomio origen que se desea copiar. • En el registro $a1 se pasará la dirección de la memoria reservada estáticamente para almacenar la copia del polinomio origen. • En el registro $a2 se pasará el grado del polinomio origen a copiar. La función plxCopiaPila copia de manera recursiva el polinomio recibido como argumento en $a0, en la dirección de memoria apuntada por $a1. Para realizar esta copia se llamará recursivamente a la función, utilizando para ello el marco de pila de la siguiente manera: • La función plxCopiaPila deberá copiar completamente el polinomio recibido como argumento en $a0 en el polinomio recibido como argumento en $a1 desde el último elemento (término independiente) hasta el primero (grado del polinomio) utilizando llamadas recursivas. 9 • La función plxCopiaPila invocada desde el programa principal recibe como argumentos los registros $a0, $a1 y $a2 explicados anteriormente. • Las llamadas recursivas a la función plxCopiaPila obtendrán los siguientes cuatro argumentos desde la pila: 1. $ra return address. Dirección de retorno para cada llamada recursiva. 2. $fp frame stack pointer. Dirección del marco de pila para cada llamada recursiva. 3. $a0. En cada llamada recursiva, el registro $a0 contendrá la dirección de memoria que apunta al elemento a copiar del polinomio origen. 4. $a1. En cada llamada recursiva, el registro $a1 contendrá la dirección de memoria donde se almacenará el elemento a copiar en el polinomio destino. Figura 2: Imagen de la pila antes de devolver las llamadas recursivas Si la dirección de memoria del polinomio recibido como argumento en $a0 es el puntero nulo, no se ejecutará la función y se devolverá en el registro $v0 el valor -1. En caso de cualquier otro error (por ejemplo, grado del polinomio 0 o negativo) se devolverá igualmente el valor -1 en el registro $v0. En caso de que no exista ningún error se devolverá en el registro $v0 el valor 0 y en el registro $v1 el valor real del polinomio. NOTAS: • Reserva de memoria en el Segmento de Datos: Se deberá reservar estáticamente la memoria utilizada para almacenar el polinomio resultado, cuya dirección deberá pasarse como argumento a la función en el registro $a1. 10 2.3.6 Valor numérico de un polinomio (real). Se deberá implementar la función plxValorReal. Toma dos operandos: • En el registro $a0 se pasará la dirección de memoria del polinomio P(x) para el que se calculará su valor numérico real. • En el registro $a1 se pasará un número real que representa el valor de la variable x. La función plxValorReal calcula el valor real del polinomio recibido como argumento en $a0, al sustituir x por el valor real recibido en $a1. Considérese el siguiente ejemplo de valor real de un polinomio: P(x)= 25x4 - 13x3 + 0x2 + 4x - 8 P(2.3)= 25 ∗ 2,34 - 13 ∗ 2,33 + 4 * 2.3 - 8 = 542.63153076 Si la dirección de memoria del polinomio recibido como argumento es el puntero nulo, no se ejecutará la función y se devolverá en el registro $v0 el valor -1. En caso de cualquier otro error (por ejemplo, grado del polinomio 0 o negativo) se devolverá igualmente el valor -1 en el registro $v0. En caso de que no exista ningún error se devolverá en el registro $v0 el valor 0 y en el registro $v1 el valor real del polinomio. 3 MATERIAL DE APOYO A continuación se describe la información de apoyo disponible. Para la realización de esta práctica se dispone del siguiente software y documentación: 1. Simulador SPIM. Simulador del entorno de trabajo de la arquitectura MIPS. Se dispone de diferentes programas para varias plataformas (Windows, MS-DOS y Linux). Las distintas versiones del simulador pueden descargarse desde la página: http://www.cs.wisc.edu/∼larus/spim.html NOTAS: • La versión del simulador SPIM para Linux, xspim, está instalado en las aulas Linux donde se desarrollarán las prácticas de las asignatura. • La versión del simulador SPIM para Windows, PCSpim, puede ser utilizada para la realización de la práctica en un entorno diferente al de las aulas Linux. • No obstante, independientemente de cuál sea el entorno de desarrollo, la práctica debe funcionar correctamente en las aulas Linux de la escuela (el alumno debe asegurarse de que su práctica funciona correctamente en ese entorno). 2. Documentación. En la página web del simulador SPIM (http://www.cs.wisc.edu/∼larus/spim.html) se puede conseguir un manual sobre la utilización del simulador. Hay varias páginas web con información sobre el simulador SPIM y los microprocesadores MIPS. 11 3.1 Recursos en Internet El alumno también dispone de la siguiente documentación en Internet: 1. Página web de la asignatura: http://www.arcos.inf.uc3m.es/∼ii ec En esta página web el alumno podrá consultar información acerca de las prácticas de la asignatura. 2. Foro de discusión relacionado con las prácticas de la asignatura donde el alumno podrá exponer cualquier comentario, duda o pregunta. La web disponible para el foro de discusión es: http://apps.lab.inf.uc3m.es/foro/ NOTAS: • Las news no tienen moderador. Se deja al criterio de cada alumno el buen uso que se haga del grupo de noticias. • Uso preferente para consultar dudas de prácticas. • El alumno tiene que registrarse en el foro para poder insertar preguntas o comentarios, si bien no es necesario registrarse para leer los comentarios existentes en el foro. 3.2 Material a entregar La realización de la práctica consiste en la implementación de las diversas funciones indicadas. Además, deberán entregarse los siguientes ficheros: • memoria.pdf En ella se deben comentar los aspectos del desarrollo de su práctica que considere más relevantes. Asimismo, puede exponer los comentarios personales que considere oportuno. Además deberá cumplir los siguientes requisitos: – Presentar una estructura lógica en sus contenidos. – Estar convenientemente formateada, para facilitar su lectura. – Describir con claridad y en profundidad los puntos recogidos en este cuaderno de prácticas, ası́ como los que decidan incluir como complemento. – Incluir las pruebas realizadas. – Incluir los comentarios personales que considere oportunos. – NO incluir el código de las funciones. 12 NOTA: No descuide la calidad de la memoria de su práctica. Aprobar la memoria es tan imprescindible para aprobar la práctica, como el correcto funcionamiento de la misma. Si al evaluarse la memoria de su práctica, se considera que no alcanza el mı́nimo admisible, su práctica estará suspensa. La memoria debe incluir, como mı́nimo, los siguientes puntos: – Índice del documento. – Autores. – Descripción del código, incluyendo descripción de los convenios y notación usados. Por cada función se ha de incluir, al menos: ∗ Diseño de cada función (pseudocódigo, diagrama, etc.). ∗ Aspectos relativos a la construcción de cada función. ∗ Diseño de casos de prueba y programas de prueba. Se ha de incluir también los valores que se esperan obtener al ejecutar la función con cada caso de prueba. – Conclusiones del alumno. – Descripción de las tareas realizadas y tiempo dedicado a cada tarea. • plx.s Código fuente en ensamblador de MIPS de TODAS las funciones descritas en la sección 2. NOTA: Los ficheros donde se implementen las funciones SOLAMENTE deben contener funciones. No se deberá incluir las directivas .text y .data, ni datos de prueba. Tampoco deben de contener una función ”main”, aunque pueden existir otras funciones auxiliares que necesite el usuario. Las fechas de entrega de la práctica pueden consultarse en la página web: http://www.arcos.inf.uc3m.es/∼ii ec/practicas/intro.html 3.3 Bibliografı́a y Material de Consulta • Estructura y diseño de computadores : interficie, circuiteria, programación, Patterson, D.A. y Hennessy, J.L. Vol. 3. Ed.: Reverté, 2000. • Fundamentos de los Computadores Pedro de Miguel Anasagasti. Quinta edición, Editorial Paraninfo, 1996. • Organización y Arquitectura de Computadores. William Stallings Prentice-Hall, 2000. • Organización de Computadoras: Un enfoque estructurado. Andrew S. Tanenbaum Prentice Hall, 1992. 13