You are on page 1of 170

´ ´ a la Practicas de Introduccion Arquitectura de Computadores

con el simulador SPIM
Sergio Barrachina Mir Jose M. Claver Iborra ´ Maribel Castillo Catalan ´ Juan C. Fernandez Fdez

c 2007 Sergio Barrachina Mir, Maribel Castillo Catal´ an, Jos´ e M. Claver Iborra y Juan Carlos Fern´ andez Fern´ andez. Reservados todos los derechos. Esta ((Edici´ on Provisional)) puede reproducirse exclusivamente con fines autodidactas o para su uso en centros p´ ublicos de ense˜ nanza. En el segundo caso, tan s´ olo se cargar´ an al estudiante los costes de re´ nimo de lucro o con producci´ on. La reproducci´ on total o parcial con a cualquier finalidad comercial queda estrictamente prohibida salvo que cuente con el permiso escrito de los autores.

´ P R OLOGO
Este libro de pr´ acticas est´ a dirigido a estudiantes de primeros cursos de Ingenier´ ıas T´ ecnicas Inform´ aticas e Ingenier´ ıas Inform´ aticas que cursen asignaturas de introducci´ on a la Arquitectura de Computadores, y en general, a aquellos lectores que deseen aprender Arquitectura de Computadores por medio de la realizaci´ on de ejercicios con lenguaje ensamblador. Pese a que el hilo conductor del libro es la programaci´ on en lenguaje ensamblador, el lector no debe confundirlo con un curso de programaci´ on en ensamblador. El objetivo de este libro no es el de ense˜ nar a programar en ensamblador, sino el de ayudar a que el lector asimile y comprenda, por medio de la programaci´ on en ensamblador, los conceptos fundamentales de Arquitectura de Computadores. En particular, se abordan los siguientes temas: representaci´ on de la informaci´ on, tipos de datos, el juego de instrucciones, registros, organizaci´ on de la memoria, programaci´ on de computadores a bajo nivel, relaci´ on entre la programaci´ on en un lenguaje de alto nivel y el funcionamiento del procesador y tratamiento de interrupciones y excepciones. Puesto que se pretende favorecer la comprensi´ on de dichos conceptos por medio de la realizaci´ on de pr´ acticas en ensamblador, cobra especial importancia la elecci´ on del procesador que ser´ a objeto de estudio. Analizando qu´ e procesadores han sido escogidos, a lo largo de los a˜ nos, por las asignaturas de introducci´ on a la Arquitectura de Computadores de distintas Universidades, se puede ver que han sido varios los elegidos y que la elecci´ on de uno u otro ha estado fuertemente condicionado por las modas. En cualquier caso, es posible constatar que aquellas elecciones que han contado con mayor aceptaci´ on, y que han permanecido por m´ as tiempo, han estado siempre relacionadas con la aparici´ on de procesadores que, por su concepci´ on y dise˜ no, han revolucionado el campo de los computadores. Cabe destacar, entre estos procesadores, los siguientes: el PDP 11 de DEC, el MC68000 de Motorola, el 8088/86 de Intel y el R2000/3000 de MIPS. El procesador MC68000 de Motorola ha sido ampliamente utilizado, y lo es a´ un hoy en d´ ıa, en las pr´ acticas de las asignaturas de Arquitectura de Computadores de muchas Universidades. Lo mismo se puede decir del procesador
I

el procesador m´ as extendido en la actualidad en el a de la ense˜ nanza de Arquitectura de Computadores. sin la necesidad de tener acceso a un computador real basado en dicho procesador. lo que hace id´ oneo al MIPS32 para utilizarlo en la ense˜ nanza de Arquitectura de Computadores es que se trata de un procesador real pero lo suficientemente sencillo como para estudiarlo sin demasiadas complicaciones. ´ mbito Sin embargo. Dicho procesador. simplemente decir que se ha hecho un esfuerzo importante para que sea. puede servir de base para el estudio de arquitecturas m´ as avanzadas. En cuanto a la organizaci´ on del presente libro. por un lado. En el caso de Intel. Por otro lado. constituye la semilla de muchos de los dise˜ nos de procesadores superescalares actuales. En este libro se propone el simulador SPIM de James Larus [Lar]. es f´ acil extender los conocimientos adquiridos en su estudio a arquitecturas m´ as avanzadas.II ´ ltimo en menor medida. mantiene la simplicidad de los primeros procesadores RISC y. y el que se propone en este libro. Puede obtenerse de forma gratuita desde la p´ agina web del autor y est´ a disponible tanto para Windows como para GNU/Linux. As´ ı. muchos de los conceptos te´ oricos necesarios para realizar los ejercicios que se proponen. 1 En su versi´ on no segmentada y sin instrucciones retardadas de carga. el motivo determinante para su adopci´ on ha sido sin duda. es la existencia de simuladores que permiten comprobar c´ omodamente su funcionamiento. es el MIPS321 . almacenamiento y salto. autocontenido. la amplia difusi´ on de los computadores personales (PCs) de IBM y compatibles. Dicho de otra forma. es relativamente f´ acil desarrollar peque˜ nos programas en ensamblador y observar el efecto de su ejecuci´ on. Aunque este u la tiene a su favor la ortogonalidad de su juego de instrucciones y la existencia de diferentes modos prioritarios de funcionamiento. El procesador de Motoro8086 de Intel. . se introducen conforme son requeridos. y a la vez. no hay que perder de vista que el libro se ofrece como complemento a una formaci´ on te´ orica en Arquitectura de Computadores y. en la medida de lo posible. Otro punto a favor de la utilizaci´ on del MIPS32. al ser su arquitectura la semilla de muchos de los dise˜ nos de procesadores superescalares actuales. por otro. Debido a la simplicidad del juego de instrucciones del MIPS32. Nuestra intenci´ on no va m´ as all´ a de la de ofrecer un complemento eminentemente pr´ actico a una formaci´ on te´ orica en Arquitectura de Computadores. En cualquier caso. por tanto. gran parte de los conceptos generales o m´ as espec´ ıficos se han dejado forzosamente fuera.

Convenios tipogr´ aficos Se presentan a continuaci´ on los convenios tipogr´ aficos seguidos en la redacci´ on de este libro. Para diferenciar un n´ umero del texto que lo rodea. naturalmente.III En cuanto a la formaci´ on te´ orica en Arquitectura de Computadores. Para diferenciar una sentencia en ensamblador del texto que la rodea. ´ ste se precede del prefijo ((0x)). de David A. ferencia a un registro. Si el n´ umero expresado en binario corresponde a una palabra de 32 bits. se utiliza el siguiente el siguiente formato: (( la $a0. De esta forma. . Hennesy [Pat00].e. en se estudia el procesaPatterson y John L. e Los c´ odigos o fragmentos de c´ odigo se representan de la siguiente forma:  hola-mundo. 4 l a $a0 . Para expresar un n´ umero en binario se utiliza el sub´ ındice (( )). de David A. e peque˜ no espacio en medio. se representa con un peque˜ no espacio cada 8 bits.e. Hennesy [Pat00] como referencia de la parte de te´ orica de la asignatura y el presente libro para la realizaci´ on de las pr´ acticas de laboratorio de dicha asignatura. consideramos que como libro de referencia se podr´ ıa utilizar el libro ((Estructura y dise˜ no de computadores: interficie circuiter´ ıa/programaci´ on)). un curso introductorio a la Arquitectura de Computadores podr´ ıa utilizar el libro ((Estructura y dise˜ no de computadores: interficie circuiter´ ıa/programaci´ on)). para facilitar su lectura. 0010 . el n´ umero se representa utilizando una fuente mono espaciada. p. como por ejemplo en: 1024. 0x4A. Patterson y John L. t e x t o syscall # # # # Zona de i n s t r u c c i o n e s Llamada a l s i s t e m a p a r a p r i n t s t r Direccio ´ n de l a c a d e n a M u e s t r a l a c a d e n a en p a n t a l l a main : En la parte superior derecha se muestra el nombre del fichero asociado a dicho c´ odigo. e p.e.s 1 2 3 4 5 6 7 texto : .text l i $v0 . para facilitar su lectura. en el que tambi´ dor MIPS32.data # Zona de d a t o s . Esta numeraci´ on tiene por objeto facilitar la referencia a l´ ıneas concretas del listado y. Si el n´ umero expresado en hexadecimal corresponde a una palabra ´ ste aparece de la siguiente forma: 0x0040 0024. Cuando se hace re´ ste se marca de la siguiente forma: $s0.: 00000001 00100011 01000101 01100111 . p. En el margen izquierdo se muestra la numeraci´ on correspondiente a cada una de las l´ ıneas del c´ odigo representado. Es decir. texto )). con un de 32 bits. a s c i i z ” ¡ H o l a mundo ! ” . Para expresar un n´ umero en hexadecimal.

. Fernando Ochera Bagan y Ximo Torres Sospedra. . . Mariam Faus Villarrubia. .... . . .... In´ es de Jes´ us Rodr´ ıguez.. ...IV no forma parte del c´ odigo en ensamblador. . . En particular. .. De esta forma. .. . Cada uno de los ejercicios del libro posee un ´ nico. .. . . esperamos poder mejorarlo en futuras ediciones. puede utilizarse dicho n´ identificador u umero para referenciar un ejercicio en particular.. . .. . .. Joaqu´ ın Delf´ ın Bachero S´ anchez.... Ingenier´ ıa T´ ecnica de Sistemas e Ingenier´ ıa T´ ecnica de Gesti´ on de la Universidad Jaume I de Castell´ on. .. .. . Roberto Garc´ ıa Porcell´ a. Rafael Mayo Gual. EJERCICIOS . A continuaci´ on se muestra un ejemplo de bloque de ejercicios: . Por u blanco en las cadenas de texto se representan mediante el car´ acter (( )). .. Es fruto de la experienEste texto no es obra u cia docente del profesorado involucrado en las asignaturas de ((Introducci´ on a los Computadores)).... . Daniel Gimeno Sol´ ıs y Sergio L´ opez Hern´ andez. ((Arquitectura de Computadores)) y ((Estructura y Tecnolog´ ıa de Computadores)) de las titulaciones de Ingenier´ ıa Inform´ atica. . y para evitar confusiones. . se utilizan diferentes formatos para representar las palabras reserva´ ltimo.. . ..... nuestro m´ as sincero agradecimiento. .. . .. ... Agradecimientos ´ nicamente de sus autores. . . .. . agradecer de antemano la colaboraci´ on de cuantos nos hagan llegar aquellas erratas que detecten o las sugerencias que estimen oportunas sobre el contenido de este libro. Germ´ an Le´ on Navarro..... .. . .. . Nos gustar´ ıa. se ha enriquecido especialmente con las aportaciones. e l´ ıneas horizontales punteadas. . los espacios en das y los comentarios. ... . .. .. . Con el fin de facilitar la lectura del c´ odigo. . .. .. . ... . comentarios y correcciones de los siguientes profesores del departamento de Ingenier´ ıa y Ciencia de los Computadores de la Universidad Jaume I: Eduardo Calpe Marz´ a. . ... Para todos ellos.. . De esta forma.. .. . · 2 Localiza el comentario ((# Zona de datos )) en el programa anterior. Tambi´ en nos gustar´ ıa agradecer a los siguientes estudiantes de la Universidad Jaume I el que revisaran con impagable inter´ es una de las primeras versiones del manuscrito: Nicol´ as Arias Sidro.. ... ... ... . .... Jos´ e Cerisuelo Vidal. . · 1 Localiza la cadena ((”Hola mundo”)) en el programa anterior. . .... .. ´ stos aparecen delimitados entre dos En cuanto a los bloques de ejercicios.. adem´ as..

. . . . Operaciones aritm´ eticas. .3. . .6. . . . Operaciones de desplazamiento . . . . . .5. . . .4. . . . . . . . . . . 1. . . . . . 3. .1. . . . . . . .1. . . . . . . . . 2. l´ ogicas y de desplazamiento 4. . . . . . . .1. . . . . . Problemas del cap´ ıtulo .2. . . . . Declaraci´ on de palabras en memoria 2. . . . . . . . . . . . Almacenamiento de bytes (bytes de registro a memoria) 3. . . . . . Operaciones l´ ogicas . . . . . . . Almacenamiento de palabras (de registro a memoria) . . 1. . . Operaciones de salto condicional . . . . . . . . .2. . . . . . . . . . .5. . . . . . . . . . . Operaciones aritm´ eticas . . . . . . 3 Carga y almacenamiento 3. . . . . . .3. . .4. . . . Alineaci´ on de datos en memoria . . . . 3. . . . . . . . . Problemas del cap´ Datos en memoria 2. 4. V 1 2 13 15 17 17 19 20 21 21 22 25 26 29 30 31 32 33 35 36 39 41 43 45 46 2 . . . . . Problemas del cap´ ıtulo .2. . . . . . . . . . 3. Descripci´ on del simulador SPIM . . . Sintaxis del lenguaje ensamblador del MIPS32 . . . . . . . . . .1. . 2. . . . Reserva de espacio en memoria . . . . . . . . . . . . . . 3. . . . . Carga de bytes (de memoria a registro) . . . . . . . . . . . . . .3. . . . Declaraci´ on de cadenas de caracteres 2. . . . . . . . . .4. .2. . . . . .1. . . . 4. 4 . . . Declaraci´ on de bytes en memoria . . . . . . . . . . . . . . . . . . . . . . .3. 5 Operaciones de salto condicional y de comparaci´ on 5.´ NDICE GENERAL I ´ Indice general 1 Introducci´ on al simulador SPIM 1. . . Carga de datos inmediatos (constantes) . . . . . . . . . . . . . . 4. ıtulo . . . . . . . . . 2. . . .6. . V . . . Problemas del cap´ ıtulo . . . . . . . . . Carga de palabras (de memoria a registro) . . . . .

. . Dispositivos perif´ ericos en el simulador SPIM . . . . . . . . . Problemas del cap´ ıtulo . 5. . . Registros para el tratamiento de las excepciones . . . . Llamada y retorno de una subrutina . . . . . . . . . . . . . . .4. . . . . . . . . . . . Interrupciones . . . . . . . .2. . . . . . 5. . 7. . 9. . . . . .1.VI ´ Indice general 5. . . . . . .4. . . . . . . . Salida de datos por pantalla . . . . . . . . . Excepciones software . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . .1. . . . Gesti´ on de subrutinas 8. . . Problemas del cap´ ıtulo . . . Paso de par´ ametros . . . .2. . . . . . .2. . . . . . . . . . . . . . .3. . . . . . . . . . . . . . . . . . . . . . . Problemas del cap´ ıtulo . . . 6.2. Problemas del cap´ ıtulo . . .2. . . . . . . . . . . . . Finalizaci´ on del programa en curso: exit . . . . . . Evaluaci´ on de condiciones . 10 Gesti´ on de la entrada/salida mediante interrupciones 10. .3. . . . . Entrada de datos desde el teclado . Gesti´ on de la entrada/salida mediante consulta de estado 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . 9. . . . . . .1. .1. . . . . . . . . . . .1. . 10. . . . Tratamiento de las excepciones . . . Introducci´ on a la gesti´ on de subrutinas 7. . . . . . . . . .3. . .3. . . . . . . . . . 8. . . . . . . . . . . . Problemas del cap´ ıtulo . . . Estructuras de control condicionales . . . . .2. . . . . . . Introducci´ on . . . . . . Entrada/Salida de datos . . . Opciones del programa SPIM para la simulaci´ on de interrupciones .3. 10. . . . . . . . . . . Operaciones de comparaci´ on . . . . . . . . . . . . . . . 9. . . . .6. . Bloque de activaci´ on de la subrutina . . . . . 6. . . . . . . La pila . . .5. . . . . . . 150 . . . . . . . . . . . . 10. . . . . . . .4. . . . .3. . . . . . . . . . . . . . . . . . . 6 Estructuras de control condicionales y de repetici´ on 6. . . . 9. . . . . Problemas del cap´ ıtulo . . . . 10. . . . . . . 7. . . . 149 B. Estructuras de control repetitivas . . .5. . .1. . . 8. . . . . . . . . . . . . . . . . . . . . 10. Bibliograf´ ıa A Manual de uso del comando xspim B Llamadas al Sistema Operativo 149 B. . . . . . . . . . . 48 48 53 55 55 60 63 65 66 70 77 79 80 84 98 101 104 106 107 109 110 111 113 117 124 124 127 141 143 145 7 8 9 . . . . . . . . . .

. . . .´ Indice general VII B. . . B. 151 152 152 153 155 157 C Registros del Coprocesador 0 D Cuadro resumen del juego de instrucciones del MIPS . . . .6. . . . . . . . Impresi´ on de un entero: print int . . Lectura de una cadena: read string .5.3. . B. . . . . . . . . . . . . . . . . . . . . . Impresi´ on de una cadena: print string Lectura de un entero: read int . . .4. . . . . . . B. . .

.

. . . . El simulador SPIM est´ a disponible de forma gratuita tanto para GNU/Li´ nicamente nux como para Windows. . . . .3. . Una vez realizada esta simulador y de la informaci´ on que e descripci´ on. . . . .1. . . . . El cap´ ıtulo comienza con una breve descripci´ on de la interfaz gr´ afica del ´ ste proporciona.2. El cap´ ıtulo contin´ ua con una introducci´ on al ensamblador del MIPS32 en la que se comenta la sintaxis b´ asi1 . . . . 1 ´ AL SIMULADOR I NTRODUCCI ON SPIM on del simulador SPIM . Aunque en este cap´ ıtulo se va a describir u la versi´ on para GNU/Linux.CAP´ ITULO ´ Indice 1. . . 2 Descripci´ Sintaxis del lenguaje ensamblador del MIPS32 . de forma m´ as habitual. . 1. . . . . se presta atenci´ on a las operaciones que. . . 1. . . 13 Problemas del cap´ ıtulo . . las pr´ acticas propuestas a lo largo del libro se pueden realizar con cualquiera de las versiones. . gran parte de la descripci´ on que se haga del funcionamiento de dicha versi´ on es directamente aplicable a la versi´ on para Windows. . Naturalmente. se realizar´ an durante el seguimiento de las pr´ acticas propuestas: cargar el c´ odigo fuente de un programa en el simulador y depurar errores de programaci´ on mediante la ejecuci´ on fraccionada del programa. 15 El objetivo de este cap´ ıtulo es el de describir el funcionamiento b´ asico del simulador SPIM y la sintaxis de los programas en ensamblador que acepta dicho simulador. .

se puede instalar ejecutando ((apt-get install spim)) o ((emerge spim)). .cs.1. En las siguientes secciones se describe el funcionamiento de la versi´ on GNU/Linux del simulador. SuSE o similar.html En dicha p´ agina web tambi´ en se pueden encontrar las instrucciones de instalaci´ on para Windows y GNU/Linux. presenta una ventana dividida en cinco paneles (v´ ease la Figura 1. en los siguientes cap´ ıtulos). que as´ ı se llama la versi´ on gr´ afica para GNU/Linux. 2.1.edu/˜larus/spim. 1. Puede descargarse gratuitamente desde la siguiente p´ agina web: http://www. de arriba a abajo. Versi´ on para GNU/Linux: XSPIM XSPIM.1. respectivamente. puede que sea m´ as sencillo buscar en Internet un paquete RPM actualizado del simulador e instalarlo (p. La instalaci´ on de la versi´ on para Windows es bastante sencilla: basta con ejecutar el fichero descargado. La instalaci´ on para GNU/Linux es un poco m´ as compleja ya que en la p´ agina web s´ olo est´ a disponible el c´ odigo fuente del simulador. si. escrito al rev´ sarrollado por James Larus. 3. con ((rpm -i spim. Panel de visualizaci´ on de c´ odigo (text segments): muestra las instrucciones del programa de usuario y del n´ ucleo del sistema (kernel) que se carga autom´ aticamente cuando se inicia XSPIM.rpm))).e. Panel de visualizaci´ on de registros (registers’ display): muestra los valores de los registros del procesador MIPS.wisc. Es importante estudiar con detalle el contenido de este cap´ ıtulo ya que de su comprensi´ on depende en gran medida el mejor aprovechamiento de las pr´ acticas propuestas en lo que resta de libro. en cambio. son: 1. 1. Descripci´ on del simulador SPIM es) es un simulador deEl simulador SPIM [Lar] (MIPS. se utiliza la distribuci´ on Debian o Gentoo.1) que. Finalmente. Si se utiliza una distribuci´ on GNU/Linux RedHat.2 Introducci´ on al simulador SPIM ca de este lenguaje (que se ir´ a ampliando. Panel de botones (control buttons): contiene los botones desde los que se gestiona el funcionamiento del simulador. presenta un ejemplo sencillo que permitir´ a al lector practicar y familiarizarse con el funcionamiento del simulador. conforme se necesite. capaz de ensamblar y ejecutar programas escritos en lenguaje ensamblador para computadores basados en los procesadores MIPS32.

Panel de visualizaci´ on de datos (data segments): muestra el contenido de la memoria.1. 5. Panel de visualizaci´ on de mensajes: lo utiliza el simulador para informar qu´ e est´ a haciendo y avisar de los errores que ocurran durante el ensamblado o ejecuci´ on de un programa.1: Ventana principal del simulador XSPIM La informaci´ on presentada en cada uno de estos paneles se describe en las siguientes secciones. Descripci´ on del simulador SPIM 3 4. . Figura 1.1.

el registro $29. Puesto que se puede representar un n´ umero real en el MIPS32 utilizando los formatos IEEE 754 de simple y doble precisi´ on.2) se muestran los diversos registros del MIPS32. Cause y BadVAddr. su alias entre par´ entesis (si es que lo tiene) y su contenido. que no es m´ as que otro nombre con el que puede referirse al mismo registro. respectivamente. se utilizan 8 d´ ıgitos hexadecimales para representar su contenido. salvo los de coma flotante. El simulador los etiqueta con los nombres R0 al R31. el contenido de todos los registros. En concreto. Como se puede observar. Pese a que est´ an representados con . Para cada registro se muestra su nombre. • El contador de programa: PC (program counter). Panel de botones En este panel (v´ ease la Figura 1. se muestra en hexadecimal. el puntero de pila (stack pointer). • Los registros especiales: HI (HIgh) y LO (LOw). Recordar que cada d´ ıgito hexadecimal corresponde a 4 bits.4 Introducci´ on al simulador SPIM Panel de visualizaci´ on de registros En este panel (v´ ease la Figura 1. 2 d´ ıgitos hexadecimales. De e umero real que almacenan. el simulador muestra la interpretaci´ on del contenido de dichos registros seg´ un sea el formato utilizado bajo las leyendas Single Floating Point Registers y Double Floating Point Registers. los registros mostrados son: Del banco de enteros: • Los registros de enteros del $0 al $31 con sus respectivos alias entre par´ entesis. que se identifica mediante la etiqueta R29 seguida por la etiqueta sp entre par´ entesis. podr´ a utilizarse indistintamente como $29 o $sp. por tanto.3) se encuentran los botones que permiten controlar el funcionamiento del simulador. Al lado de cada uno de ellos aparece entre par´ entesis su alias. As´ ı. Del banco para el manejo de excepciones: • Los registros Status. EPC. se muestra el valor del n´ al FP31. Del banco de reales en coma flotante: • Los registros del $f0 al $f31 etiquetados con los nombres FP0 ´ stos. Puesto que los registros del MIPS32 son de 4 bytes (32 bytes). constituyen un byte.

Por defecto. su funcionamiento. se puede utilizar este bot´ on para ensamblar de nuevo dicho fichero. Cuando se pulsa el bot´ on aparece un cuadro de di´ alogo que permite especificar el n´ umero de instrucciones que se deben ejecutar en cada paso (por defecto. £   ¢run ¡Sirve para ejecutar el programa cargado en memoria.1.1.   £ ¢load ¡Permite especificar el nombre del fichero que debe ser ensam§ ¤ blado y cargado en memoria. De esta forma. Esta forma ¦ ´ til para la depuraci´ de ejecutar los programas es extremadamente u on de errores ya que permite observar el efecto de la ejecuci´ on de cada una de las instrucciones que forman el programa y de esta forma detectar si el programa est´ a realizando realmente lo que se piensa que deber´ ıa hacer. esta direcci´ on es la 0x0040 0000. aparece un cuadro de di´ alogo que pregunta si realmente se quiere salir. es m´ as similar al de los elementos de un barra de men´ us. si el programa que se est´ a probando no ensambla o no funciona. una). puede editarse y recargarse de nuevo sin tener que volver a teclear su nombre. en algunos casos. Cuando se pul¦ sa. § ¤ step ¥ Este bot´ on permite ejecutar el programa paso a paso. as´ ı como interrumpir la ejecuci´ on paso a .2: Panel de visualizaci´ on de registros de XSPIM forma de botones. Antes de comenzar la ejecuci´ on se muestra un cuadro de di´ alogo en el que se puede especificar la direcci´ on de comienzo de la ejecuci´ on.   £ ¢reload ¡ Habiendo especificado previamente el nombre del fichero que debe ensamblarse por medio del bot´ on anterior. Descripci´ on del simulador SPIM Registro Alias Contenido 5 Figura 1. Son los siguientes: quit ¥ Se utiliza para terminar la sesi´ on del simulador.

6

Introducci´ on al simulador SPIM

paso y ejecutar lo que quede de programa de forma continua. Es conveniente, sobre todo al principio, ejecutar los programas instrucci´ on a instrucci´ on para comprender el funcionamiento de cada una de ellas y £   su contribuci´ on al programa. Si uno se limita a pulsar el bot´ on ¢run ¡tan ´ l o no, pero no s´ olo ver´ a si el programa ha hecho lo que se esperaba de e comprender´ a el proceso seguido para hacerlo.
£   ¢clear ¡Sirve para restaurar a su valor inicial el contenido de los regis-

tros y de la memoria o para limpiar el contenido de la consola. Cuando se pulsa, se despliega un men´ u que permite indicar si se quiere restaurar s´ olo los registros, los registros y la memoria, o limpiar el contenido la ´ til consola. Restaurar el valor inicial de los registros o de la memoria es u cuando se ejecuta repetidas veces un mismo programa, ya que en caso contrario, al ejecutar el programa por segunda vez, su funcionamiento podr´ ıa verse afectado por la modificaci´ on durante la ejecuci´ on anterior del contenido de ciertos registros o posiciones de memoria.
£   ¢set value ¡Permite cambiar el contenido de un registro o una posi-

ci´ on de memoria. print ¥ Permite mostrar en el panel de mensajes el contenido de un ¦ rango de memoria o el valor asociado a las etiquetas globales (global symbols). breakpoints ¥ Sirve para introducir o borrar puntos de ruptura o pa¦ rada (breakpoints) en la ejecuci´ on de un programa. Cuando se ejecuta un programa y se alcanza un punto de ruptura, la ejecuci´ on del programa se detiene y el usuario puede inspeccionar el contenido de los registros y la memoria. Cuando se pulsa este bot´ on aparece un cuadro de di´ alogo que permite a˜ nadir las direcciones de memoria en las que se desea detener la ejecuci´ on del programa.
§ § ¤ § ¤

help ¥ Imprime en el panel de mensajes una escueta ayuda. ¦

¤

£   en lla¢terminal ¡ Muestra o esconde la ventana de consola (tambi´

mada terminal). Si el programa de usuario escribe o lee de la consola, todos los caracteres que escriba el programa aparecer´ an en esta ventana y aquello que se quiera introducir deber´ a ser tecleado en ella.
£   ¢mode ¡Permite modificar el modo de funcionamiento de XSPIM. Los

modificadores disponibles son: quiet y bare. El primero de ellos, inhibe la escritura de mensajes en la ventana de mensajes cuando se produce

1.1. Descripci´ on del simulador SPIM

7

una excepci´ on. El segundo, bare, simula una m´ aquina MIPS sin pseudoinstrucciones ni modos de direccionamiento adicionales. Para la correcta realizaci´ on de los ejercicios propuestos en este libro ambos modificadores deber´ an estar desactivados (es la opci´ on por defecto).

Figura 1.3: Panel de botones de XSPIM

Panel de visualizaci´ on de c´ odigo odigo m´ aquina presente en el Este panel (v´ ease la Figura 1.4) muestra el c´ simulador. Se puede visualizar el c´ odigo m´ aquina correspondiente al c´ odigo de usuario (que comienza en la direcci´ on 0x0040 0000) y el correspondiente al n´ ucleo (kernel) del simulador (que comienza en la direcci´ on 0x8000 0000).

Figura 1.4: Panel de visualizaci´ on de c´ odigo de XSPIM Cada una de las l´ ıneas de texto mostradas en este panel se corresponde con una instrucci´ on en lenguaje m´ aquina. La informaci´ on presentada est´ a organizada en columnas que, de izquierda a derecha, indican: la direcci´ on de memoria en la que est´ a almacenada dicha instrucci´ on m´ aquina, el contenido en hexadecimal de dicha posici´ on de memoria (o lo que es lo mismo, la representaci´ on en ceros y unos de la instrucci´ on m´ aquina), la instrucci´ on m´ aquina (en ensamblador), y el c´ odigo fuente en ensamblador desde el que se ha generado dicha instrucci´ on m´ aquina (una l´ ınea de ensamblador puede generar m´ as de una instrucci´ on m´ aquina).

8

Introducci´ on al simulador SPIM

Cuando se cargue un programa en el simulador, se ver´ a en la cuarta columna las instrucciones en ensamblador del programa cargado. Cada instrucci´ on estar´ a precedida por un n´ umero seguido de ((:)); este n´ umero indica el n´ umero de l´ ınea del fichero fuente en la que se encuentra dicha instrucci´ on. Cuando una instrucci´ on en ensamblador produzca m´ as de una instrucci´ on m´ aquina, esta columna estar´ a vac´ ıa en las siguientes filas hasta la primera instrucci´ on m´ aquina generada por la siguiente instrucci´ on en ensamblador. Panel de visualizaci´ on de datos En este panel (v´ ease la Figura 1.5) se puede observar el contenido de las siguientes zonas de memoria: Datos de usuario (DATA): van desde la direcci´ on 0x1000 0000 hasta la 0x1002 0000. Pila (STACK ): se referencia mediante el registro $sp. La pila crece hacia direcciones bajas de memoria comenzando en la direcci´ on de memoria 0x7fff effc. N´ ucleo del simulador (KERNEL): a partir de la direcci´ on 0x9000 0000.

Figura 1.5: Panel de visualizaci´ on de datos de XSPIM El contenido de la memoria se muestra de una de las dos formas siguientes: ´ nica direcci´ Por medio de una u on de memoria (entre corchetes) al comienzo de la l´ ınea seguida por el contenido de cuatro palabras de memoria: el valor que hay en la posici´ on de memoria indicada y el que hay en las tres posiciones siguientes. Una l´ ınea de este tipo presentar´ ıa, por ejemplo, la siguiente informaci´ on:
[0x10000000] 0x0000 0000 0x0010 0000 0x0020 0000 0x0030 0000

,

donde (([0x1000 0000])) indica la direcci´ on de memoria en la que est´ a almacenada la palabra 0x0000 0000; las siguientes tres palabras, que en el ejemplo contienen los valores: 0x0010 0000, 0x0020 0000

1.. Figura 1. la carga en memoria del programa se interrumpir´ a y se mostrar´ a un mensaje similar al mostrado en la Figura 1. . respectivamente. Se utiliza este tipo de representaci´ on para hacer el volcado de memoria lo m´ as compacto posible.s)) y que est´ aa . Por medio de un rango de direcciones de memoria (dos direcciones de memoria entre corchetes con ((.1. esto es. Una l´ ınea de este tipo tendr´ ıa. )) entre ellas) seguida por el contenido que se repite en cada una de las palabras de dicho rango.6: Panel de visualizaci´ on de mensajes de XSPIM A continuaci´ on se muestran algunas situaciones y los mensajes que generan. por ejemplo. que indica que todas las palabras de memoria desde la direcci´ on de memoria 0x1000 0010 hasta la direcci´ on 0x1002 0000 contienen el valor 0x0000 0000. Figura 1.[0x1002 0000] 0x0000 0000 . est´ an en las posiciones de memoria consecutivas a la 0x1000 0000. 0x1000 0008 y 0x1000 000c. Descripci´ on del simulador SPIM 9 y 0x0030 0000.7. Panel de visualizaci´ on de los mensajes del simulador Este panel (v´ ease la Figura 1.7: Mensaje de error al ensamblar un programa En el mensaje anterior se puede ver que el simulador informa de que el error ha sido detectado en la l´ ınea 5 del fichero ((hola-mundo2.. .6) es utilizado por el simulador para mostrar una serie de mensajes que tienen por objeto informar de la evoluci´ on y el resultado de las acciones que se est´ en llevando a cabo en un momento dado. en las direcciones de memoria 0x1000 0004. la siguiente informaci´ on: [0x1000 0010]. Si se carga un programa y durante el proceso de ensamblado se detecta un error.

ya sea en el ensamblado o en la ejecuci´ on. Un mensaje de error t´ ıpico durante la ejecuci´ on de un programa ser´ ıa on similar al mostrado en la Figura 1.10 Introducci´ on al simulador SPIM la altura de la letra ((l)) (gracias al car´ acter ((ˆ)) que aparece en la tercera l´ ınea). la direcci´ on de memoria de la instrucci´ on es la 0x0040 0028 y el error es Unaligned address in inst/data fetch: 0x10010001.8: Mensaje de error durante la ejecuci´ on de un programa De momento el lector no debe preocuparse si no entiende el significado de lo expuesto en esta secci´ on. sin que se disponga de las pseudo-instrucciones y modos de direccionamiento aportados por el ensamblador. Adem´ as. en lugar de escribir (( li )) hab´ ıamos tecleado (( l i )) por error.8. De e as interesantes son: -bare: Sirve para que la simulaci´ on sea la de una m´ aquina pura. Figura 1. donde deber´ ıa encontrarse el c´ odigo de servicio de la excepci´ on. En efecto. XSPIM salta a la posici´ on 0x8000 0180.2. a˜ nadir un c´ odigo de inicio que llame a la rutina main. En el ejemplo. En segundo lugar. (Cuando se utiliza esta opci´ on la ejecuci´ on comienza en la instrucci´ on etiquetada como (( start )) y no en ((main)) como es habitual). en este caso. recuerde que debe consultar la informaci´ on mostrada en este panel para averiguar qu´ e es lo que debe corregir. 1. El mensaje de error indica la direcci´ de memoria de la instrucci´ on m´ aquina que ha provocado el error y el motivo que lo ha provocado. Esta rutina tiene dos funciones que deber´ an ser asumidas por el programa de usuario. -notrap: Se utiliza para evitar que se cargue de forma autom´ atica la rutina de captura de interrupciones.1. es ´ stas. Cuando se produce una excepci´ on. Lo realmente importante es que cuando algo falle. se interrumpir´ a la ejecuci´ on del programa y se indicar´ a en este panel la causa del error. capturar excepciones. . si cuando se est´ a ejecutando un programa se produce un error. Opciones de la l´ ınea de comandos de XSPIM Cuando se ejecuta el simulador XSPIM desde la l´ ınea de comandos. En primer lugar. las m´ posible pasarle una serie de opciones. es decir.

en el cuadro de di´ ´ ste realiza dos acciones: Cuando cargamos un programa en el simulador. e ensambla el c´ odigo fuente generando c´ odigo m´ aquina y carga en memoria el c´ odigo m´ aquina generado. En el ejecuci´ on. Es decir.1. Normalmente no se deber´ a cambiar la que aparece por defecto (0x0040 0000). Deber´ a utilizarse cuando se desee simular la gesti´ on de dispositivos de E/S. si se quiere realizar un programa en ensamblador. se cargar´ a el c´ odigo m´ aquina correspondiente a nuestro programa. el c´ odigo m´ aquina generado se cargar´ a en memoria a partir de la direcci´ on 0x0040 0024. 1. Este c´ odi´ l. Para cada una de las opciones anteriores existen otras que sirven justamente para lo contrario. se ha considerado oportuno no detallarlas. 1.1. Por regla general. Una vez el programa ha sido cargado en el simulador.4.1. Para ejecutar el programa se deber´ a pulsar el bot´ on ¢run ¡ cuadro de di´ alogo que aparece despu´ es de pulsar este bot´ on se puede cambiar la direcci´ on de comienzo de la ejecuci´ on (en hexadecimal). el simulador carga de forma autom´ atica una rutina de captura de odigo excepciones (ver Secci´ on 1. por defecto. Una vez creado. especificar su nombre. Si se ha ejecutado XSPIM con la opci´ on -notrap (ver Secci´ on 1. Esto es as´ ı ya que.1. Parte de dicha rutina la constituye un c´ de inicio (startup code) encargado de llamar a nuestro programa.2) no se cargar´ a el c´ odigo de inicio comentado anteriormente y el c´ odigo m´ aquina correspondiente a nuestro programa estar´ a almacenado a partir de la direcci´ on 0x0040 0000. est´ a listo para su £   .1. se puede utilizar el comando man xspim para consultar el resto de opciones (en el Ap´ endice A se muestra la salida de dicho comando).1.3. Depuraci´ on de programas Cuando se desarrolla un programa se pueden cometer distintos tipos de ´ stos es el cometido al teclear de forma incorrecerrores. en go de inicio comienza en la direcci´ on 0x0040 0000 y justo detr´ as de e la direcci´ on 0x0040 0024. Carga y ejecuci´ on de programas Los ficheros de entrada de XSPIM son ficheros de texto. basta con crear un fichero de texto con un editor de textos cualquiera. Puesto que estas otras son las que est´ an activadas por defecto. para cargarlo en el simulador debemos pulsar el bot´ on £   alogo que aparezca. El m´ as com´ un de e . Descripci´ on del simulador SPIM 11 -mapped io: Sirve para habilitar los dispositivos de E/S mapeados en memoria. ¢load ¡y.2). De todas formas.

se tienen dos opciones. El simulador XSPIM proporciona dos herramientas de depuraci´ on: la ejecuci´ on paso a paso del c´ odigo y la utilizaci´ on de puntos de ruptura (breakpoints). Este tipo de errores reciben el ci´ on 1. Puede que el c´ odigo m´ aquina realice alguna acci´ on no permitida. Es ning´ un problema) y sin embargo el programa no haga lo que se espera de e ´ til disponer de herramientas que ayuden a depurar en estos casos cuando es u el c´ odigo. por ejemplo. como.12 Introducci´ on al simulador SPIM ta alguna parte del c´ odigo. aparece un cuadro de di´ alogo que permite especificar el n´ umero de pasos que se deben ejecutar (cada paso corresponde a una instruc¤ § ci´ on m´ aquina). si se crea un punto de ruptura £   . el que un c´ odigo sea sint´ acticamente correcto no garantiza que est´ e libre de errores. acceder a una direcci´ on de memoria no v´ alida. § ¤ La ejecuci´ on paso a paso se realiza utilizando el bot´ on ¦ step ¥ (en lugar £   del bot´ on ¢run ¡que provoca una ejecuci´ on completa del programa). En este caso. Como segunda opci´ on. La mayor´ ıa de estos errores son detectados por el ensamblador en el proceso de carga del fichero fuente y el ensamblador avisa de estos errores en el panel de mensajes tal y como se describi´ o en la Secaciles de corregir. En ese momento se detendr´ a la ejecuci´ on y la instrucci´ on m´ aquina almacenada en la posici´ on 0x0040 0024 no se ejecutar´ a. Por ejemplo. Utilizando estas herramientas. los errores no se producir´ an durante el ensamblado sino durante la ejecuci´ on del c´ odigo. Cuando se quiera reanudar £   ıa continuar la ejecuci´ on bastar´ a con pulsar de nuevo el bot´ on ¢run ¡(o se podr´ .1. Por tanto.1. La otra herramienta disponible permite indicar en qu´ e posiciones de memoria se quiere que se detenga la ejecuci´ on de programa. Estas paradas reciben el nombre de puntos de ruptura. se podr´ a ejecutar el programa por partes y comprobar si cada una de las partes hace lo que se espera de ellas. Esto permite observar el contenido de la memoria y los registros y se podr´ ıa comprobar si realmente es el esperado. Si se pulsa el bot´ on ¦ step ¥ (dentro de este cuadro de di´ alogo) se ejecutar´ an tantas instrucciones como se hayan indicado.1 se puede ver la informaci´ on mostrada en este caso en el panel de mensajes. Si es as´ ı. En este caso. esta acci´ on generar´ a una excepci´ on y el simulador avisar´ a de qu´ e instrucci´ on ha generado la excepci´ on y ser´ a f´ acil revisar el c´ odigo fuente y corregir el fallo. Este tipo de errores reciben el nombre de errores en tiempo de ejecuci´ on.1. puede ocurrir que aparentemente no haya errores (porque el fichero fuente se ensambla correctamente y la ejecuci´ on no genera ´ l. son f´ nombre de errores en tiempo de ensamblado. En la Secci´ on 1. se ejecuen la posici´ on de memoria 0x0040 0024 y se pulsa el bot´ on ¢run ¡ tar´ an las instrucciones m´ aquina desde la direcci´ on de comienzo de la ejecuci´ on hasta llegar a la direcci´ on 0x0040 0024. Cuando se pulsa este bot´ on. Sin embargo.

es conveniente que el lector sepa que cada vez que rectifique Por u un fichero fuente tras haber detectado alg´ un error. Para hacerlo. No basta con corregir el fichero fuente. ser´ a necesario volver a cargarlo en el simulador. una vez editado un fichero fuente en el que se han detectado errores se realizar´ an las  siguientes acciones: £ £ ¢clear ¡→ ((memory & registers)) seguido de ¢reload ¡→ ((assembly file)). es decir. teniendo que codificar cada instrucci´ on mediante su secuencia de ceros y unos correspondiente. 1.) Programar en c´ odigo m´ aquina. de instrucciones que forman parte del juego de instrucciones que el procesador es capaz de ejecutar. Cada una de estas instrucciones est´ a representada por medio de ceros y unos en la memoria del computador. Los programas que realizan esta funci´ on reciben el nombre de ensambladores. Un programa en c´ odigo m´ aquina. basta con £   pulsar el bot´ on ¢reload ¡y seleccionar la entrada ((assembly file)). Sintaxis del lenguaje ensamblador del MIPS32 an conociendo m´ as detalles sobre la sintaxis del lenguaje enAunque se ir´ samblador conforme se vaya siguiendo este libro. El c´ odigo m´ aquina es el lenguaje que entiende el procesador. no es m´ as que una secuencia de instrucciones m´ aquina. De todas formas. y los lenguajes de este tipo el de lenguajes ensamblador.2. se debe indicar al simulador que debe volver a cargar dicho fichero. como ya se sabe. es conveniente familiarizarse con algunos conceptos b´ asicos. una representaci´ on m´ as pr´ oxima al programador. aunque sin alejarse demasiado del c´ odigo m´ aquina. es una tarea sumamente ardua y propensa a errores (a menos que el programa tenga tres instrucciones). A continuaci´ on se muestran algunos de los recursos de este tipo proporcionados por el ensamblador del MIPS32 junto con su sintaxis: . Es decir. Proporciona nem´ onicos (nombres f´ aciles de recordar para cada una de las instrucciones m´ aquina) y ofrece una serie de recursos adicionales que aumentan la legibilidad de los programas. El lenguaje ensamblador ofrece por tanto. (Recuerda que en el caso del MIPS32 cada una de estas instrucciones ocupa exactamente 32 bits de memoria. antes de cargar de nuevo el fichero. ´ ltimo. Simplifica la lectura y escritura de programas. Sintaxis del lenguaje ensamblador del MIPS32 § ¤ 13 la ejecuci´ on paso a paso utilizando el bot´ on ¦ step ¥ ). No es de extra˜ nar que surgieran r´ apidamente programas capaces de leer instrucciones escritas en un lenguaje m´ as natural y que pudieran ser f´ acilmente convertidas en instrucciones m´ aquina. es recomendable restaurar el valor   £ inicial de los registros y de la memoria pulsando el bot´ on ¢clear ¡y seleccionando la entrada ((memory & registers)).1.2.

es obligado utilizar comentarios que permitan seguir el desarrollo del programa. Para declarar una etiqueta. Las instrucciones y pseudo-instrucciones se consideran palabras reservadas y. por tanto.))). Son palabras reservadas. e recer al comienzo de una l´ ınea y terminar con el car´ acter dos puntos (((:))). no pueden ser utilizadas como identificadores. Identificadores Son secuencias de caracteres alfanum´ ericos. Los n´ umeros en base 10 se ´ ste deber´ escriben tal cual. El comienzo de un comentario se indica por medio del car´ acter almohadilla (((#))): el ensamblador ignorar´ a el resto de la l´ ınea a partir de la almohadilla. Las cadenas de caracteres deben encerrarse entre comillas dobles (”).14 Introducci´ on al simulador SPIM Comentarios Sirven para dejar por escrito qu´ e es lo que est´ a haciendo alguna parte del programa y para mejorar su legibilidad remarcando las partes que lo forman.)). Pseudo-instrucciones El lenguaje ensamblador proporciona instrucciones adicionales que no pertenecen al juego de instrucciones propias del procesador. Se identifican f´ acilmente ya que comienzan con un punto (((. El programa ensamblador se encarga de sustituirlas por aquella secuencia de instrucciones m´ aquina que realizan su funci´ on. Los identificadores pueden ser: Etiquetas Se utilizan para posteriormente poder hacer referencia a la posici´ on o direcci´ on de memoria del elemento definido en la l´ ınea ´ sta debe apaen la que se encuentran. (( )). ((. Entre los literales que pueden utilizarse en un programa en ensamblador est´ an los n´ umeros y las cadenas de caracteres. e a estar precedido por los caracteres ((0x)). y puntos. Su sintaxis es similar a la de las instrucciones del procesador. Es posible utilizar caracteres especiales en las cadenas siguiendo la convenci´ on empleada por el lenguaje de programaci´ on C: Salto de l´ ınea: \n Tabulador: \t . guiones bajos. Para expresar un valor en hexadecimal. que no comienzan con un n´ umero. que el ensamblador reconoce. cuando se programa en ensamblador. Permiten una programaci´ on m´ as clara. Si comentar un programa escrito en un lenguaje de alto nivel se considera una buena pr´ actica de programaci´ on. Directivas Sirven para informar al ensamblador sobre c´ omo debe interpretarse el c´ odigo fuente.

.. es el registro $t0? ((lw $t0 . ¿qu´ e valor tiene el registro $t0 despu´ es de ejecutar el programa? ... . . . identifica y se˜ nala ´ l..... . . ... .. . . .. EJERCICIOS .. .. . . d a t o ( $0 ) # Carga e l c o n t e n i d o de M[ d a t o ] en $ t 0 · 2 Crea un fichero con el programa anterior... En cual £   ´ ¢run ¡ ´ caso contrario.... .. . ... ¿qu´ · 3 Ejecuta el programa anterior.. . . directivas y comentarios que aparecen en e  introsim. . . .... .. . del $0 al $31. . . ... . .word 3 # I n i c i a l i z a una p a l a b r a con e l v a l o r 3 main : . Problemas del cap´ ıtulo . .. fichero ya que XSPIM no la ensamblara El programa debe tener una etiqueta ((main)) que indique ´ es la primera instruccion ´ que debe ser ejecutada.....data .. . . . . ..3. .. . ... · 1 Dado el siguiente ejemplo de programa ensamblador.. . las etiquetas. . .. . ´ en la ultima No puede haber ninguna instruccion l´ ınea del ´ ´ correctamente.. Problemas del cap´ ıtulo 15 Comilla doble: \" Errores comunes ´ Cuando se escribe el codigo fuente correspondiente a un progra´ a los sima en ensamblador se debe prestar especial atencion guientes puntos: ´ de terminar con una l´ El fichero fuente habra ınea en blanco..... .1.. . . . ... 1.text lw $ t 0 . .. . .. .... y el codigo ´ la ´ de inicio llegue a la instruccion (( jal main)). .. . se detendra ´ ejecucion.. .. .s 1 2 3 4 5 dato : .3.. . .... dato($0)))?. .. . . . . ... .. ¿en qu´ e direcci´ on de memoria se ha almacenado la instrucci´ on e registro.. cuando se pulse el boton . .. .. .. c´ argalo en el simulador y responde a las siguientes preguntas: ¿en qu´ e direcci´ on de memoria se ha almacenado el 3?.

.

. . . . . 2. . . .1. 2. . 2 17 19 20 21 21 22 DATOS EN MEMORIA Pr´ acticamente cualquier programa de computador requiere de datos para llevar a cabo su tarea.2. . . 2. Declaraci´ on de palabras en memoria Declaraci´ on de bytes en memoria . Al programar en un lenguaje de alto nivel se utilizan variables de diversos tipos. . 2. . . Alineaci´ on de datos en memoria . . . . . . . 2. .data )) y ((. . . . . . Por regla general. . . . . . . . . . . . Declaraci´ on de cadenas de caracteres Reserva de espacio en memoria . . . . . Problemas del cap´ ıtulo .4. En este cap´ ıtulo se ver´ a c´ omo indicar qu´ e posiciones de memoria se deben utilizar para las variables de un programa y c´ omo se pueden inicializar dichas posiciones de memoria con un determinado valor. . . . . . . . . . . Es el compilador (o el int´ erprete seg´ un sea el caso) quien se encarga de decidir en qu´ e posiciones de memoria se almacenar´ an las estructuras de datos requeridas por el programa. .CAP´ ITULO ´ Indice 2. . . . . . Declaraci´ on de palabras en memoria En este apartado se ver´ an las directivas (( . . . .3. .6. . . . . . . . .5. Como punto de partida se considera el siguiente ejemplo: 17 . . . . .1. . estos datos son almacenados en la memoria del computador. 2.word)). . . . .

En el caso del MIPS32. su direccion multiplo de 4. por ejemplo los caracteres ASCII. cada direccion ´ de memoria ocupada por un byte. para poder leer o escri´ ´ de memoria debera ´ ser bir una palabra en memoria. palabras y medias palabras Los computadores basados en el procesador MIPS32 pueden ac´ de ceder a la memoria a nivel de byte. Sin embargo. (( . ´  datos-palabras.s 1 2 3 . la transferencia de informacion ´ sobre que ´ direcarquitectura del MIPS32 impone una restriccion ciones de memoria pueden ser utilizadas para acceder a una palabra: deben ser multiplos de 4. la direccion multiplo de 2.data # c o m i e n z o de l a z o n a de d a t o s p a l a b r a 1 : .e. una palabra equivale a 4 bytes. no ´ que un byte por dato. memoria indica la posicion Algunos tipos de datos. que estan madas por 2 bytes. Todo ˜ del procesador tiene en cuenta este tamano ˜ de palabra: el diseno ˜ de 4 bytes y el bus de entre otros. si se quisiede expresion ra trabajar con numeros enteros habr´ ıa que contentarse con los ´ numeros del −128 al 127). tambien ´ Por ultimo. ´ ´ de acceder a bytes y a palabras. la capacidad requieren mas ´ de un byte es bastante reducida (p. Esto es. Es decir.word 0 x15 # r e p r e s e n t a c i o ´ n hexadecimal del dato El anterior ejemplo no acaba de ser realmente un programa ya que no contiene instrucciones en lenguaje ensamblador que deban ser ejecutadas por el procesador. La primera de las directivas utilizadas. Cuando se utiliza la directiva (( . se utiliza para avisar al ensamblador de que todo lo que aparezca debajo de ella (mientras no se diga lo contrario) debe ser almacenado en la zona de datos y la direcci´ on en la que deben comenzar a almacenarse. Para indicar otra direcci´ on de comienzo de los datos se debe utilizar la directiva en la forma .word 15 # representacio ´ n decimal del dato p a l a b r a 2 : .18 Datos en memoria Bytes.data )) sin argumentos (tal y como est´ a en el ejemplo) se utilizar´ a como direcci´ on de comienzo de los datos el valor por defecto 0x1001 0000. Esta unidad superior suele recibir el nombre de palabra (word ). utiliza una serie de directivas que le indican al ensamblador (a SPIM) qu´ e informaci´ on debe almacenar en memoria y d´ onde. Sin embargo.data )). Por ello. Para aumentar el rendimiento del procesador facilitando la ´ entre el procesador y la memoria. ademas ´ ´ fores posible acceder a medias palabras (half-words). los registros tienen un tamano datos consta de 32 l´ ıneas. la mayor´ ıa de computadores ´ trabajan de forma habitual con unidades superiores al byte. De forma similar a lo comentado para las pa´ de memoria de una media palabra debe ser labras.

...word 15)). ... .. .word 1 5 . . ·5 ·6 ·7 1 2 ¿En qu´ e direcciones se han almacenado las dos palabras? ¿Por qu´ e? ¿Qu´ e valores toman las etiquetas (( palabra1 )) y (( palabra2 ))? Crea ahora otro fichero con el siguiente c´ odigo:  datos-palabras2. . . .. un byte... .word))? .. . £   2......s . .. . .. . ... . · 9 Modifica el c´ odigo anterior para intentar que el vector comience en la direcci´ on de memoria 0x1000 0002 ¿En qu´ e direcci´ on comienza realmente? ¿Por qu´ e? ¿Crees que tiene algo que ver la directiva ((. . .2. asociado a la etiqueta vector.... . . 30.byte DATO)) inicializa una posici´ on de memoria. .. 0x20 y 60. · 4 Encuentra los datos almacenados en memoria por el programa anterior: localiza dichos datos en la zona de visualizaci´ on de datos e indica su valor en hexadecimal.. .. .. .... . La siguiente... d a t a 0 x10010000 # c o m i e n z o de l a z o n a de d a t o s p a l a b r a s : .. 0 x15 # en d e c i m a l y en h e x a d e c i m a l Borra los valores de la memoria utilizando el bot´ on ¢clear ¡y carga el nuevo fichero.. . EJERCICIOS . .. . . 0x34.. ...word)).data ))). . . se deber´ ıa utilizar la directiva (( . .. .... ..data 0x10010020)). la ((. . almacenar´ a el n´ umero 15 en la posici´ on 0x1001 0000 (por ser la primera despu´ es de la directiva (( .. Por ejemplo.. Declaraci´ on de bytes en memoria 19 (( . .. . . .. es decir. si se quisiera que los datos comenzaran en la posici´ on 0x1001 0020. Volviendo al programa anterior.. . . .. .2.. . Crea el fichero anterior. . . ... .. . . las dos siguientes l´ ıneas utilizan la directiva ((. La primera de las dos. . . ... Declaraci´ on de bytes en memoria La directiva (( . . .. . ..2...word 0x15)) almacenar´ a el valor 0x15 en la siguiente posici´ on de memoria no ocupada.... ... ¿Se observa alguna diferencia en los valores almacenados en memoria respecto a los almacenados por el programa anterior? ¿Est´ an en el mismo sitio? · 8 Crea un programa en ensamblador que defina un vector de cinco palabras (words). ...data DIR))... . . c´ argalo en el simulador y resuelve los siguientes ejercicios. Esta directiva sirve para almacenar una palabra en memoria. que comience en la direcci´ on 0x1000 0000 y que tenga los siguientes valores 0x10. . con el contenido DATO.. . . la ((. .. . . C´ argalo en el simulador y comprueba que se ha almacenado de forma correcta en memoria.

a s c i i ” abcde ” # d e c l a r a c i o ´ n de l a c a d e n a . . .. .. . . .. . . . .. 0 x30 . . .. . .word 0 x10203040 # d a t o en h e x a d e c i m a l · 12 ¿Qu´ e valores se han almacenado en memoria? · 13 Viendo c´ omo se ha almacenado la secuencia de bytes y la palabra.. .byte 0 xff · 15 ¿Qu´ e rango de posiciones de memoria se han reservado para la variable etiquetada con ((cadena))? . EJERCICIOS ... . . .. EJERCICIOS ... . . ....20 Datos en memoria . .. .. . .. . . . .. . . . . .s 1 2 3 cadena : octeto : .. . big-endian o little-endian. .. .. . . ..data . ... . . .. utiliza el simulador? ¿Por qu´ e? · 14 ¿Qu´ e valores toman las etiquetas (( palabra1 )) y (( palabra2 ))? . .. . . . . . .. . . ... . .data . . .. . . . .. . ..... ... . .. . Limpia el contenido de la memoria y carga el siguiente c´ odigo en el simulador:  datos-cadena.. .. ¿qu´ e tipo de organizaci´ on de los datos. .s 1 2 octeto : .. .. . . . . . .. . . ... .. . ... . . Declaraci´ on de cadenas de caracteres La directiva (( .. 0 x20 . .ascii ”cadena”)) le indica al ensamblador que debe almacenar los c´ odigos ASCII de los caracteres que componen la cadena entrecomillada.. . . . . . .. .. . .. ... . b y t e 0 x15 # c o m i e n z o de l a z o n a de d a t o s # DATO e x p r e s a d o en h e x a d e c i m a l · 10 · 11 ¿Qu´ e direcci´ on de memoria se ha inicializado con el valor 0x15? ¿Qu´ e valor posee la palabra que contiene el byte? Limpia el contenido de la memoria y carga el siguiente c´ odigo en el simulador:  datos-byte-palabra.. . . . .. . b y t e 0 x10 .. . . .s 1 2 3 . Limpia el contenido de la memoria y carga el siguiente c´ odigo en el simulador:  datos-byte. . . 2. ...... .. . . . . . .. . . ..3. . . . . . de un byte cada una. .. 0 x40 # d a t o s en h e x a d e c i m a l p a l a b r a 2 : . . . .. . Dichos c´ odigos se almacenan en posiciones consecutivas de memoria.. .data # c o m i e n z o z o n a de d a t o s p a l a b r a 1 : . . .

word 10 · 20 ¿Qu´ e posiciones de memoria se han reservado para almacenar la variable (( espacio ))? · 21 ¿Los cuatro bytes utilizados por la variable (( espacio )) podr´ ıan ser le´ ıdos o escritos como si fueran una palabra? ¿Por qu´ e? · 22 ¿A partir de qu´ e direcci´ on se ha inicializado ((byte1))? ¿Y ((byte2))? · 23 ¿A partir de qu´ e direcci´ on se ha inicializado (( palabra ))? ¿Por qu´ e ha hecho esto el ensamblador? ¿Por qu´ e no ha utilizado la siguiente posici´ on de memoria sin m´ as? .. .... ... . ... . ..space N)) sirve para reservar N bytes de memoria e inicializarlos a 0... ... .... ..... ..2. .... .asciiz ”cadena”)) tambi´ en sirve para declarar cadenas... ... .. . .. . . . ........ . ....... . .. b y t e 0 x20 ..5... .. . . ..... 2.. . .4. .. ... ... ... .. Dado el siguiente c´ odigo:  datos-space... . .. . ..asciiz )) en lugar de (( ...... ... .. .. Reserva de espacio en memoria La directiva (( .. . .. . ¿Hay alguna diferencia en el contenido de la memoria utilizada? ¿Cu´ al? Describe cu´ al es la funci´ on de esta directiva y qu´ e utilidad tiene. .data .... Alineaci´ on de datos en memoria La directiva (( . . . . . ..space 4 . Reserva de espacio en memoria 21 · 16 · 17 · 18 ¿Cu´ al es el c´ odigo ASCII de la letra ((a))? ¿Y el de la ((b))? ¿A qu´ e posici´ on de memoria hace referencia la etiqueta (( octeto ))? ¿Cu´ antos bytes se han reservado en total? ¿Y cu´ antas palabras? · 19 La directiva (( .. Modifica el programa anterior para que utilice (( . .. ... EJERCICIOS . ........align N)) le indica al ensamblador que el siguiente dato debe ser almacenado en una direcci´ on de memoria que sea m´ ultiplo de 2n . . ..s 1 2 3 4 5 byte1 : espacio : byte2 : palabra : ...... ... . .... ...... b y t e 0 x10 ... ......... .ascii ))....... ..... .. ..... ... . 2...4... .

. .word 10 · 24 ¿Qu´ e posiciones de memoria se han reservado para almacenar la variable (( espacio ))? Compara la respuesta con la obtenida en el ejercicio 20. . 2.. .align 2 . . .. de 20 palabras cada uno a partir de la direcci´ on 0x1000 0000. ... EJERCICIOS . . . ....word)) (Pista: Comienza utilizando s´ olo la directiva (( . .. y un byte con el valor 20. . .. .data . .space 4 .. . .. A y B. .. .22 Datos en memoria . ...align 2))? .. . . . . .. . Problemas del cap´ ıtulo .. .. . · 29 Desarrolla un programa ensamblador que inicialice.. . . . . ... un byte y otra palabra alineada en una direcci´ on m´ ultiplo de 4. . .. . .. . . b y t e 0 x10 . .. b y t e 0 x20 . . ..ascii )) b) La directiva (( . .. .. Dado el siguiente c´ odigo:  datos-align. .byte )) c) La directiva ((. . . . . . . · 25 ¿Los cuatro bytes utilizados por la variable (( espacio )) podr´ ıan ser le´ ıdos o escritos como si fueran una palabra? ¿Por qu´ e? ¿Qu´ e es lo que ha hecho la directiva (( . . · 27 Desarrolla un programa ensamblador que realice la siguiente reserva de espacio en memoria a partir de la direcci´ on 0x1000 1000: una palabra. . . . . . . ... . . . en el espacio de datos. ... EJERCICIOS . .. ... . .. . . . . . .. . ....s 1 2 3 4 5 6 byte1 : espacio : byte2 : palabra : . .. .) . . · 26 Desarrolla un programa ensamblador que reserve espacio para dos vectores consecutivos. . ...ascii )) y visualiza c´ omo se almacena en memoria la cadena para obtener la secuencia de bytes... .. ..... . . un byte con el valor 0x10.. .. . . . .. .. . . . . . . .. ...6. . . . . .. · 28 Desarrolla un programa ensamblador que realice la siguiente reserva de espacio e inicializaci´ on de memoria: una palabra con el valor 3. . . . . . . . . .. . .. . . . .. la cadena de caracteres ((Esto es un problema)). . . ... ... utilizando: a) La directiva (( . . . . . una reserva de 4 bytes que comience en una direcci´ on m´ ultiplo de 4... .... . . .

.........6.. la matriz A de enteros definida como: 1 2 3   A =  4 5 6 ............................ desarrolla un programa ensamblador que inicialice en la memoria.2...... 7 8 9 suponiendo que: a) La matriz A se almacena por filas (los elementos de una misma fila se almacenan de forma contigua en memoria).... a partir de la direcci´ on 0x1001 0000...   ..... b) La matriz A se almacena por columnas (los elementos de una misma columna se almacenan de forma contigua en memoria). Problemas del cap´ ıtulo 23 · 30 Sabiendo que un entero ocupa una palabra....... .............

.

. . .4.3. .1. . 3. .CAP´ ITULO ´ Indice 3. Carga de bytes (de memoria a registro) . . . 3. . Esto es. . . Para la carga de datos en registros se pueden utilizar los modos de direccionamiento inmediato y directo a memoria. . Para el almacenamiento de datos ´ nicamente el modo de direccionamiento directo a memoria. . . . 3. . en memoria u En la primera secci´ on se ver´ an las instrucciones de carga de datos inmediatos. en memoria. . . . Almacenamiento de palabras (de registro a memoria) . . . si fuera el caso. . . . . . Las restantes secciones est´ an dedicadas a las instrucciones de carga y almacenamiento en memoria. Carga de palabras (de memoria a registro) . . . . . . . . . . Almacenamiento de bytes (bytes de registro a memoria) Problemas del cap´ ıtulo . . 25 . los operandos deben estar en registros para poder operar con ellos ya que el juego de instrucciones no incluye instrucciones que puedan operar directamente con operandos en memoria. . 3 26 29 30 31 32 33 C ARGA Y ALMACENAMIENTO El estilo del juego de instrucciones del MIPS32 es del tipo carga/almacenamiento (load/store). . .6.5. . Por tanto. Carga de datos inmediatos (constantes) . . 3. 3. para realizar una operaci´ on con datos en memoria se deben cargar dichos datos en registros. . . . . . . realizar la operaci´ on y finalmente almacenar el resultado.2.

. . De igual forma. . . . . . Es decir. Si ´ ´ de cono se especifica el parametro opcional ((DIR)). . . pera de e . 0x8690)) e indica: a) La direcci´ on de memoria en la que se encuentra. · 32 Ejecuta el programa y comprueba que realmente realiza lo que se es´ l.text [DIR])))) on (( lui )) (del ingl´ La instrucci´ es load upper inmediate) almacena la media palabra indicada por el dato inmediato de 16 bits. . . · 31 Carga el anterior programa en el simulador. . . . . en el ejemplo 0x8690. .26 Carga y almacenamiento 3. . localiza en la zona de visualizaci´ on de c´ odigo la instrucci´ on (( lui $s0. . . . la direccion ´ la 0x0040 0024 (que es la primera posicion ´ de memienzo sera ´ del programa cargador que comienza moria libre a continuacion ´ 0x0040 0000). . . . . . . 0 x8690 # Zona de i n s t r u c c i o n e s Como se ha visto en el cap´ ıtulo anterior. . . . . . . . en la direccion Directiva (((( .s 1 2 main : . .text l u i $s0 . . . . Se comienza viendo un programa de ejemplo con la instrucci´ on (( lui )):  carga-lui. . . b) El tama˜ no que ocupa. . . en la parte alta del registro especificado. . . y (( la )) que cargan un dato inmediato de 32 bits y una direcci´ respectivamente.1. . d) El formato de instrucci´ on empleado. c) La representaci´ on de la instrucci´ on en c´ odigo m´ aquina.text [DIR])) se tiene que utilizar para indicar el comienzo de la zona de memoria dedicada a instrucciones. . en este caso $s0. despu´ es de la ejecuci´ on del programa anterior. . . . . . . e) El valor de cada uno de los campos de dicha instrucci´ on. . . la directiva ((. . el contenido del registro $s0 ser´ a 0x8690 0000. . adem´ as. . . . Carga de datos inmediatos (constantes) En esta secci´ on se ver´ a la instrucci´ on (( lui )) que carga un dato inmediato en los 16 bits de mayor peso de un registro y las pseudo-instrucciones (( li )) on de memoria. la directiva (( . y. escribe el valor 0 en la media palabra de menor peso de dicho registro. . . . .data [DIR])) se utiliza para indicar el comienzo de una zona de datos. . . . . EJERCICIOS .

. .. . .... .. .... . 0 x1234 # Zona de i n s t r u c c i o n e s ..text l i $s0 .. La soluci´ on consiste en utilizar dos instrucciones: la primera de ellas ser´ ıa ıan los 16 bits de mayor peso del la instrucci´ on (( lui )) en la que se especificar´ dato de 32 bits. . . 0x8690))? b) ¿Qu´ e valor contiene $s0 despu´ es de ejecutar (( ori $s0. .. no se podr´ ıa utilizar ninguna de las instrucciones del juego de instrucciones del MIPS32 ya que todas ellas son de 32 bits y no se podr´ ıa ocupar toda la instrucci´ on con el dato que se desea cargar. $s0.. .. . . . ..... ... . ¿Qu´ e valor tiene el registro $s0 despu´ es de la ejecuci´ on? .. .. . ... .. ... . ... . $s0 . ... . . .... no se podr´ ıa utilizar la instrucci´ on (( lui )). . .. . .1.. .. .. . . ... instrucci´ on para ello: la pseudo-instrucci´ on (( li )) (del ingl´ Se va a ver un ejemplo que utiliza dicha pseudoinstrucci´ on:  carga-li. ..... ....... 0 x12345678 # Zona de i n s t r u c c i o n e s .3. En el caso de que se quisiera cargar un dato inmediato de 32 bits en un registro.. . .. . la segunda de las instrucciones ser´ ıa una instrucci´ on (( ori )) que servir´ ıa para cargar los 16 bits de menor peso respetando los 16 bits de mayor peso ya cargados.. · 34 Carga y ejecuta el programa anterior. ...s 1 2 3 main : .. . .. . .. Por el momento. ......... La instrucci´ on (( ori )) se ver´ a con m´ as detalle en el siguiente cap´ ıtulo. . . . .. .. .... . ... . . . ... . . . Un programa que har´ ıa esto ser´ ıa el siguiente:  carga-lui-ori. . ... ... . ... . EJERCICIOS .. . . .. . ejecuta paso a paso el programa y responde a las siguientes preguntas: a) ¿Qu´ e valor contiene $s0 despu´ es de ejecutar (( lui $s0. Se supone que se quiere cargar el dato inmediato 0x8690 1234 en el registro $s0. · 33 Carga el programa anterior en el simulador. 0x1234))? . .. .. ... . .. .. . . .. .... De hecho. . . . .... . . .. .. ..... .. . ....... . . 0 x8690 o r i $s0 . .. .. ... .... s´ olo interesa saber que se puede utilizar en conjunci´ on con (( lui )) para cargar un dato inmediato de 32 bits en un registro. ......s 1 2 main : ..text l u i $s0 . .. . . . . .. Carga de datos inmediatos (constantes) 27 .. ... . .... EJERCICIOS . Puesto que cargar una constante de 32 bits en un registro es una operaci´ on bastante frecuente. . . . . .. . . ... . .. . . . . el ensamblador del MIPS proporciona una pseudoes load inmediate).. ... .. .. .

.... ..... . . .s 1 2 3 4 5 6 7 8 . .. EJERCICIOS .... .word 0 x10 p a l a b r a 2 : .......word 0 x20 .. . . . . .... .. El siguiente programa contiene varias pseudo-instrucciones (( la )):  carga-la.. Examina la zona de visualizaci´ on de c´ odigo y localiza las instrucciones m´ aquina generadas por el ensamblador. . . . palabra1 ))? b) ¿Y para la instrucci´ on (( la $s1. es m´ as c´ omodo utilizar la etiqueta que previamente se haya asociado a dicha direcci´ on de memoria y dejar que el ensamblador haga el trabajo sucio. . p a l a b r a 1 l a $s1 . .. . ... .. . .. . . .. ´ ltima pseudo-instrucci´ La u on que queda por ver en esta secci´ on es la pseudoinstrucci´ on (( la )) (del ingl´ es load address). . .. .. .. .. . .... . .. p a l a b r a 2 l a $s2 . . .. .28 Carga y almacenamiento · 35 Puesto que (( li )) es una pseudo-instrucci´ on. · 36 Carga el anterior programa en el simulador y contesta a las siguientes preguntas: a) ¿Qu´ e instrucci´ on o instrucciones m´ aquina genera el ensamblador para resolver la instrucci´ on (( la $s0. . .text l a $s0 . . Hasta ahora se ha visto la instrucci´ on (( lui )) y la pseudo-instrucci´ on (( li )) que permiten cargar un dato inmediato en un registro.. . ...... 0 x10010004 # Zona de d a t o s # Zona de i n s t r u c c i o n e s main : . . ... . 0x10010004))? · 37 Ejecuta el programa anterior y responde a las siguientes preguntas: a) ¿Qu´ e valor hay en el registro $s0? b) ¿Y en el registro $s1? c) ¿Y en el registro $s2? . el ensamblador ha tenido que sustituirla por instrucciones m´ aquina equivalentes. . ... .. palabra2 ))? c) ¿Y para la instrucci´ on (( la $s2... Pese a que se podr´ ıa utilizar una constante para especificar la direcci´ on de memoria del dato. ... . .. .data p a l a b r a 1 : .. .. .. .. .. ... . Esta pseudo-instrucci´ on permite cargar la direcci´ on de un dato en un registro. . .... . Ambas sirven para especificar en el programa el valor constante que se desea cargar en el registro. ... . . .. ..

.. . Puesto que la etiqueta (( palabra )) se refiere a la posici´ on de memoria 0x1001 0000 y el contenido del registro $0 es 0. . . . . salvo por el hecho de que almacenan el resultado en un registro distinto.. · 40 Explica c´ omo se obtiene a partir de esas instrucciones la direcci´ on de palabra.. .. c´ argalo en el simulador y contesta a las siguientes preguntas. . . . .. . · 42 ¿Qu´ e hay en el registro $s0 antes de ejecutar el programa? Ejecuta el programa. . .3... . . . ...... .. . .... palabra ($0))). la direcci´ on de memoria de la que se leer´ a la palabra ser´ a la 0x1001 0000. ¿Por qu´ e traduce el simulador de esta forma la instrucci´ on original? · 41 Indica el formato de cada una de las instrucciones generadas y los campos que las forman.. . . . .. ¿qu´ e ventaja proporciona utilizar la instrucci´ on (( la $s1. .. ¿Qu´ e contenido tiene ahora el registro $s0? . 0x10010004))? . palabra2 )) como la instrucci´ on (( la $s2. . . .. . . EJERCICIOS .. · 39 Localiza la instrucci´ on en la zona de instrucciones e indica c´ omo ha transformado dicha instrucci´ on el simulador. ... . . . Inm(rs) )) (del ingl´ es load word). .. la instrucci´ on ((lw $s0. ..text lw $s0 .... . .2. . . Dicha instrucci´ on lee una palabra de la posici´ on de memoria indicada por la suma de un dato inmediato (((Inm))) y el contenido de un registro ((( rs ))) y la carga en el registro indicado ((( rt ))). .data .... . 0x10010004)) realizan la misma acci´ on... .... . . . . Crea un fichero con el c´ odigo anterior... .. . ......word 0 x10203040 .. p a l a b r a ( $0 ) # Zona de d a t o s main : # Zona de i n s t r u c c i o n e s # $ s0< − M[ p a l a b r a ] En el programa anterior. . Veamos un ejemplo:  carga-lw... .... .. .. .. 3. .. ... Carga de palabras (de memoria a registro) 29 · 38 Visto que tanto la instrucci´ on (( la $s1. . .. palabra2 )) en lugar de (( la $s2.... se utiliza para cargar en el registro $s0 la palabra contenida en la direcci´ on de memoria indicada por la suma de la etiqueta (( palabra )) y el contenido del registro $0.s 1 2 3 4 5 palabra : .. .. .. Carga de palabras (de memoria a registro) Para cargar una palabra de memoria a registro se utiliza la siguiente instrucci´ on ((lw rt .. .. ... .2. ...

30

Carga y almacenamiento

· 43 Antes se ha visto una pseudo-instrucci´ on que permite cargar la direcci´ on de un dato en un registro. Modifica el programa original para que utilizando esta pseudo-instrucci´ on haga la misma tarea. Comprueba qu´ e conjunto de instrucciones sustituyen a la pseudo-instrucci´ on utilizada una vez el programa ha sido cargado en la memoria del simulador. · 44 Modifica el c´ odigo para que en lugar de transferir la palabra contenida en la direcci´ on de memoria referenciada por la etiqueta (( palabra )), se transfiera la palabra que est´ a contenida en la direcci´ on referenciada por (( palabra +1)). Al intentar ejecutarlo se ver´ a que no es posible. ¿Por qu´ e no? ......................................................................

3.3.

Carga de bytes (de memoria a registro)

La instrucci´ on (( lb rt , Inm(rs) )) (del ingl´ es load byte) carga un byte de memoria y lo almacena en el registro indicado. Al igual que en la instrucci´ on ((lw)), la direcci´ on de memoria se obtiene sumando un dato inmediato (Inm) y el contenido de un registro (rs). Veamos un programa de ejemplo:  carga-lb.s
1 2 3 4 5 6 7 octeto : otro : .data . b y t e 0 xf3 . b y t e 0 x20 .text l b $s0 , o c t e t o ( $0 ) l b $s1 , o t r o ( $0 ) # Zona de d a t o s

main :

# Zona de i n s t r u c c i o n e s # $ s0< − M[ o c t e t o ] # $ s1< − M[ o t r o ]

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 45 Carga el programa anterior en el simulador y localiza las dos instrucciones (( lb )) ¿Qu´ e instrucciones m´ aquina ha puesto el ensamblador en lugar de cada una de ellas? on de datos, ¿qu´ e valor contiene la pala· 46 Observa la zona de visualizaci´ bra 0x1001 0000? · 47 Ejecuta el programa y responde a las siguientes preguntas:

a) ¿Qu´ e valor contiene el registro $s0 en hexadecimal? b) ¿Qu´ e valor contiene el registro $s1 en hexadecimal? c) ¿Qu´ e entero representa 0xf3 en complemento a 2 con 8 bits? d) ¿Qu´ e entero representa 0xffff fff3 en complemento a 2 con 32 bits?

3.4. Almacenamiento de palabras (de registro a memoria)

31

e) ¿Por qu´ e al cargar un byte de memoria en un registro se modifica el registro entero? (Pista: Piensa en lo que se querr´ ıa hacer despu´ es con el registro.) ...................................................................... La instrucci´ on (( lb )) carga un byte de memoria en un registro manteniendo ´ til si el dato almacenado en el byte de memoria es efectivasu signo. Esto es u mente un n´ umero entero pero no en otro caso. Por ejemplo, si se trata de un n´ umero natural (de 0 a 255) o de la representaci´ on en c´ odigo ASCII (extendido) de un car´ acter. Cuando se quiera cargar un byte sin tener en cuenta su posible signo se utilizar´ a la instrucci´ on ((lbu rt , Inm(rs) )). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 48 Reemplaza en el programa anterior las instrucciones (( lb )) por instrucciones ((lbu)) y ejecuta el nuevo programa. a) ¿Qu´ e valor hay ahora en $s0? ¿Ha cambiado este valor con respecto al obtenido en el programa original? ¿Por qu´ e? b) ¿Qu´ e valor hay ahora en $s1? ¿Ha cambiado este valor con respecto al obtenido en el programa original? ¿Por qu´ e? Dado el siguiente programa:  carga-lb2.s
1 2 3 4 5 6 7 octeto : otro : .data .word 0 x10203040 . b y t e 0 x20 .text l b $s0 , o c t e t o ( $0 ) l b $s1 , o t r o ( $0 ) # Zona de d a t o s

main :

# Zona de i n s t r u c c i o n e s # $ s0< − M[ o c t e t o ] # $ s1< − M[ o t r o ]

· 49 ¿Cu´ al es el valor del registro $s0 una vez ejecutado? ¿Por qu´ e? ......................................................................

3.4.

Almacenamiento de palabras (de registro a memoria)

Para almacenar una palabra desde un registro a memoria se utiliza la sies store word). Dicha instrucguiente instrucci´ on: ((sw rt , Inm(rs) )) (del ingl´ ci´ on lee la palabra almacenada en el registro indicado ((( rt ))) y la almacena en la posici´ on de memoria indicada por la suma de un dato inmediato (((Inm))) y el contenido de un registro ((( rs ))). Veamos un ejemplo:

32

Carga y almacenamiento 

carga-sw.s
1 2 3 4 5 6 7 8 9 .data p a l a b r a 1 : .word 0 x10203040 palabra2 : .space 4 p a l a b r a 3 : .word 0 x f f f f f f f f .text lw $s0 , p a l a b r a 1 ( $0 ) sw $s0 , p a l a b r a 2 ( $0 ) sw $s0 , p a l a b r a 3 ( $0 ) # Zona de d a t o s

# Zona de i n s t r u c c i o n e s # M[ p a l a b r a 2]<− $ s 0 # M[ p a l a b r a 3]<− $ s 0

main :

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 50 ¿Qu´ e har´ a dicho programa? ¿Qu´ e direcciones de memoria se ver´ an afectadas? ¿Qu´ e valores habr´ an antes y despu´ es de ejecutar el programa? · 51 Carga el programa en el simulador y comprueba que los valores que hay en memoria antes de la ejecuci´ on son los que se hab´ ıan predicho. Ejecuta el programa y comprueba que realmente se han modificado las direcciones de memoria que se han indicado previamente y con los valores predichos. · 52 ¿Qu´ e instrucciones m´ aquina se utilizan en lugar de la siguiente instrucci´ on en ensamblador: ((sw $s0, palabra3 ($0)))? ......................................................................

3.5.

Almacenamiento de bytes (bytes de registro a memoria)

Para almacenar un byte desde un registro a memoria se utiliza la instrucci´ on ((sb rt , Inm(rs) )) (del ingl´ es store byte). Dicha instrucci´ on lee el byte de menor peso almacenado en el registro indicado ((( rt ))) y lo almacena en la posici´ on de memoria indicada por la suma de un dato inmediato (((Inm))) y el contenido de un registro ((( rs ))). Veamos un ejemplo:  carga-sb.s
1 2 3 4 5 6 7 palabra : octeto : .data .word 0 x10203040 .space 2 .text lw $s0 , p a l a b r a ( $0 ) sb $s0 , o c t e t o ( $0 ) # Zona de d a t o s

# Zona de i n s t r u c c i o n e s # M[ o c t e t o ]<− b y t e menor p e s o de $ s 0

main :

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 53 ¿Qu´ e har´ a dicho programa? ¿Qu´ e direcciones de memoria se ver´ an afectadas? ¿Qu´ e valores habr´ an antes y despu´ es de ejecutar el programa?

3.6. Problemas del cap´ ıtulo

33

· 54 Carga el programa en el simulador y comprueba que los valores que hay en memoria antes de la ejecuci´ on son los que se hab´ ıan predicho. Ejecuta el programa y comprueba que realmente se han modificado las direcciones de memoria que se han indicado previamente y con los valores predichos. · 55 Modifica el programa para que el byte sea almacenado en la direcci´ on (( octeto +1)) (basta con cambiar la instrucci´ on ((sb $s0, octeto ($0))) por ((sb $s0, octeto +1($0)))). Comprueba y describe el resultado de este cambio. · 56 Vuelve a modificar el programa para que el byte se almacene en la direcci´ on de memoria (( palabra +3)) en lugar de en (( octeto +1)). ¿Qu´ e valor tiene la palabra almacenada en la direcci´ on 0x1001 0000 despu´ es de la ejecuci´ on? ......................................................................

3.6.

Problemas del cap´ ıtulo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 57 Desarrolla un programa ensamblador que inicialice un vector de enteros, V , definido como V = (10, 20, 25, 500, 3). El vector debe comenzar en la direcci´ on de memoria 0x1000 0000. El programa debe cargar los elementos de dicho vector en los registros $s0 al $s4. · 58 Ampl´ ıa el anterior programa para que adem´ as copie a memoria el vector V comenzando en la direcci´ on 0x1001 0000. (Pista: En un programa ensamblador se pueden utilizar tantas directivas del tipo (( .data )) como sean necesarias.) · 59 Desarrolla un programa ensamblador que dada la siguiente palabra, 0x1020 3040, almacenada en una determinada posici´ on de memoria, la reorganice en otra posici´ on invirtiendo el orden de sus bytes. · 60 Desarrolla un programa ensamblador que dada la siguiente palabra, 0x1020 3040, almacenada en una determinada posici´ on de memoria, la reorganice en la misma posici´ on intercambiando el orden de sus medias palabras. es load half ) y ((sh)) (del ingl´ es save (Nota: las instrucciones (( lh )) (del ingl´ half ) cargan y almacenan medias palabras, respectivamente). · 61 Desarrolla un programa ensamblador que inicialice cuatro bytes a partir de la posici´ on 0x1001 0002 con los valores 0x10, 0x20, 0x30, 0x40 y reserve espacio para una palabra a partir de la direcci´ on 0x1001 0010. El programa debe transferir los cuatro bytes contenidos a partir de la posici´ on 0x1001 0002 a la direcci´ on 0x1001 0010. ......................................................................

CAP´ ITULO
´ Indice
4.1. 4.2. 4.3. 4.4. Operaciones aritm´ eticas . . . . Operaciones l´ ogicas . . . . . . Operaciones de desplazamiento Problemas del cap´ ıtulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4
36 39 41 43

´ TICAS , O PERACIONES ARITM E ´ L OGICAS Y DE DESPLAZAMIENTO

Hasta ahora se ha visto c´ omo se puede indicar en lenguaje ensamblador que se quieren inicializar determinadas posiciones de memoria con determinados valores, c´ omo se pueden cargar estos valores de la memoria a los registros del procesador y c´ omo almacenar en memoria la informaci´ on contenida en los registros. Es decir, ya se sabe c´ omo definir e inicializar las variables de un programa, c´ omo transferir el contenido de dichas variables en memoria a los registros, para as´ ı poder realizar las operaciones oportunas y, finalmente, c´ omo transferir el contenido de los registros a memoria para almacenar el resultado de las operaciones realizadas. Sin embargo, no se han visto cu´ ales son las operaciones que puede reali´ ste y en el siguiente cap´ zar el procesador. En e ıtulo se ver´ an algunas de las operaciones b´ asicas m´ as usuales que puede realizar el procesador. Y las instrucciones que las implementan. 35

y el otro en la propia instrucci´ on. . .... . .. es necesario extender la informaci´ on proporcionada en ((Inm)) de 16 a 32 bits. rs .. . . ... .. . . .  oper-addiu. EJERCICIOS .. . ser´ a necesario en primer lugar. presenta algunas de las instrucciones proporcionadas por el MIPS32 para la realizaci´ on de operaciones aritm´ eticas (suma.. . .. en rs. Puesto que el campo destinado al almacenamiento del n´ umero inmediato es de 16 bits y el operando ha de tener 32 bits.. · 62 Localiza el resultado de la suma. realiza una suma de dos operandos sin signo.. .147.text # Zona de i n s t r u c c i o n e s lw $ t 0 . . el resultado se almacenar´ a en el registro rt. en el campo Inm. cargar el valor que se quiere sumar de la posici´ on de memoria en la que se encuentra.. l´ ogicas y de desplazamiento Este cap´ ıtulo.. .... ... p o s i t i v o r e p r e s e n t a b l e en Ca2 ( 3 2 ) # ( en h e x a d e c i m a l 0 x 7 f f f f f f f ) main : ... carga de nuevo el fichero fuente y vuelve a ejecutarlo (no en modo paso a paso). numero ( $0 ) addiu $ t 1 ... 1)). l´ ogicas (AND y OR) y de desplazamiento de bits (a izquierdas y a derechas.. $ t 0 . . . . resta. .. como su nombre indica. . . ... .. . ..word 2147483647 # Zona de d a t o s # Ma ´ x.1. Operaciones aritm´ eticas Para introducir las operaciones aritm´ eticas que el MIPS32 puede realizar se comienza viendo el siguiente programa que suma un operando almacenado originalmente en memoria y un valor constante proporcionado en la propia instrucci´ on de suma. ¿Cu´ al ha sido? ¿El resultado obtenido es igual a 2. ... . ¿Qu´ e ha ocurrido al efectuar este cambio? ¿Por qu´ e? . .. . 4. se extiende al valor de 32 bits 0xffff fffe (que en binario es 11111111 11111111 11111111 11111110 )... $t0 .. . ... . . . .. . . .. Borra los valores de la memoria.. Esta extensi´ on se realiza en las operaciones aritm´ eticas extendiendo el signo a los 16 bits m´ as significativos.. . Por ejemplo..... ...647 + 1? · 63 Sustituye en el programa anterior la instrucci´ on ((addiu)) por la instrucci´ on ((addi)). .36 Operaciones aritm´ eticas. Uno de los operandos est´ a almacenado en un registro.. . .data . Inm)).. .. . multiplicaci´ on y divisi´ on). a un registro. . ... ... 1 # $ t 1< −$ t 0 +1 La instrucci´ on ((addiu $t1 .s 1 2 3 4 5 6 7 numero : . ... .483. que es del tipo ((addiu rt . . . .. Observa que para realizar la suma. el dato inmediato de 16 bits 0xfffe cuando se utiliza como operando de una operaci´ on aritm´ etica. aritm´ etico o l´ ogico). . .. ... ... ..... . . .. Carga el fichero anterior en el simulador SPIM y ejec´ utalo.. . . .

ya que su rango de ´ suele estar delimitado: tratamiento de cadenas.4. el binario natural. Es decir. las instrucciones del ´ MIPS32 para realizar operaciones aritmeticas sin signo se diferencian de las que operan con signo simplemente en que no generan ´ en el caso de que se produzca un desbordamiento. ´ ´ En la practica. la resta consiste en cambiar el signo del segundo operando y sumar. la implementacion resta es independiente de si los operandos son enteros (representados en Ca2) o no (representados en binario natural). En cuanto a la representacion ´ ´ esde numeros enteros (con signo). correcto. representacion de representacion ´ Cuando esto ocurre. resta y cambio de de implementacion signo: la suma es simplemente la suma binaria de los operandos —da igual el signo de los operandos—. la mayor´ ıa ´ debido a las de procesadores suelen utilizar dicha representacion ventajas que proporciona frente a las otras posibles representaciones de numeros enteros. por tanto. para la deteccion ´ requiere mas ´ bits de los disponibles para su correcta operacion ´ en el metodo ´ ´ correspondiente. Debido a esto. el juego de instruccion ciones del MIPS32 proporciona instrucciones diferenciadas para sumas y restas de operandos con y sin signo. y el cambio de signo ´ de unos por ceros y ceros por unos y sumar 1. calculo ´ aplicacion de posiciones de memoria. As´ ı. como no pod´ ıa ser ´ ´ de otra forma. no es necesario disponer de hardware diferenciado para sumar o restar numeros enteros o positivos. la ´ ((add)) suma el contenido de dos registros y la instrucinstruccion ´ ((addu)) (((u)) de unsigned ) realiza la misma operacion ´ pero cion considerando que los operandos son numeros positivos. ´ de desbordamiento es distinta en funPuesto que la deteccion ´ de si los operandos son con o sin signo. Operaciones aritm´ eticas 37 Operaciones con signo y ((sin signo)) ´ ´ utilizado por el MIPS32 para expreEl metodo de representacion sar los numeros positivos (o sin signo) es. las aplicaciones en las que se utilizan numeros ´ sin signo no suelen generar desbordamientos. ´ ´ se ha de tener en cuenta si los operanDe hecho. .1. tan solo ´ del desbordamiendos son enteros o positivos para la deteccion ´ de si el resultado de la to (overflow ). es decir. el procesador debe generar una excepcion ´ por desbordamiento) que informe de que ha (llamada excepcion ocurrido este error y que el resultado obtenido no es. en la inversion ´ en Ca2 es que Otra de las ventajas de utilizar la representacion ´ de las operaciones de suma y de este modo. Una de estas ventajas es la facilidad ´ ´ de las operaciones de suma. De hecho. el metodo de representacion ´ cogido ha sido el complemento a 2 (Ca2). por ejemplo. una excepcion . .

. El siguiente programa presenta la instrucci´ on ((subu rd .. para incrementar la variable ´ ındice en as habitual enconbucles del tipo (( for ( int i . . $t1 # $t0 < − $ t 0 −$ t 1 numero3 ( $0 ) # Zona de d a t o s # Ma ´ x. .... $t1 # $t0 < − $ t 0 −$ t 1 numero3 ( $0 ) $t0 . rt )) que realiza una resta de n´ umeros sin signo... . rs .. ¿a qu´ e es debido este cambio? ... ... i++))).word − 2147483648 . . .. . . ..... .. . .. . ... ejec´ utalo paso a paso y contesta a las siguientes preguntas: · 64 ¿Qu´ e es lo que hace? ¿Qu´ e resultado se almacena en la direcci´ on de memoria etiquetada como ((numero3))? ¿Es correcto? · 65 ¿Se produce alg´ un cambio si sustituyes las instrucciones ((subu)) por instrucciones ((sub))? En caso de producirse. . .. . .. .word 1 .. . n e g a t i v o r e p r e s e n t a b l e en Ca2 ( 3 2 ) # ( en h e x a d e c i m a l 0 x80000000 ) main : . .. .. . . ..data . ... .. . rs . En los ejercicios que aparecer´ an a continuaci´ on se descubrir´ a la utilidad de dichos registros y la informaci´ on que se almacena en cada uno de ellos en funci´ on de la operaci´ on realizada..e. . . rt )) realiza la operaci´ on rd ← rs − rt.38 Operaciones aritm´ eticas. que el valor de ambos operandos no sea conocido en el momento en el que el programador escribe la instrucci´ on).. . ....... .. l´ ogicas y de desplazamiento Las operaciones aritm´ eticas en las que uno de los operandos es una constante aparecen con relativa frecuencia. es m´ trar instrucciones que requieran que ambos operandos sean variables (es decir.. Hasta ahora se han visto instrucciones para realizar sumas y restas...  oper-subu.. Como primer ejemplo se va a ver el siguiente programa que multiplica dos n´ umeros y almacena el resultado de la operaci´ on (2 palabras) en las posiciones de memoria contiguas al segundo operando.... A continuaci´ on se ver´ a c´ omo realizar las operaciones de multiplicaci´ on y divisi´ on.. . ... .... . . . En concreto. .. . la instrucci´ on ((subu rd . .s 1 2 3 4 5 6 7 8 9 10 11 12 13 numero1 : numero2 : numero3 : .. . Sin embargo. .. i <n. . . .. . . EJERCICIOS . ... . . . . ... .. . . . .. .. . . . ... p.. . Dichas operaciones utilizan de forma impl´ ıcita los registros HI y LO para almacenar el resultado de la operaci´ on correspondiente. . .. . .. donde los operandos fuente est´ an en los registros rs y rt. Carga el programa anterior en el simulador.word 2 . .. .text lw $t0 lw $t1 subu $ t 0 lw $t1 subu $ t 0 sw $t0 # Zona de i n s t r u c c i o n e s numero1 ( $0 ) numero2 ( $0 ) $t0 .

XOR.. ¿Qu´ e instrucciones son? · 69 Utilizando como gu´ ıa el programa anterior. numero2 + 8 ( $0 ) # HI . ... . . $t1 )) almacena el resultado en los registros HI y LO. .text lw $t0 lw $t1 mult $ t 0 mfhi $ t 0 mflo $ t 1 sw $t0 sw $t1 # Zona de d a t o s # Ma ´ x.word 0 x 7 f f f f f f f ..... . . divide rs entre rt y almacena el resto en HI y el cociente en LO. . . . ... Se va a ver como ejemplo de las instrucciones que implementan las operaciones l´ ogicas... . OR.. . la instrucci´ on que implementa la operaci´ on AND.space 8 . act´ uan bit a bit. aunque toman como operandos dos palabras. . Carga el programa anterior en el simulador. ejec´ utalo paso a paso y contesta a las siguientes preguntas: · 66 La instrucci´ on ((mult $t0 . .word 16 . .. .. numero2 + 4 ( $0 ) # .. .. .. . Operaciones l´ ogicas El procesador MIPS32 proporciona un conjunto de instrucciones que permite realizar operaciones l´ ogicas del tipo AND. Para ello... ¿Qu´ e instrucciones se utilizan para recuperar dicha informaci´ on? · 67 ¿Qu´ e resultado se obtiene despu´ es de ejecutar ((mult $t0 . . .. . . .. ..4.. . . . Operaciones l´ ogicas 39  oper-mult.. . . . ... As´ ı. . . numero2 ( $0 ) .. .. ((div rs . .. entre otras. crea uno nuevo que divida 10 entre 3 y almacene el cociente y el resto en las dos palabras siguientes a la direcci´ on de memoria referencia por la etiqueta ((numero2)). . rt ))... .. 4.. la AND de dos palabras genera como resultado una palabra en la que el bit 0 es la AND de los bits 0 de los operandos fuente. . .. .. .. ... numero1 ( $0 ) . por ejemplo... y as´ ı sucesivamente... . el bit 1 es la AND de los bits 1 de los operandos fuente.. . . . .. . .2. $t1 main : # # # .. . EJERCICIOS . ten en cuenta que la instrucci´ on de divisi´ on entera. .. .data .. ...... LO < − $t0 x $t1 $t0 < − HI $t1 < − LO M[ numero2 +4] < − $t0 M[ numero2 +8] < − $t1 . ... .. .2.....s 1 2 3 4 5 6 7 8 9 10 11 12 13 numero1 : numero2 : . . . . Se debe tener en cuenta que las operaciones l´ ogicas. .. . $t1 ))? ¿En qu´ e registros se almacena el resultado? ¿Cu´ al es este resultado? ¿Por qu´ e se utilizan dos palabras? · 68 Observa que dos de las instrucciones del programa anterior utilizan la suma de una etiqueta y una constante para determinar el valor del dato inmediato. . . . p o s i t i v o r e p r e s e n t a b l e en Ca2 ( 3 2 ) # Zona de i n s t r u c c i o n e s .. ..... .....

s 1 2 3 4 5 6 7 8 9 numero : . De todas formas. numero + 4 ( $0 ) Por lo tanto. Que puesto en forma de tabla de verdad queda: a 0 1 a AND b 0 b As´ ı. se extiende al valor de 32 bits 0x0000 fffe. 0 x f f f e # 0 x f f f e e s en b i n a r i o : # 1111 1111 1111 1110 sw $ t 1 . el resultado tendr´ a los bits 31 al 16 y el 0 con el valor 0 y los restantes bits con el valor . Como ya se sabe. l´ ogicas y de desplazamiento La instrucci´ on ((andi rs . la tabla de verdad de la operaci´ on AND es la siguiente: a 0 0 1 1 b 0 1 0 1 a AND b 0 0 0 1 Es decir.word 0 x01234567 .text # Zona de i n s t r u c c i o n e s lw $ t 0 . se sabe que independientemente de cual sea el valor almacenado en $t0. valen 1 el resultado es 1. a y b. el resultado es 0. Puesto que el campo destinado al almacenamiento del n´ umero inmediato es de 16 bits y el operando ha de tener 32 bits.40 Operaciones aritm´ eticas. $ t 0 . para el motivo que nos ocupa. Esta extensi´ on se realiza en las operaciones l´ ogicas colocando a 0 los 16 bits m´ as significativos.data . numero ( $0 ) a n d i $ t 1 . si es 1. resulta m´ as interesante describir el funcionamiento de la operaci´ on AND de otra manera: si uno de los bits es 0. el dato inmediato de 16 bits 0xfffe cuando se utiliza como operando de una operaci´ on l´ ogica. rt . que en binario es: 00000000 00000000 11111111 11111110 .space 4 # Zona de d a t o s main : . la instrucci´ on ((andi $t1 . el resultado ser´ a igual al valor del otro bit. al realizar la AND de 0x0000 fffe con el contenido de $t0. es necesario extender la informaci´ on proporcionada en ((Inm)) de 16 a 32 bits. $t0 . s´ olo cuando los dos bits. 0 xfffe )) realiza la AND l´ ogica entre el contenido del registro $t0 y el valor 0x0000 fffe. Por ejemplo. Inm)) realiza la operaci´ on l´ ogica AND bit a bit del n´ umero almacenado en rt y el n´ umero almacenado en el campo Inm de la propia instrucci´ on.  oper-andi.

.. ..3.) · 72 Desarrolla un programa. .. . ¿que operaci´ on l´ ogica se debe realizar?... ..... . y suponiendo que el contenido de $t0 fuera 0x0123 4567. salvo el bit cero.. .. rt )) realiza la AND l´ ogica de los registros rs y rt y almacena el resultado en rd. . . ... . .. · 70 Carga el anterior programa en el simulador y ejec´ utalo.. .. . . EJERCICIOS .. . que almacene en la posici´ on de memoria ((numero+4)) el valor obtenido al conservar tal cual los 16 bits m´ as significativos del dato almacenado en ((numero)) y poner a uno los 16 bits menos significativos.. Operaciones de desplazamiento El procesador MIPS32 tambi´ en proporciona instrucciones que permiten desplazar los bits del n´ umero almacenado en un registro un determinado n´ umero de posiciones a la derecha o a la izquierda... ... 4... . . .. . el anterior programa pone a cero los bits del 31 al 16 (los 16 m´ as significativos) y el 0 del n´ umero almacenado en ((numero)) y almacena el resultado en ((numero+4)).. basado en los anteriores. . . (Pista: La instrucci´ on ((and rd .. . $t0 ... . ....... . . .. . . ıa a: entonces. expresado en hexadecimal. rs ... que tambi´ en debe conservar su valor original. .. que tambi´ en debe conservar su valor original. .. . .. 0 xfffe )) equivaldr´ 00000000 00000000 11111111 11111110 AND 00000001 00100011 01000101 01100111 00000000 00000000 01000101 01100110 Por lo tanto. Cuando se utiliza una secuencia ´ sta suele recibir el nombre de m´ de bits con este fin. ya que sirve para ((ocultar)) determinados bits del otro operando. . ... ..4.. . . . . . . e ascara de bits.. . . ... ¿basta con una operaci´ on en la que uno de los operandos sea un dato inmediato?) . . .. ¿Qu´ e valor.. .... ... Veamos un ejemplo: dada la m´ ascara de bits anterior. Operaciones de desplazamiento 41 indicado por el n´ umero almacenado en $t0. .. se almacena en la posici´ on de memoria ((numero+4))? ¿Coincide con el resultado calculado en la explicaci´ on anterior? · 71 Modifica el c´ odigo para que almacene en ((numero+4)) el valor obtenido al conservar tal cual los 16 bits m´ as significativos del dato almacenado en ((numero)).. . .. . ... la instrucci´ on ((andi $t1 .. y poner a cero los 16 bits menos significativos. . . (Pista: La operaci´ on l´ ogica AND no sirve para este prop´ osito... ... . 0x0000 fffe.3.. . ... . . a la vez que permite ((ver)) los bits restantes. . . .. salvo el bit cero.

. el desplazamiento no produce siempre el resultado exacto. · 74 Modifica el programa propuesto originalmente para que realice un desplazamiento de 3 bits.. desplaza el valor almacenado en el registro $t0.. . . desplazar 1 bit a la izquierda a qu´ e equivale? ¿Y desplazar 2 bits? · 78 Por otro lado. . ¿A qu´ e operaci´ on aritm´ etica equivale? ¿Seg´ un esto. $t0 ... .... . .42 Operaciones aritm´ eticas.... .  oper-sra.. la palabra original era 0xffff ff41 y al desplazarla se ha obtenido la palabra 0xffff ffe8. . . 4)). ... ... .... . . Modifica el programa original para que utilice la instrucci´ on (( srl )) en lugar de la ((sra)) ¿Qu´ e valor se obtiene ahora en $t1? · 76 Modifica el c´ odigo para desplazar el contenido de ((numero)) 2 bits a la izquierda. . ¿A qu´ e operaci´ on aritm´ etica equivale? (Nota: si el n´ umero es positivo el desplazamiento corresponde siempre a la operaci´ on indicada. . . EJERCICIOS ..s 1 2 3 4 5 6 numero : ... . (Pista: La instrucci´ on de desplazamiento a izquierdas responde al nombre en ingl´ es de shift left logic) · 77 Desplazar n bits a la izquierda equivale a una determinada operaci´ on aritm´ etica (siempre que no se produzca un desbordamiento).. . . .text lw $ t 0 .. · 75 La instrucci´ on (( srl ))....... Como se puede observar. numero ( $0 ) sra $t1 ... . ¿qu´ e valor se almacena en el registro $t1? ¿Qu´ e se ha hecho para conservar el signo del n´ umero original en el desplazado? Modifica el programa para comprobar su funcionamiento cuando el n´ umero que se debe desplazar es positivo..data . .. 4 bits a la derecha conservando su signo y almacena el resultado en $t1.. . .. .... . . . sin embargo.. . . ... .. . ... ... .. . .. . . desplazar n bits a la derecha conservando el signo tambi´ en equivale a una determinada operaci´ on aritm´ etica... La instrucci´ on. . . . · 73 Carga el programa anterior en el simulador y ejec´ utalo.. . l´ ogicas y de desplazamiento El siguiente programa presenta la instrucci´ on de desplazamiento aritm´ etico a derechas (shift right arithmetic).... .. .. .word 0 x f f f f f f 4 1 . Representa ambas palabras en binario y comprueba si la palabra 0xffff ffe8 corresponde realmente al resultado de desplazar 0xffff ff41 3 bits a la derecha conservando su signo. . .. . . ((sra $t1 .. . $t0 . ... . ..) . desplazamiento l´ ogico a derechas (shift right logic). . 4 # Zona de d a t o s # Zona de i n s t r u c c i o n e s # $t1 < − $ t 0 >>4 main : . tambi´ en desplaza a la derecha un determinado n´ umero de bits el valor indicado. cuando el n´ umero es negativo. Sin embargo... . ... . . ... no tiene en cuenta el signo y rellena siempre con ceros.. . . ..

. No puedes utilizar instrucciones aritm´ eticas. .... . .. . . .. . . EJERCICIOS ... . ... .. . . . almacenado en la direcci´ on de memoria 0x1000 0000. . .. ........ · 82 Desarrolla un programa que multiplique por 32 el n´ umero 0x1237. . ..... . .... . .. . .. . . ...4.. ...... ... · 79 Desarrolla un programa en ensamblador que defina el vector de enteros de dos elementos V = (10.. Problemas del cap´ ıtulo 43 4. .. . . . . 7 y 3 deber´ an ponerse a cero mientras que los bits restantes deben conservar el valor original.... ... .. . .. ... . . .. ...... (Pista: Recuerda que en un programa ensamblador se puede utilizar la directiva (( . .) · 81 Desarrolla un programa que modifique el entero 0xabcd 12bd almacenado en la direcci´ on de memoria 0x1000 0000 de la siguiente forma: los bits 9.. .. . . ... . 20) en la memoria de datos comenzando en la direcci´ on 0x1000 0000 y almacene la suma de sus elementos en la primera direcci´ on de memoria no ocupada despu´ es del vector. · 80 Desarrolla un programa en ensamblador que divida entre 5 los enteros 18 y −1215.. Problemas del cap´ ıtulo . . .4... .. .. . .. . . .4. .. .. . estos n´ umeros deben estar almacenados en las direcciones 0x1000 0000 y siguiente. y que almacene el cociente de ambas divisiones comenzando en la direcci´ on de memoria 0x1001 0000. .. . .data )) tantas veces como se requiera. . respectivamente. ..

.

4. una vez que el procesador ha completado la ejecuci´ on de una instrucci´ on. . . o de la interacci´ on con el usuario. . . . . . 5. . . . . . . . . . Un programa de ejecuci´ on secuencial no puede. . . . . Problemas del cap´ ıtulo . si´ rden en el que est´ guiendo el o an en memoria. . Tampoco puede realizar un n´ umero n de veces ciertas operaciones repetitivas (a no ser que el programador haya escrito n veces 45 . . 5 46 48 48 53 O PERACIONES DE SALTO ´ CONDICIONAL Y DE COMPARACI ON Seg´ un lo visto hasta ahora. . este forma de ejecuci´ on tiene bastantes limitaciones. es lo que se denomina ejecuci´ on secuencial. .1. . Estos estaban formados por una serie de instrucciones que se deb´ ıan ejecutar una tras otra. . 5. . . 5. Sin embargo.CAP´ ITULO ´ Indice 5. . La ejecuci´ on de una instrucci´ on tras otra. . . . . hasta que el programa finalizaba. Ejemplos de ejecuci´ on secuencial son los programas vistos en los ´ cap´ ıtulos anteriores. . . siguiendo el orden en el que se encontraban en memoria. . . . . tomar diferentes acciones en funci´ on de los datos de entrada. .3.2. . . Evaluaci´ on de condiciones . . . . . . . . . . . . contin´ ua con la ejecuci´ on de la siguiente instrucci´ on: aquella que se encuentra en la posici´ on de memoria siguiente a la de la instrucci´ on que acaba de ejecutar. Operaciones de salto condicional Operaciones de comparaci´ on . por ejemplo. . . . . . o de los resultados obtenidos. . . .

etiqueta )) Ambas instrucciones realizan una comparaci´ on de los valores almacenados en los registros rs y rt y dependiendo del resultado de dicha comparaci´ on. saltan a la direcci´ on de la instrucci´ on referenciada por la on ((beq)). verdadera o falsa. y en este caso. se proporcionan varios ejercicios sobre los temas tratados en el cap´ ıtulo. Y las estructuras de control repetitivas permiten la repetici´ on de cierta parte del c´ odigo hasta que se cumpla una determinada condici´ on de parada. c´ omo utilizar dichas instrucciones para implementar algunas de las estructuras de control condicional y repetitivas que suelen proporcionar los lenguajes de alto nivel.1.46 Operaciones de salto condicional y de comparaci´ on las mismas operaciones. rt . 5. En el caso de la instrucci´ paraci´ on ser´ a verdadero cuando los valores almacenados en ambos registros . las instrucciones de comparaci´ on. La tercera secci´ on proporciona ejemplos y ejercicios de c´ omo evaluar condiciones simples y compuestas. Y en el siguiente. el resultado de la com(( etiqueta )) o no. rt . etiqueta )) ((bne rs . Debido a la gran ventaja que supone el que un programa pueda tomar diferentes acciones y que pueda repetir un conjunto de instrucciones un determinado n´ umero de veces. salta si distinto). En este cap´ ıtulo se presentan las instrucciones de salto condicional y de comparaci´ on del MIPS32. Estas estructuras de control permiten modificar el flujo secuencial de instrucciones. Este cap´ ıtulo est´ a estructurado como sigue. En particular. los lenguajes de programaci´ on proporcionan estructuras de control que permiten llevar a cabo dichas acciones: las estructuras de control condicionales y repetitivas. Su sintaxis es la siguiente: ((beq rs . En la segunda. Finalmente. las estructuras de control condicionales permiten la ejecuci´ on de ciertas partes del c´ odigo en funci´ on de una serie de condiciones. Para poder implementar las estructuras de control condicionales y repetitivas. n deber´ ıa de ser un n´ umero predeterminado y no podr´ ıa variar en sucesivas ejecuciones). En la primera secci´ on se presentan las instrucciones de salto condicional. el juego de instrucciones del MIPS32 incorpora un conjunto de instrucciones que permiten realizar saltos condicionales y comparaciones. Operaciones de salto condicional El lenguaje m´ aquina del MIPS32 proporciona dos instrucciones b´ asicas de salto condicional: ((beq)) (branch if equal. salta si igual) y ((bne)) (branch if not equal.

. rt . salta si mayor o igual que cero). .. . . rt ..... etiqueta )) (salta si rs < rt) .. EJERCICIOS .. etiqueta )) ((bgtz rs . etiqueta )) (salta si rs ≤ rt) (( blt rs . . .... . ((bgez)). Las instrucciones ((beq)).. son todas las instrucciones de salto condicional que proporciona el procesador MIPS32....... ...... .... .. . salta si menor que cero)... rs > 0 (((bgtz)))... . .. . .. .. etiqueta )) Las instrucciones anteriores comparan el contenido del registro rs con el n´ umero 0 y saltan a la direcci´ on de la instrucci´ on referenciada por (( etiqueta )) cuando rs ≥ 0 (caso de ((bgez))).. rt .. . rt . que comparan el contenido de dos registros para decidir si se realiza o no el salto indicado. .. . y para facilitar la programaci´ on en ensamblador. .. .. .. . . el procesador MIPS proporciona instrucciones para comparar el contenido de un registro con el n´ umero 0.. . . ((bne)). Operaciones de salto condicional 47 sean id´ enticos. .. . . etiqueta )) (salta si rs > rt) (( ble rs . .. . . . el ensamblador del MIPS32 proporciona adem´ as las siguientes pseudo-instrucciones: ((bge rs . . En el caso de la instrucci´ on ((bne)). .. .. .. . . . (( blez )) (branch if less or equal than zero. . Estas instrucciones son: ((bgez)) (branch if greater of equal than zero. ...... . . .. . .. .. . . . el resultado ser´ a verdadero cuando los valores almacenados en ambos registros sean distintos. ((bgtz)) (branch if greater than zero.. etiqueta )) (salta si rs ≥ rt) ((bgt rs . Adem´ as de las instrucciones de salto condicional anteriores.. ...5.. . . salta si mayor que cero).. · 83 ¿Qu´ e significa en ingl´ es el nem´ onico ((bge))? ¿Y (( blt ))? . . rs ≤ 0 ((( blez ))) y rs < 0 ((( bltz ))). La sintaxis de estas instrucciones de comparaci´ on de un registro con el n´ umero 0 es: ((bgez rs .1. .. (( blez )) y (( bltz )). Sin embargo... .. .. .. . etiqueta )) (( bltz rs .. ((bgtz)). . . salta si menor o igual que cero) y (( bltz )) (branch if less than zero.. . . . etiqueta )) (( blez rs .. . .

Estas son: ((sge)) (poner a 1 si mayor o igual).. .3.2... rs . .. . .. .. .. . . ... Sin embargo. Para representar en un computador1 el valor verdadero se utiliza el n´ umero 1 y para representar el valor falso se utiliza el n´ umero 0... Operaciones de comparaci´ on Conviene introducir aqu´ ı un poco de notaci´ on. .. rt )) . . El resultado de una comparaci´ on puede ser verdadero o falso.. (( sgt )) (poner a 1 si mayor).. .. . .. .. rs .. . . . ((seq)) (poner a 1 si igual).. . 5... . .... . . la instrucci´ on (( slt )) es la u on de comparaci´ on que proporciona el procesador MIPS32. . . El lenguaje m´ aquina del MIPS32 dispone de una instrucci´ on que justamente realiza una comparaci´ on del tipo menor que entre dos registros y carga un 1 o un 0 en un tercer registro dependiendo del resultado de la comparaci´ on ´ (verdadero o falso...... indica que se si´ on similar a: (( rd <− (rs < rt ) )) (esta expresi´ almacena en rd el resultado de comparar si rs es menor que rt). . .. .. . y al igual que ocurr´ ıa con las instrucciones de salto condicional.. . Esta es la instrucci´ on (( slt )) (set if less than) y presenta la siguiente sintaxis: (( slt rd . . .. EJERCICIOS . En la primera secci´ on se muestran ejemplos de c´ omo implementar la evaluaci´ on de condiciones Un computador interpretar´ a un 0 como el valor booleano falso y cualquier valor distinto de 0 como el valor booleano verdadero. .. rt )) · 85 ((sne rd .... .48 Operaciones de salto condicional y de comparaci´ on 5.. .. . . . . rs . . .. el ensamblador proporciona una serie ´ de pseudo-instrucciones que facilitan la programaci´ on en ensamblador. ... . . rs . .. . . .. ... . .. . . ..... respectivamente. .... rt ))... (( sle )) (poner a 1 si menor o igual). (( rd <− (rs < rt ) )) indica que en el registro rd se almacenar´ a un 1 o un 0 dependiendo de si el resultado de la comparaci´ on (( rs < rt )) es verdadero o falso... ((sne)) (poner a 1 si distinto). ... ... rt )) · 86 ((seq rd . .. ... Para representar que el resultado de una comparaci´ on se almacena en un registro. . . se utiliza una expreon en particular. 1 . Describe utilizando la nomenclatura introducida en esta secci´ on el significado de las siguientes pseudo-instrucciones (utiliza ((==)) como operador de igualdad y ((=)) como operador de desigualdad): · 84 ((sge rd . . ´ nica instrucci´ De hecho.. .. . Evaluaci´ on de condiciones Las siguientes secciones muestran c´ omo se pueden evaluar condiciones utilizando las instrucciones proporcionadas por el MIPS32. respectivamente)... As´ ı. . .

. . . . .) 3. .text lw $ t 0 lw $ t 1 s l t $t2 sb $ t 2 # Zona de d a t o s main : . . . .s 1 2 3 4 5 6 7 8 9 10 dato1 : dato2 : res : . . . . · 87 Carga y ejecuta el programa anterior. . Introduce ((0x10010004)) en el campo de texto register/location y ((20)) £   en el campo de texto value y pulsa el bot´ on ¢set ¡ . . .word 30 . . que es 20 en hexadecimal. (Observa que en la posici´ on de memoria 0x1001 0004 ahora aparece el valor 0x14. . . . . . . sigue los siguientes pasos: 1. $t1 r e s ( $0 ) # # # # # Zona de i n s t r u c c i o n e s Carga M[ d a t o 1 ] en $ t 0 Carga M[ d a t o 2 ] en $ t 1 $t2 < − ( t 0 <t 1 ) ? 1 : 0 Almacena $ t 2 en M[ r e s ] . . Evaluaci´ on de condiciones simples Sea el siguiente c´ odigo que compara dos variables. . . . . . . 5. (Observa como en la posici´ on de memoria 0x1001 0000 ahora aparece el valor 0x32. . . que es 50 en hexadecimal. . .3. . . .5. . . . 2.1. . ¿Qu´ e valor se almacena en la posici´ on de memoria (( res ))? · 88 Inicializa las posiciones de memoria ((dato1)) y ((dato2)) con los valores 50 y 20. . . respectivamente.data . En la segunda secci´ on se muestra c´ omo implementar la evaluaci´ on de condiciones compuestas: aquellas que est´ an formadas por varias comparaciones y funciones l´ ogicas. ¿Qu´ e valor se carga ahora en la posici´ on de memoria (( res ))? £   £   £   . . . .) · 89 Ejecuta de nuevo el programa utilizando el bot´ on ¢run ¡(recuerda reiniciar la direcci´ o n de inicio — starting address — al valor 0x0040 0000 antes £   de pulsar ¢ok ¡ ). . . Vuelve a pulsar el bot´ on ¢set value ¡del simulador. . . . .space 1 . . . . . d a t o 1 ( $0 ) d a t o 2 ( $0 ) $t0 . . EJERCICIOS . . . . . . Para ello. Pulsa el bot´ on ¢set value ¡del simulador. ((dato1)) y ((dato2)) (con los valores 30 y 40 en el ejemplo) y almacena en la variable (( res )) el resultado de dicha comparaci´ on. . 4. . . . .3. . Introduce ((0x10010000)) (sin las comillas) en el campo de texto regisen sin comillas) en el campo de texto vater/location y ((50)) (tambi´ £   lue y pulsa el bot´ on ¢set ¡ .  comp-slt.word 40 . Evaluaci´ on de condiciones 49 ´ nica comparaci´ simples: aquellas en las que se realiza una u on o funci´ on l´ ogica de dos valores. .

. · 92 Resuelve el ejercicio anterior pero esta vez utilizando la instrucci´ on (( sle )). · 93 Carga el programa anterior en el simulador y ejec´ utalo.... . ¿Qu´ e valor se almacena en la posici´ on de memoria referenciada por la etiqueta (( res ))? En lenguaje C la condici´ on se podr´ ıa expresar como: ((anyos>=20 && anyos<=40)): edad mayor o igual que 20 y edad menor o igual que 40 2 . . . 1 $t0 .... . . EJERCICIOS .. ..3... . . Por ejemplo. .. . .space 1 ... .. .. . . . . . Utiliza la pseudo-instrucci´ on que implementa dicha comparaci´ on. . $t1 r e s ( $0 ) # Zona de i n s t r u c c i o n e s # Carga M[ d a t o 1 ] en $ t 8 # Carga M[ d a t o 2 ] en $ t 9 # S a l t a a i g u a l s i $ t 8 ==0 # S a l t a a f i n e v a l s i $ t 9 ==0 . .. .. . .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 dato1 : dato2 : res : . . .. .data .... .. . . . . . $0 $ t 1 . . f i n e v a l $0 ..text lw $ t 8 lw $ t 9 and $ t 0 and $ t 1 beq $ t 8 o r i $t0 beq $ t 9 o r i $t1 and $ t 2 sb $ t 2 # Zona de d a t o s main : igual : fineval : . Se ver´ a en primer lugar el siguiente programa en ensamblador que eval´ ua una condici´ on compuesta en la que intervienen los datos almacenados en ((dato1)) y ((dato2)):  comp-compuesta.. ... i g u a l $0 . .. . . . . .. . ... ...... . .. . .word 40 .50 Operaciones de salto condicional y de comparaci´ on · 90 ¿Qu´ e condici´ on se ha evaluado? · 91 Modifica el c´ odigo anterior para que eval´ ue la siguiente condici´ on: res ← (dato1 ≥ dato2). 1 $0 . 5.. . .. .. Dicha condici´ on compuesta est´ a formada por dos comparaciones unidas por el operador l´ ogico ((y)).... . $0 $0 . .. . d a t o 1 ( $0 ) d a t o 2 ( $0 ) $ t 0 . .2.. .. .... . ... para averiguar si una persona est´ a entre los 20 y los 40 a˜ nos se podr´ ıa evaluar la siguiente condici´ on compuesta2 .. . Evaluaci´ on de condiciones compuestas Una condici´ on compuesta est´ a formada por varias comparaciones y operadores l´ ogicos. . ... . . . . ....word −50 . .. . . ... .. En esta secci´ on se muestran varios programas en ensamblador que eval´ uan condiciones compuestas.... . . ... ....

...word 30 .data .. · 100 sea: ´ ltimo.... $0 $ t 1 . 1))? ¿Qu´ e condici´ on debe cumplirse para que se ejecute? · 98 ¿Qu´ e es lo que hace la instrucci´ on ((and $t2 . d a t o 1 ( $0 ) d a t o 2 ( $0 ) $ t 0 . $t1 ))? e condici´ on · 99 A la vista de las respuestas a las 4 preguntas anteriores.text lw $ t 8 lw $ t 9 and $ t 0 and $ t 1 beq $ t 8 # Zona de d a t o s main : . modifica el c´ Por u odigo anterior para que la condici´ on evaluada res ← (dato1 = 0) and (dato1 = dato2).. (iii) Anota el valor almacenado en la posici´ on de memoria referenciada por la etiqueta (( res ))...3.... Sea el siguiente programa que implementa una condicional compuesta distinta a la del ejemplo anterior:  comp-compuesta2. $0))? ¿Y la instrucci´ on ((and $t1 ... $0))? · 96 ¿Qu´ e es lo que hace la instrucci´ on (( ori $t0 .. $0......... .. 1))? ¿Qu´ e condici´ on debe cumplirse para que se ejecute? · 97 ¿Qu´ e es lo que hace la instrucci´ on (( ori $t1 .... (ii) Ejecuta el programa de nuevo (modificando la direcci´ on de comienzo en caso necesario). $t1 .. ..... . · 95 ¿Para qu´ e sirve la instrucci´ on ((and $t0 .. (i) Modifica los valores almacenados en las posiciones de memoria referenciadas por las etiquetas ((dato1)) y ((dato2)) con los valores indicados (sigue un procedimiento similar al descrito en el ejercicio 88)....... ¿qu´ compuesta est´ a eval´ uando el programa anterior? Comprueba que la expresi´ on deducida es correcta viendo si se cumple la tabla rellenada en el ejercicio 94..... Evaluaci´ on de condiciones 51 · 94 Para cada par de valores de los mostrados en la siguiente tabla realiza las siguientes operaciones...... .... i g u a l # Zona de i n s t r u c c i o n e s # Cargan d a t o 1 y d a t o 2 en $ t 8 y $ t 9 # I n i c i a l i z a $t0 a cero # I n i c i a l i z a $t1 a cero . dato1 10 20 0 dato2 20 0 0 res omo funciona el c´ odigo contestando a las siguientes preAnaliza ahora c´ guntas.space 1 .... $t0 ...word −50 .... $0 $0 .....s 1 2 3 4 5 6 7 8 9 10 11 dato1 : dato2 : res : . .. $t0 . $0..5....

.. . . . $0 ... . ¿Cu´ al es la condici´ on compuesta evaluada? · 102 Inicializa la memoria y registros del simulador..word 30 . ..... . . . . ... . ........ .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dato1 : dato2 : res : ... . . . . por u compuesta distinta a la de los ejemplos anteriores:  comp-compuesta3.. ..... . .. ..... . .. ... . .. . . modifica el c´ Por u odigo anterior para que la condici´ on evaluada res ← ((dato1 = dato2) and (dato1 ≤ dato2)). . . . . ... . . . $t8 . .. .... . . . .. .... . $0 . . . ...... f i n e v a l . . $ t 1 .. .word −20 . d a t o 2 ( $0 ) .. d a t o 1 ( $0 ) # Cargan d a t o 1 y d a t o 2 en $ t 8 y $ t 9 . . .52 Operaciones de salto condicional y de comparaci´ on 12 13 14 15 igual : fineval : ori slt and sb $t0 $t1 $t0 $t0 ...space 1 .. . . .. $t1 r e s ( $0 ) . · 101 Comenta adecuadamente el c´ odigo para entender qu´ e es lo que hace.. $t8 $t0 .. . $0 # I n i c i a l i z a $t0 a cero .data . . 1 . $t0 . carga el c´ odigo y ejec´ utalo. . ¿Qu´ e valor se almacena ahora en la posici´ on de memoria (( res ))? · 104 Sobrescribe las posiciones de memoria ((dato1)) y ((dato2)) con los valores 0 y -20 y vuelve a ejecutarlo ¿Qu´ e valor se ha almacenado ahora en la posici´ on de memoria (( res ))? · 105 ¿Coinciden los resultados obtenidos en las tres preguntas anteriores con el resultado de evaluar la condici´ on compuesta que encontraste en el ejercicio 101? · 106 sea: ´ ltimo. . el siguiente programa que implementa una condicional Sea. $t9 .. . . . .text lw $ t 8 lw $ t 9 and $ t 0 and $ t 1 s l t $t0 bne $ t 9 o r i $t1 or $ t 0 sb $ t 0 . $0 # I n i c i a l i z a $t1 a cero . ´ ltimo... . .. $t1 r e s ( $0 ) . .. # Zona de d a t o s main : fineval : # Zona de i n s t r u c c i o n e s .... .. . . $ t 0 .. ¿Qu´ e valor se almacena en la posici´ on de memoria (( res ))? · 103 Sobrescribe las posiciones de memoria ((dato1)) y ((dato2)) con los valores 10 y 20 (sigue un procedimiento similar al descrito en el ejercicio 88) y ejecuta de nuevo el c´ odigo (teniendo en cuenta que la direcci´ on de comienzo ha de ser la 0x0040 0000).. . EJERCICIOS . $0 . 1 $t9 ..

. .4. .. . .. .. . ... . . .. . .. . . . . . . .. Problemas del cap´ ıtulo . .. . . .. . .. 1. . . .... . . . carga el c´ odigo y ejec´ utalo. ... .... . . ... .4.. .. . . . . . . . . 1.. El objetivo del programa es el de escribir en el vector res el resultado de las siguientes operaciones: res[0] = V [0] and V [4].. . . · 107 Comenta adecuadamente el c´ odigo para entender qu´ e es lo que hace. .. ... .. . .. . . . .. . . .... 0]. . modifica el c´ Por u odigo anterior para que la condici´ on evaluada res ← ((dato1 ≤ dato2) or (dato1 ≤ 0)). ... .. .. .. . ... . . . . · 114 Desarrolla un programa en ensamblador que defina un vector de booleanos. . . .. .. .. . ¿Qu´ e valor se almacena en la posici´ on de memoria (( res ))? · 109 Sobrescribe las posiciones de memoria ((dato1)) y ((dato2)) con los valores -20 y 10 (sigue un procedimiento similar al descrito en el ejercicio 88) y ejecuta de nuevo el c´ odigo (teniendo en cuenta que la direcci´ on de comienzo ha de ser la 0x0040 0000). Los valores iniciales deber´ an ser tales que V = [0. 1. Los valores que pueden tomar los elementos del vector ser´ an 0 para representar el valor booleano falso y 1 para representar el valor booleano verdadero. ... .. . . . . res. implementado mediante un vector de bytes.. . .. . . EJERCICIOS . ... . . .. . . V . . . . . . ¿Cu´ al es la condici´ on compuesta evaluada? · 108 Inicializa la memoria y registros del simulador... Problemas del cap´ ıtulo 53 . . EJERCICIOS .. . .. . .5. . . . . .. . 5. .. .. .. . . . . ... . con 3 elementos. . . . . . . . .. . .. . .. ... ¿Qu´ e valor se almacena ahora en la posici´ on de memoria (( res ))? · 110 Sobrescribe las posiciones de memoria ((dato1)) y ((dato2)) con los valores 10 y 0 y vuelve a ejecutarlo ¿Qu´ e valor se ha almacenado ahora en la posici´ on de memoria (( res ))? · 111 Sobrescribe las posiciones de memoria ((dato1)) y ((dato2)) con los valores 20 y 10 y vuelve a ejecutarlo ¿Qu´ e valor se ha almacenado ahora en la posici´ on de memoria (( res ))? · 112 ¿Coinciden los resultados obtenidos en las cuatro preguntas anteriores con el resultado de evaluar la condici´ on compuesta que encontraste en el ejercicio 107? · 113 sea: ´ ltimo.. Reserva espacio tambi´ en para un vector de boolenos..

2]... −5. res[2] = (V [0] or V [1]) and V [2]... 2] y obtenga como resultado una variable booleana.... .... V = [1....... −4...... −6]... de tres elementos...... ∀i ∈ [0. el resultado de las siguientes comparaciones V [i] >= 0. · 116 Dise˜ na un programa en ensamblador que defina e inicialice un vector de enteros........ V = [2...... −4... .......... · 115 Desarrolla un programa en ensamblador que defina e inicialice un vector de enteros.... El objetivo del programa es el de almacenar en un vector de booleanos res...... resultado... que tomar´ a el valor 1 si todos los elementos del vector V son menores que cero (0 en caso contrario)..........54 Operaciones de salto condicional y de comparaci´ on res[1] = V [1] or V [3].

las estructuras que ser´ an objeto de estudio son las siguientes (del lenguaje C): (( if )). en caso contrario. utilizando las instrucciones presentadas en el cap´ ıtulo anterior.1. Este cap´ ıtulo muestra c´ omo implementar. Estructuras de control condicionales En esta secci´ on se tratan las estructuras condicionales (( if )) e (( if − else )). (( if − else )). 55 . ((while)) y (( for )). no hace nada. las estructuras de control condicionales y de repetici´ on encontradas habitualmente en los lenguajes de alto nivel. La importancia de dichas estructuras de control radica en que permiten el desarrollo de programas m´ as elaborados que los que podr´ ıan realizarse si tan s´ olo se contara con la ejecuci´ on secuencial. Tambi´ en se coment´ o en dicho cap´ ıtulo que estas instrucciones sirven para la implementaci´ on de las estructuras de control condicionales y de repetici´ on. En concreto. permite la ejecuci´ on de una porci´ on u otra de c´ odigo en funci´ on de si la condici´ on evaluada es verdadera o falsa. (( if − else )). ejecuta un determinado c´ odigo. 6. La primera de ellas eval´ ua una condici´ on y si se cumple. (( if − else )). La segunda estructura de control condicional.CAP´ ITULO 6 E STRUCTURAS DE CONTROL ´ CONDICIONALES Y DE REPETICI ON En el cap´ ıtulo anterior se presentaron las instrucciones de salto condicional y las instrucciones de comparaci´ on.

el programa propuesto almacena en la variable (( res )) el cociente de la divisi´ on entera de dos n´ umeros. .data . . on que eval´ ua · 117 Identifica en el programa en ensamblador la instrucci´ la condici´ on y controla el flujo del programa.s 1 2 3 4 5 6 7 8 9 10 11 12 13 dato1 : dato2 : res : . . . Estructura de control condicional if El primer ejemplo que se va a ver corresponde a un peque˜ no programa que utiliza una estructura de control (( if )).1. . . y en caso contrario. . . En concreto.1.space 4 main : . Una versi´ on en lenguaje C de dicho programa ser´ ıa la siguiente: 1 2 3 4 5 6 7 8 9 10 i n t main ( i n t a r g c . . . . i n t dato2 =30. . . . . . . . d a t o 1 ( $0 ) d a t o 2 ( $0 ) $0 . simplemente devuelve un 0 como resultado. . . . . } } Una versi´ on en ensamblador del MIPS32 del anterior programa en C podr´ ıa ser la siguiente:  control-if. . o un 0 si ((dato2)) es igual a 0.56 Estructuras de control condicionales y de repetici´ on 6. El programa intenta evitar que se realice una divisi´ on por cero (lo que generar´ ıa una excepci´ on). . . . i f ( dato2 !=0) { res =dato1 / dato2 . . . $0 $0 . . Comp´ arala con la condici´ on del programa en lenguaje C.word 30 . . . . int res .word 40 . . . · 119 Carga y ejecuta el programa. comprueba si el divisor es distinto de cero antes de realizar la divisi´ on. . . . . . . ¿Qu´ e condici´ on eval´ ua dicha instrucci´ on en el programa en ensamblador? ¿Qu´ e condici´ on eval´ ua la instrucci´ on (( if )) del programa en C? ¿Qu´ e relaci´ on hay entre ambas condicionales? · 118 Identifica en el programa ensamblador las instrucciones que corresponden a la estructura (( if )) completa (la instrucci´ on que eval´ ua la condici´ on. . . . Para ello. . r e s ( $0 ) # # # # # # # Carga d a t o 1 en $ t 1 Carga d a t o 2 en $ t 2 $t0 < − 0 S i $ t 2 == 0 s a l t a a f i n s i $t1 / $t2 Almacena LO en $ t 0 Almacena $ t 0 en r e s . . . ¿Qu´ e valor se almacena en la variable (( res )) despu´ es de su ejecuci´ on? . . . . . m´ as las instrucciones que se ejecutan en caso de cumplirse la condici´ on del (( if )) original). ((dato1)) y ((dato2)). . r e s =0. . . . . . . .text lw $t1 lw $t2 and $ t 0 si : beq $ t 2 e n t o n c e s : div $t1 mflo $ t 0 finsi : sw $t0 . . . . . . . char ∗∗ a r g v ) { i n t dato1 =40. . EJERCICIOS . f i n s i $t2 . . . . .

........ 1 2 3 4 5 6 7 8 9 10 11 i n t main ( i n t a r g c .....1. i f ( d a t o 2 > 0) { res =dato1 / dato2 . int res ...6.word 800 ....text lw $ t 1 .. i f ( ( x>=min ) && ( x<max ) ) { r e s =1...space 4 ...... en este caso se querr´ ıa saber si 0 ≤ x < 800.... } } ... y )..word 0 . Estructuras de control condicionales 57 · 120 Reemplaza el contenido de ((dato2)) por un 0....s 1 2 3 4 5 6 7 8 min : max : x: res : ... 1 2 3 4 5 6 7 8 9 10 i n t main ( i n t a r g c . min ( $0 ) main : # Carga min en $ t 1 . r e s =0. } } Una versi´ on en ensamblador del MIPS32 del anterior programa en C podr´ ıa ser la siguiente:  control-if2.....e.. se encuentra dentro del rango permitido por una pantalla de p...data . ¿C´ omo se deber´ ıa implementar la estructura condicional (( if )) si la condici´ on fuera una condici´ on compuesta? Veamos un ejemplo... si ((dato2>0)). ¿Qu´ e valor se almacena en la variable (( res )) despu´ es de ejecutar de nuevo el programa? · 121 El siguiente programa escrito en C es una versi´ on del programa anterior en el que s´ olo realiza la divisi´ on si el divisor es un n´ umero positivo. i n t max = 8 0 0 .. char ∗∗ a r g v ) { i n t min = 0 . i n t x =30.. es decir..... i n t dato2 =30... r e s =0. Sea el siguiente programa en C que indica si un determinado n´ umero est´ a dentro de un rango definido por otros dos poniendo a 1 la variable (( res )) en caso afirmativo y a 0 en caso contrario. (x....... Implementa dicha versi´ on en ensamblador. 800 × 600. char ∗∗ a r g v ) { i n t dato1 =40..... Una posible aplicaci´ on ser´ ıa la de comprobar si la coordenada x de un punto gr´ afico.....word 30 .. int res . Los programas anteriores evaluan condiciones simples: el primero eval´ ua si ((dato2!=0)) y el segundo..

.. ... .. . . .. . 1 2 3 4 5 6 7 8 9 10 11 i n t main ( i n t a r g c . .. Implementa dicho programa en ensamblador. ... .. . Estructura de control condicional if . i n t max = 7 9 9 . .... . r e s =0. ... ¿Qu´ e valor se almacena es de ejecutar de nuevo el programa? en la variable (( res )) despu´ · 126 El siguiente programa escrito en C tambi´ en comprueba si x pertenece a un rango. .. 1 r e s ( $0 ) # # # # # # # Carga max en $ t 2 Carga x en $ t 3 $t0 < − 0 S i $ t 3 <$ t 1 s a l t a a f i n s i S i $ t 3 >=$ t 2 s a l t a a f i n s i $t0 < − 1 Almacena $ t 0 en r e s . . . int res ... . en lugar de evaluar si 0 ≤ x < 800.. . . . . .. . .. .. . . . .. · 122 Identifica en el programa en ensamblador la instrucci´ on o instrucciones que eval´ uan la condici´ on y controlan el flujo del programa... . .. . ..else Ahora se va a ver c´ omo se implementa en ensamblador la estructura de control condicional (( if − else )).. . . Crea un fichero con el siguiente fragmento de c´ odigo que contiene una estructura de control de dicho tipo. $0 $t1 . . .. 6... . . } } . .. . . ... . . Comp´ arala con la condici´ on del programa en lenguaje C. . . ¿Qu´ e valor se almacena en la variable (( res )) despu´ es de su ejecuci´ on? · 125 Reemplaza el contenido de ((x)) por un -10.. f i n s i $t2 . . ... . f i n s i $0 .. i f ( ( x>=min ) && ( x<=max ) ) { r e s =1. pero en este caso. ... m´ as las instrucciones que se ejecutan en caso de cumplirse la condici´ on del (( if )) original).. . . ..... . .... char ∗∗ a r g v ) { i n t min = 0 .. ... ...1.. . .2.. .. i n t x =30. . .. · 124 Carga y ejecuta el programa. .. . .. .. .. EJERCICIOS ..58 Estructuras de control condicionales y de repetici´ on 9 10 11 12 13 14 15 lw lw and si : blt bge entonces : ori finsi : sw $t2 $t3 $t0 $t3 $t3 $t0 $t0 . ... eval´ ua si 0 ≤ x ≤ 799. max ( $0 ) x ( $0 ) $0 .. ... ¿Qu´ e condici´ on eval´ uan la o las instrucciones en el programa en ensamblador? ¿Qu´ e condici´ on eval´ ua la ´ stas? instrucci´ on (( if )) del programa en C? ¿Qu´ e relaci´ on hay entre e · 123 Identifica en el programa ensamblador las instrucciones que correson o instrucciones que eval´ uan ponden a la estructura (( if )) completa (la instrucci´ la condici´ on.. . ..

¿qu´ e valor se almacena en (( res )) en funci´ on del contenido de las variables ((dato1)) y ((dato2))? · 128 Carga el fichero en el simulador y ejecuta el programa.word 15 . . .. .data .6.. . .. . ... .. . . ¿Qu´ e valor se es de ejecutarlo? almacena en (( res )) despu´ · 129 Modifica el contenido de la direcci´ on de memoria ((dato1)) para que almacene el valor 67 en lugar del actual 30. char ∗∗ a r g v ) { i n t dato1 =30. .  control-ifelse2. . .. .. . ¿Qu´ e valor se almacena ahora en (( res ))? · 130 Identifica en el lenguaje m´ aquina generado por el simulador el conjunto de instrucciones que implementan la pseudoinstrucci´ on ((bge)).word 65 .. .. . El siguiente programa tambi´ en utiliza una estructura de control (( if − else )) pero esta vez la condici´ on evaluada es una condici´ on compuesta. } else { r e s = d a t o 2 −d a t o 1 ... .... .. .. . ...space 4 ...text lw $ t 1 ... finsi : d a t o 1 ( $0 ) d a t o 2 ( $0 ) $t2 .. . .. .. } } . . .... .word 40 . s i n o r e s ( $0 ) r e s ( $0 ) # # # # # # Carga d a t o 1 en $ t 1 Carga d a t o 2 en $ t 2 S i $ t 1 >=$ t 2 i r a s i n o Almacena $ t 1 en r e s Ir a f i n s i Almacena $ t 2 en r e s . . .data . Ejecuta de nuevo el programa.. e n t o n c e s : sw $ t 1 ... i n t dato2 =40.. ... i f ( d a t o 1 >=d a t o 2 ) { r e s = d a t o 1 −d a t o 2 . . .. . Estructuras de control condicionales 59  control-ifelse. ..space 4 main : . . .. . . ... ... .s 1 2 3 4 5 6 minima : maxima : edad : res : . .s 1 2 3 4 5 6 7 8 9 10 11 12 13 dato1 : dato2 : res : ..... .word 30 . .. . . .. . 1 2 3 4 5 6 7 8 9 10 11 i n t main ( i n t a r g c .. . .... j finsi sino : sw $ t 2 .. si : bge $ t 1 . .. ..... . . . .. lw $ t 2 .. .word 16 ... . . .... . int res . .... · 127 ¿Qu´ e hace el programa? Dicho de otra forma. .1. ¿Cu´ ales son? · 131 Implementa en ensamblador el siguiente programa escrito en C que calcula el valor absoluto de la resta de dos n´ umeros. .. EJERCICIOS .

while ( cadena [ n ] ! = 0 ) { n=n + 1 . } } Una versi´ on en ensamblador del MIPS32 del anterior programa en C podr´ ıa ser la siguiente: .. Ejecuta de nuevo el programa. . ... .. $0 . . . .. ((while))... ..... ...2.. . Estructura de control repetitiva while El siguiente programa en C utiliza una estructura de control ((while)) para descubrir el n´ umero de caracteres de una cadena dada (que termina con el car´ acter nulo). 1 j finsi sino : and $ t 4 . . .. . permite la ejecuci´ on reiterada de una serie de instrucciones un n´ umero predeterminado de veces. ¿Qu´ e valor se almacena en (( res )) despu´ es de ejecutar el programa? · 134 Modifica la variable ((edad)) para que contenga el valor 28. . ...... . La segunda de ellas... . maxima ( $0 ) lw $ t 3 ... .. . . 6. .. ....60 Estructuras de control condicionales y de repetici´ on 7 8 9 10 11 12 13 14 15 16 main : .. . ... on reiterada de una serie de La primera de ellas. ..... . 1 2 3 4 5 6 7 8 i n t main ( i n t a r g c .2.. .... en lugar del actual 15. . .. .. e n t o n c e s ble $t3 . .. ... Estructuras de control repetitivas En esta secci´ on se presentan las estructuras repetitivas ((while)) y (( for )).. e d a d ( $0 ) si : b l t $t3 . .... (( for )).. . . . . char ∗∗ a r g v ) { ´ mo e s t a ´ s ?” . .. . · 132 ¿Qu´ e crees que hace el programa? ¿Qu´ e condicional compuesta es evaluada? · 133 Carga y ejecuta el programa.1... . .. ¿qu´ e valor se almacena ahora en (( res ))? .. . EJERCICIOS .. .text lw $ t 1 . . . char c a d e n a [ ] = ” Hola ... ¿c o i n t n =0. .. permite la ejecuci´ instrucciones mientras se cumpla una determinada condici´ on.. . .. minima ( $0 ) lw $ t 2 .. . . . . . $0 . . .. $0 finsi : sw $ t 4 . . . . r e s ( $0 ) # # # # # # # # # Carga minima en $ t 1 Carga maxima en $ t 2 Carga edad en $ t 3 S i $ t 3 <$ t 1 i r a e n t o n c e s S i $ t 3 <=$ t 2 i r a s i n o $ t 4 <−1 Ir a f i n s i $ t 4 <−0 Almacena $ t 4 en r e s . 6. s i n o e n t o n c e s : a d d i $ t 4 . . ... . $t1 .... . $t2 . . .. . .

. ..2. puede ser interesante que el decremento 0.. el siguiente ejemplo muestra un programa en C que acumula los elementos de un vector ((V)) en una variable llamada (( res )).. . . .. . .. . ...... . . .... se hace necesario el uso de una variable que almacene el n´ umero de iteraciones que se van realizando para as´ ı poder compararlo con el n´ umero de iteraciones que deben realizarse.. . . .text andi $t0 . Estructuras de control repetitivas 61  control-while. . La variable que almacena dicha cuenta recibe el nombre de contador. el contador se iniciar´ ıa con el n´ umero total de iteraciones menos 1 y se decrementar´ ıa de 1 en 1 hasta llegar a ´ ltimo.. . EJERCICIOS .2.. .... f i n m i e n t r a s addi $t0 .. . $t0 . . . . · 135 Ejecuta paso a paso el programa anterior y comprueba detenidamente la funci´ on de cada una de las instrucciones que constituyen el programa ensamblador.... ... As´ ı pues. . . utiliza una estructura condicional (( for )) y un contador llamado (( i )).. .. el siguiente ejemplo se ce˜ nir´ a al caso m´ as com´ un: aquel en el contador se inicializa a 0 y se incrementa de 1 en 1 hasta alcanzar el n´ umero total de iteraciones menos uno. . 0 lb $t1 . un contador se suele inicializar con el valor 0 e incrementar de 1 en 1 hasta que alcanza el n´ umero total de iteraciones menos 1. . . . . .. . . . .. .. .. . .. .data ´ mo e s t a ´ s? ” .... n ( $0 ) main : mientras : finmientras : # # # # # # $ t 0 <−0 $ t 1< − M[ c a d e n a+ $ t 0 ] ( un b y t e ) S i $ t 1 ==0 s a l t a a f i n m i e n t r a s $ t 0< −$ t 0 +1 Saltar a mientras Almacena $ t 0 en n ... . en es posible realizar la Hay que tener en cuenta.. . .. Por u o incremento del contador se realice en cantidades distintas a la unidad. . Estructura de control repetitiva for La estructura de control repetitiva (( for )) se diferencia de la ((while)) en que el n´ umero de iteraciones de la primera es conocido de antemano. en determinados casos. De todas formas.. ......space 4 . no obstante. .... .... .. ... . As´ ı pues.... Para ello.. $0 . . que tambi´ cuenta en orden descendente. ¿c o . 1 i n t main ( i n t a r g c . . .2..s 1 2 3 4 5 6 7 8 9 10 11 12 cadena : n: .. ... . char ∗∗ a r g v ) { . · 136 ¿Qu´ e valor se almacena en ((n)) despu´ es de ejecutar el programa? ¿Cu´ antos caracteres tiene la cadena? ¿Se ha contabilizado el car´ acter nulo? . .... . cadena ( $t0 ) beq $ t 1 . . . a s c i i z ” h o l a . .. . . .... 1 j mientras sw $ t 0 . Generalmente.align 2 . 6. $t0 . . En este caso.6.

... . 1 r e s ( $0 ) finpara : # # # # # # # # # # # $t2 < − direccio ´ n de v e c t o r $t3 < − 0 $t0 < − 0 $t1 < − Mem[ n ] S i $ t 0 >=$ t 1 s a l t a a f i n p a r a Carga e l e m e n t o de v e c t o r en $ t 4 Acumula l o s e l e m e n t o s d e l v e c t o r A c t u a l i z a e l p u n t e r o $ t 2 (<− $ t 2 +4) $t0 < − $ t 0 +1 S a l t a a para Almacena $ t 3 en r e s . n =6. · 137 Ejecuta paso a paso el programa y comprueba detenidamente la funci´ on que realizan cada una de las instrucciones que componen el programa en ensamblador.. . res ....s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 vector : n: res : .. .. · 138 · 139 rior? ¿En qu´ e posici´ on de memoria est´ a la variable (( res ))? ¿Qu´ e valor se almacena en (( res )) despu´ es de ejecutar el c´ odigo ante- · 140 ¿Qu´ e registro se ha utilizado para actualizar el contador? ¿Qu´ e valor posee al finalizar la ejecuci´ on dicho registro? ¿Cu´ antas veces se ha ejecutado el bucle que comienza en la instrucci´ on etiquetada con (( para ))? .. . . . and $ t 0 . . . main : para : vector $0 . EJERCICIOS .. . . .. . . . . .. 8 . . . .62 Estructuras de control condicionales y de repetici´ on 2 3 4 5 6 7 8 9 10 11 int int int int V[ ] = { 6 . .. 1 ... .. 1 0 . $t4 $t2 . . 8 . } } Una versi´ on en ensamblador del MIPS32 del anterior programa en C podr´ ıa ser la siguiente:  control-for.. . .. . bge $ t 0 . . 1 } . lw $t4 . i <n . . ...word 6 . . . 7 . . 1 0 . ... . .. ..... . . and $ t 3 .. . . addi $t2 . .. 4 $t0 .. . .. .. j para sw $t3 ..... .. $0 $0 . . . 9 .. .. lw $t1 .... . 9 . i ++) { r e s = r e s +V[ i ] ... .. addi $t0 ... . f i n p a r a 0( $t2 ) $t3 . .. . .text la $t2 . .....space 4 . .. ..... .. 7 . add $ t 3 .data . i. . . . f o r ( i = 0 ..... . .. r e s =0.word 6 .. .... $0 n ( $0 ) $t1 .. .. .

. . . . .. . . . . ... . . .. deber´ a almacenar un 0 en (( res )). ... as´ ı como una variable.. . . ... debe reservar 1 palabra para almacenar el resultado: variable (( res )). ((n)).. . El programa deber´ a inicializar una cadena en memoria que finalice con el car´ acter nulo (un 0). obtenga como resultado cu´ antos elementos son iguales a cero. .. . . .. .3... · 144 Desarrolla un programa en ensamblador que dado un vector de caracteres.6... . .... .3.. el programa deber´ a almacenar en la variable (( res )) un 1 si el valor de ((num)) est´ a en alguno de los intervalos formados por ((min1)) y ((max1)) o ((min2)) y ((max2)).. .. ((max1=10)).. contabilice cu´ antas veces se repite un determinado car´ acter en el mismo.... .. Problemas del cap´ ıtulo 63 6. El programa deber´ los elementos del vector... . Tambi´ en deber´ a reservar espacio para la variable (( res )). ((n)). . . · 143 Desarrolla un programa en ensamblador que dado un vector de enteros ((V)) obtenga cu´ antos elementos de este vector est´ an dentro del rango a inicializar determinado por dos variables: ((min)) y ((max)). ... . ... . . .... ... una variable. . . . en memoria.. Despu´ es.. que almacenar´ a el n´ umero de elementos que tiene el vector y dos variables. ((min2=50)). donde se almacenar´ an los valores m´ ınimo y m´ aximo del rango. Este resultaa inido se debe almacenar en una variable llamada (( total )).. . . en la que se almacenar´ a el resultado. .. .. . ((max2=70)) y ((num=34)). ..... ((min)) y ((max)).. Tambi´ en deber´ a reservar espacio para la variable (( resultado )). ((V)). . . ..... Una vez definidas las variables anteriores. En caso contrario. · 142 Desarrolla un programa en ensamblador que dado un vector de enteros. . . . . . . EJERCICIOS . que almacenar´ a el n´ umero de elementos que tiene el vector ((V))...... . .. . ((V)). Problemas del cap´ ıtulo ... . . ... El programa deber´ cializar los elementos del vector... .. . . . · 141 Desarrolla un programa en ensamblador que en primer lugar almacene en memoria las siguientes variables enteras: ((min1=2)). .... .

.

. 66 Paso de par´ ametros . . . 70 Problemas del cap´ ıtulo . . La ventaja de esta divisi´ on radica en la mayor facilidad con la que se puede escribir. . . . . . . 77 Una subrutina est´ a formada por un conjunto de instrucciones separadas del programa principal. El uso de subrutinas permite dividir un problema largo y complejo en subproblemas m´ as sencillos. . . . . . . no es necesario escribir el mismo c´ odigo una y otra vez a lo largo del programa. . se puede integrar en el programa que la va a utilizar. 7. . . . . . Esto es.2. 7 ´ A LA GESTI ON ´ DE I NTRODUCCI ON SUBRUTINAS Llamada y retorno de una subrutina . .3. . . . . . depurar y probar cada una de los subproblemas por separado. . una vez que se ha verificado que su comportamiento es el esperado. se puede desarrollar y probar una subrutina independientemente del resto del programa y posteriormente. Si no fuera posible utilizar subrutinas se deber´ ıa repetir la misma fracci´ on de c´ odigo en todas y cada una ´ ste fuera necesario. . . . .CAP´ ITULO ´ Indice 7. . . . . . . 7.1. . . No es s´ de las partes del programa en las que e olo la ventaja de no tener que escribir varias veces el mismo c´ odigo: ¿qu´ e ocurrir´ ıa si ese tro65 . . . . . . . . realiza una determinada tarea y puede ser invocada desde cualquier punto de un programa. Otra ventaja de programar utilizando subrutinas es que si una misma tarea se realiza en varios puntos del programa. .

1 . La ejecuci´ on de esta instrucci´ on conlleva las siguientes acciones: • Se almacena la direcci´ on de memoria de la siguiente instrucci´ on a la que contiene la instrucci´ on (( jal )) en el registro $ra. si se utiliza una subrutina y se detecta un error en ella o se quiere mejorar su implementaci´ on. Desde el punto de vista que nos ocupa. Es decir. y la continuaci´ on de la ejecuci´ on del programa a partir de la siguiente instrucci´ on a la que invoc´ o a la subrutina. ´ ltimo. cualquier mejora de dicha parte del c´ odigo implicar´ ıa revisar todas las partes del programa en las que aparece. una traducci´ on m´ as adecuada es la de ((biblioteca)). En resumen. La palabra inglesa library se suele traducir err´ oneamente en castellano como ((librer´ ıa)). c´ omo llamar y retornar de una subrutina y c´ omo intercambiar informaci´ on entre el programa invocado y la subrutina utilizando registros. Por el contrario. Es decir. le basta con recurrir a una determinada biblioteca e invocar a la subrutina adecuada. Cuando un programador requiere resolver un determinado problema ya implementado. gracias a la agrupaci´ on de subrutinas en bibliotecas. Llamada y retorno de una subrutina El juego de instrucciones del MIPS32 dispone de dos instrucciones para ´ gestionar la llamada y el retorno de una subrutina. el uso de subrutinas implica que se deben facilitar las siguientes acciones: la llamada a una subrutina. 7. el uso de subrutinas tiene una ventaja a´ Por u un mayor: subproblemas que aparecen con frecuencia en el desarrollo de ciertos programas pueden ser implementados como subrutinas y agruparse en bibliotecas (libraries en ingl´ es1 ). una sola vez. $ra←PC+4. basta con modificar su c´ odigo. Estas son: (( jal etiqueta )) Se utiliza en el programa invocador para llamar a la subrutina que comienza en la direcci´ on de memoria indicada por la etiqueta. Es decir. De igual forma.66 Introducci´ on a la gesti´ on de subrutinas zo de c´ odigo tuviera un error que fuera preciso corregir?. En este cap´ ıtulo se presentan los aspectos m´ as b´ asicos relacionados con el manejo de subrutinas en el ensamblador del MIPS32. la devoluci´ on de los resultados. que ser´ ıa necesario ´ ste aparece para rectificar el revisar todas las partes del programa en las que e mismo error. otra de las ventajas que aporta utilizar subrutinas es la reducci´ on del tiempo de implementaci´ on y depuraci´ on del c´ odigo. el paso de los par´ ametros con los que debe operar la subrutina. el mismo c´ odigo puede ser reutilizado en varios programas. el de los mecanismos que proporciona un procesador para realizar ciertas tareas de programaci´ on.1.

. y devuelve la suma de ambos en el registro $v0. el siguiente c´ grama que utiliza una subrutina llamada ((suma)). cuando finalice la salta a la direcci´ on indicada por la etiqueta.. PC←$ra. el programa invocador debe llamar a la subrutina utilizando la instrucci´ on (( jal etiqueta )).. Esta instrucci´ on realiza un salto incondicional a la direcci´ on contenida en el registro $ra (return address).. Llamada y retorno de una subrutina 67 • Se lleva el control del flujo del programa a la direcci´ on indicada en el campo (( etiqueta )). Como se puede observar.1: Llamada y retorno de una subrutina odigo muestra un proComo primer ejemplo de subrutinas. Es decir. jr $ra jal subr .s 1 2 dato1 : . Esta instrucci´ on almacena en $ra la direcci´ on de vuelta y ´ ltimo. Es decir. (( jr $ra )) Se utiliza en la subrutina para retornar al programa invocador. e on (( jr $ra )) para retornar al programa que la invoc´ o. Por u ´ sta debe ejecutar la instrucci´ subrutina.. Esta subrutina suma los valores almacenados en los registros $a0 y $a1. Este funcionamiento queda esquematizado en la Figura 7. se realiza un salto incondicional a la direcci´ on especificada en (( etiqueta )) (PC←(( etiqueta ))). Subrutina subr: . En primer lugar.word # Zona de d a t o s 1 . Esta forma de proceder ser´ a la correcta siempre que el contenido del registro $ra no sea modificado durante la ejecuci´ on de la subrutina. Programa invocador jal subr . la subrutina se llama desde dos puntos del programa principal (la primera l´ ınea del programa principal est´ a etiquetado como ((main))).. La correcta utilizaci´ on de estas dos instrucciones permite realizar de forma sencilla la llamada y el retorno desde una subrutina.7.. jal subr .. Figura 7..  suma-dato1-dato2-v1.1. ..data .1.

word . suma $v0 . . En primer lugar se ha almacenado el programa invocador y a continuaci´ on la subrutina.word . C´ argalo en el simulador y ejec´ utalo paso a paso. . . . . . . . EJERCICIOS . .word .68 Introducci´ on a la gesti´ on de subrutinas 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 dato2 : dato3 : dato4 : res1 : res2 : . . . . . . . . suma $v0 . . . . . . . . . . . . . . . .space . . . . . d a t o 1 ( $0 ) d a t o 2 ( $0 ) r e s 1 ( $0 ) d a t o 3 ( $0 ) d a t o 4 ( $0 ) r e s 2 ( $0 ) segunda : Carga el programa anterior en el simulador y contesta a las siguientes preguntas mientras realizas una ejecuci´ on paso a paso. . . .word . . $a1 . .word . . . . . $a1 jr $ra # Programa i n v o c a d o r main : primera : lw lw jal sw lw lw jal sw $a0 . . . · 145 ¿Cu´ al es el contenido del PC y del registro $ra antes y despu´ es de ejecutar la instrucci´ on (( jal suma)) etiquetada como ((primera))? · 146 ¿Cu´ al es el contenido de los registros PC y $ra antes y despu´ es de ejecutar la instrucci´ on (( jr $ra )) la primera vez que se ejecuta la subrutina ((suma))? al es el contenido del PC y del registro $ra antes y despu´ es de · 147 ¿Cu´ ejecutar la instrucci´ on (( jal suma)) etiquetada como ((segunda))? · 148 ¿Cu´ al es el contenido de los registros PC y $ra antes y despu´ es de ejecutar la instrucci´ on (( jr $ra )) la segunda vez que se ejecuta la subrutina ((suma))? · 149 El programa que aparece a continuaci´ on es id´ entico al anterior salvo que se han modificado las posiciones de memoria que ocupan el programa invocador y la subrutina. $a1 . . .space . . . .text 3 5 4 4 4 # Zona de c o ´ digo # Subrutina suma : add $v0 .  suma-dato1-dato2-v2. .data . .space # Zona de d a t o s 1 3 5 4 4 . . .s 1 2 3 4 5 6 dato1 : dato2 : dato3 : dato4 : res1 : . . . . . . .word . . $a0 . . $a0 . . .word . .

.... ´ ltimo de los ejercicios anterioPara resolver el problema planteado en el u res es necesario incluir en el c´ odigo del programa un par de instrucciones que le indican al monitor (un sistema operativo muy simple) del simulador SPIM que el programa ha finalizado y que la ejecuci´ on debe terminar..space ...data .. El siguiente listado muestra un ejemplo en el que se han introducido dicho par de instrucciones al finalizar el programa principal. d a t o 1 ( $0 ) # Zona de d a t o s 1 3 5 4 4 4 # Zona de c o ´ digo ..space 4 ..... suma $v0 ........ $a0 ... Llamada y retorno de una subrutina 69 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 res2 : .word .space ...... $a1 .......word ... $a1 jr $ra ¿Qu´ e ocurre cuando se ejecuta? Hazlo paso a paso y contesta a las siguientes preguntas: ¿Ha terminado el programa invocador despu´ es de ejecutar la instrucci´ on ((sw $v0......word . $a0 ......1..  suma-dato1-dato2-v3..... $a1 . res2 ($0)))? ¿O por el contrario..text # Zona de c o ´ digo # Programa i n v o c a d o r main : primera : lw lw jal sw lw lw jal sw $a0 ... A partir de ahora.text # Programa i n v o c a d o r main : lw $a0 . d a t o 1 ( $0 ) d a t o 2 ( $0 ) r e s 1 ( $0 ) d a t o 3 ( $0 ) d a t o 4 ( $0 ) r e s 2 ( $0 ) segunda : # Subrutina suma : add $v0 ...s 1 2 3 4 5 6 7 8 9 10 11 12 13 dato1 : dato2 : dato3 : dato4 : res1 : res2 : ........ la ejecuci´ on ha continuado con las instrucciones de la subrutina ((suma))? ¿Ha entrado en un bucle sin fin? ..... suma $v0 ...7.word .. es conveniente que se utilicen dichas instrucciones en los programas que se desarrollen.

Los par´ ametros intercambiados entre el programa invocador y la subrutina pueden ser de tres tipos seg´ un la direcci´ on en la que se transmita la informaci´ on: de entrada.. . .... ... ... . .2. .. y para los par´ ametros de salida se deben utilizar los registros $v0 y $v1. ... . . .. ... .... . recibe el nombre de paso de par´ ametros.... EJERCICIOS . Por u ametros de entrada/salida proporcionan informaci´ on del programa invocador a la subrutina y devuelven informaci´ on de la subrutina al programa invocador.. $a1. . . . . . . Se denominan par´ ametros de salida a los que devuelven informaci´ on de la ´ ltimo. .. Se denominan par´ ametros de entrada a los que proporcionan informaci´ on del programa invocador a la subrutina... $a1 jr $ra ... . ¿Cu´ ando acaba ahora su ejecuci´ on? Ten cuidado al ir paso a paso ya que si despu´ es de § ¤ ´ ltima instrucci´ ejecutar la u on del programa.. .... .. vuelves a pulsar el bot´ on ¦ step ¥ el programa entero volver´ a a comenzar a ejecutarse...... . la arquitectura MIPS32 establece un convenio para el paso de par´ ametros mediante registros: para los par´ ametros de entrada se deben utilizar los registros $a0. · 150 Carga el programa en el simulador y ejec´ utalo paso a paso.. De hecho. . $a0 . . . ... Que se utilicen registros o la pila depende de la arquitectura en cuesti´ on y del convenio que se siga para el paso de par´ ametros en dicha arquitectura. los par´ subrutina al programa invocador. 7... . .. . para realizar el paso de par´ ametros es necesario disponer de alg´ un lugar f´ ısico donde se pueda almacenar y leer la informaci´ on que se quiere transferir. . . . .. .. .. . $a0 . . suma $v0 . . . . .. Las dos opciones m´ as comunes son: utilizar registros o utilizar la pila. .. . .. . $a1 . suma $v0 .. . . . . .... . 1 0 syscall # Subrutina suma : add $v0 . .. . . . de salida o de entrada/salida. ´ nicamente del paso de par´ Este cap´ ıtulo se va a ocupar u ametros por medio de registros.... Paso de par´ ametros El mecanismo mediante el cual el programa invocador y la subrutina intercambian informaci´ on.. . $a2 y $a3.... ...70 Introducci´ on a la gesti´ on de subrutinas 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 primera : segunda : lw jal sw lw lw jal sw $a1 . . .. d a t o 2 ( $0 ) r e s 1 ( $0 ) d a t o 3 ( $0 ) d a t o 4 ( $0 ) r e s 2 ( $0 ) # Finalizar la ejecucio ´ n d e l programa l i $v0 .. Por otro lado. ..... . .. . .

3. Un par´ ametro se pasa por referencia cuando lo que se transfiere es la direcci´ on de memoria en la que se encuentra dicho dato. hay dos formas de hacerlo. La primera de las siguientes secciones muestra c´ omo se realiza el paso de par´ ametros por valor y la segunda. El u par´ ametros es c´ omo se transfiere cada uno de los par´ ametros.2. c´ omo se realiza el paso de par´ ametros por referencia. el desarrollo de una subrutina implica determinar en primer lugar: El n´ umero de par´ ametros necesarios. cu´ ales de salida y cu´ ales de entrada/salida. finalizadas las operaciones que deba realizar y antes de devolver el control al programa invocador. 7. En las siguientes secciones se utilizar´ an par´ ametros de entrada. el programa invocador carga el valor de los par´ ametros de entrada en los registros elegidos para ello. Qu´ e par´ ametros deben pasarse por valor y qu´ e par´ ametros por referencia. Un par´ ametro puede pasarse por valor o por referencia. Se dice que un par´ ametro se pasa por valor cuando lo que se transfiere es el dato en s´ ı. el programa invocador deber´ a ajustarse a los requerimientos que haya fijado el desarrollador de la subrutina en cuanto a c´ omo se debe realizar el paso de par´ ametros. Cu´ ales son de entrada.7. Adem´ as. Seg´ un todo lo anterior. El programa invocador recoge los par´ ametros de salida de los registros elegidos para ello. salida o entrada/salida seg´ un sea necesario. La subrutina. Antes de realizar la llamada a la subrutina. el paso de par´ ametros se har´ a utilizando los registros fijados por el convenio del MIPS32. de salida y de entrada/salida. Si se van a utilizar registros o la pila para su transferencia. tambi´ en se ha visto que los par´ ametros pueden pasarse ´ ltimo aspecto a considerar del paso de por medio de registros o de la pila. Adem´ as.2.1. De hecho.2): 1. Naturalmente. Paso de par´ ametros por valor El paso de par´ ametros por valor implica la siguiente secuencia de acciones (v´ ease la Figura 7. 2. . Paso de par´ ametros 71 Hasta aqu´ ı se ha visto que hay par´ ametros de entrada. carga el valor de los par´ ametros de salida en los registros elegidos para ello.

. . · 151 Enumera los registros que se han utilizado para pasar los par´ ametros a la subrutina. Cargar el valor de los parámetros de entrada en los registros 2. d a t o 1 ( $0 ) d a t o 2 ( $0 ) r e s 1 ( $0 ) d a t o 3 ( $0 ) d a t o 4 ( $0 ) r e s 2 ( $0 ) # Finalizar la ejecucio ´ n d e l programa # Zona de d a t o s 1 3 5 4 4 4 # Zona de c o ´ digo segunda : l i $v0 . . . Realizar operaciones 4. .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 dato1 : dato2 : dato3 : dato4 : res1 : res2 : . . .word . · 152 ¿Los anteriores registros se han utilizado para pasar par´ ametros de entrada o de salida? · 153 Anota qu´ e registro se ha utilizado para devolver el resultado al programa invocador. . . . . . . . . .word . . . . . . . . . . . . $a1 . . .word . . . . . Cargar parámetros de salida en registros 5. . .space . . . . . . .2: Paso de par´ ametros por valor Como ejemplo de paso de par´ ametros por valor se presenta el siguiente ´ c´ odigo que ya se hab´ ıa visto con anterioridad. . Este muestra un ejemplo de paso de par´ ametros de entrada y de salida por valor. Llamar a la subrutina 6. EJERCICIOS . suma $v0 . . $a0 . .space . . .data . . $a1 jr $ra . . Retornar Figura 7. . Continuar programa Introducci´ on a la gesti´ on de subrutinas Subrutina 3. . . . . . $a0 . $a1 .  suma-dato1-dato2-v3.text # Programa i n v o c a d o r main : primera : lw lw jal sw lw lw jal sw $a0 . . . . . .word . . . 1 0 syscall # Subrutina suma : add $v0 . . . Almacenar los parámetros de salida 7. suma $v0 . . .72 Programa invocador 1. .

. Llamar a la subrutina 7.... La subrutina.word .... el programa invocador carga en los registros elegidos para realizar el paso de par´ ametros... las direcciones de memoria en las que est´ a almacenada la informaci´ on que se quiere pasar. .. Cargar la dirección de los parámetros en registros 2.2...2. Cargar el valor de los parámetros en registros 4..... La subrutina carga en registros el contenido de las direcciones de memoria indicadas por los par´ ametros de entrada (recuerda que el MIPS32 no puede operar directamente con datos en memoria)..7. Retornar Figura 7..word ...... Y opera con ellos... e secuencia de acciones (v´ ease la Figura 7.. almacena los resultados en las direcciones de memoria que le hab´ ıa proporcionado el programa invocador....s 1 2 3 4 5 6 dato1 : dato2 : dato3 : dato4 : res1 : . El siguiente programa muestra un ejemplo en el que se llama a una subrutina utilizando el paso de par´ ametros por referencia tanto para los par´ ametros de entrada como los de salida.  suma-dato1-dato2-v4..word ... 7..word ..3): Antes de realizar la llamada a la subrutina.data ..space # Zona de d a t o s 1 3 5 4 4 ..... Continuar programa Subrutina 3.. Paso de par´ ametros por referencia Programa invocador 1... Realizar operaciones 5......2..... una vez ha finalizado y antes de devolver el control al programa principal. Paso de par´ ametros 73 · 154 ¿El anterior registro se ha utilizado para pasar un par´ ametro de entrada o de salida? · 155 Se˜ nala qu´ e instrucciones se corresponden a cada uno de las acciones enumeradas en la Figura 7.3: Paso de par´ ametros por referencia ´ ste implica la siguiente En cuanto al paso de par´ ametros por referencia............ Almacenar parámetros de salida en memoria 6........2.

.. . .. Paso de par´ ametros. ¿por valor o por referencia? Una vez descritas las dos formas de paso de par´ ametros a una subrutina. . .. .. se debe analizar para cada par´ ametro cu´ al es la forma id´ onea de realizar el paso.. . . generalmente. ... $t1 .. $a2 . la decisi´ on u omo se pasan los par´ ametros a una subrutina depende en gran medida del tipo de informaci´ on que se quiera pasar.. .. . .. el paso siempre se har´ a por referencia. . . estructuras. . $v0 . . .. matrices... 10 syscall # Finalizar la ejecucio ´ n d e l programa # Subrutina suma : lw lw add sw jr $t0 . . . $t1 0 ( $a2 ) ... Es decir. .. . $v0 . .. .. por referencia o por valor.. ... . ´ ltima de c´ De hecho.. de salida o de entrada/salida.... ... . .... .. · 158 Se˜ nala qu´ e instrucciones se corresponden con cada una de las acciones enumeradas en la Figura 7. Tanto si el par´ ametro en cuesti´ on es de entrada. $a1 .. . .. . · 156 Enumera los registros que se han utilizado para pasar la direcci´ on de los par´ ametros de entrada a la subrutina... .. Si se trata de un dato de tipo estructurado (vectores.. En la pr´ actica.. · 157 Anota qu´ e registro se ha utilizado para pasar la direcci´ on del par´ ametro de salida a la subrutina. . . . cadenas. .. . . .. queda la tarea de decidir cu´ al de las formas.. .3. 7. . EJERCICIOS . . ). .... $a1 . $a2 .. . .. . .space . . . ...text 4 # Zona de c o ´ digo # Programa i n v o c a d o r main : la la la jal la la la jal $a0 ... . no todos los par´ ametros de una subrutina utilizar´ an la misma forma de paso. .. . . ... $ra 0 ( $a0 ) 0 ( $a1 ) $t0 . .. . suma dato1 dato2 res1 dato3 dato4 res2 primera : segunda : l i $v0 ... . . . .2. ... . . ....3.. . suma $a0 . Los ejemplos anteriores eran un poco artificiales ya que todos los par´ ametros se pasaban o bien por valor o por referencia.. .. es m´ as conveniente en cada caso.74 Introducci´ on a la gesti´ on de subrutinas 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 res2 : . . ....

En este caso. Dicho programa tiene por objeto calcular cu´ antos elementos de un vector dado tienen el valor 12. de salida o de entrada/salida. Para ello. as´ ı como qu´ e registros se van a utilizar para ello. El programa consta de una subrutina que devuelve el n´ umero de elementos de un vector que son menores a uno dado. se debe desarrollar una subrutina que contabilice cu´ antos elementos de un vector son menores a un valor dado. 7. Un par´ ametro de este tipo es utilizado por la subrutina pero no deber´ ıa ser modificado: es preferible pasar este tipo de par´ ametros por valor. Un par´ ametro de este tipo proporciona un valor que la subrutina necesita conocer pero en el que posteriormente devolver´ a el resultado. Un par´ ametro de este tipo permite a la subrutina devolver el resultado de las operaciones realizadas. hay que determinar qu´ e par´ ametros debe recibir dicha subrutina. . e ´ ltima decisi´ referencia. Paso de par´ ametros 75 En cambio. ). • Por referencia: la subrutina almacena en memoria el dato. si el dato que se quiere pasar es de tipo escalar (un n´ umero ´ ste se puede pasar por valor o por entero. un car´ acter. La direcci´ on de memoria la obtiene la subrutina del registro que hab´ ıa sido utilizado para ello. Se debe desarrollar dicho programa paso a paso.2. Llamando dos veces a dicha subrutina con los valores 12 y 13 y realizando una simple resta.2. Par´ ametro de salida. y cu´ ales se pasar´ an por referencia y cu´ ales por valor. . . el programa ser´ a capaz de determinar el n´ umero de elementos que son iguales a 12.7. es preferible pasarlo por referencia. Par´ ametro de entrada/salida. En primer lugar. Para este tipo de par´ ametros se puede optar por cualquiera de las opciones: que el par´ ametro sea devuelto por valor o por referencia. Esta u on depende de la utilizaci´ on que se le vaya a dar al par´ ametro: es decir. Un ejemplo m´ as elaborado A continuaci´ on se plantea el desarrollo de un programa en lenguaje ensamblador donde se aplican todos los conceptos presentados en este cap´ ıtulo.4. La siguiente lista muestra las opciones disponibles seg´ un el tipo de par´ ametro: Par´ ametro de entrada. un n´ umero real. si se trata de un par´ ametro de entrada. • Por valor: la subrutina devuelve el dato utilizando el registro reservado para ello.

. . . . . . . . Una descripci´ on detallada del funcionamiento que debiera tener dicho programa se muestra en el siguiente listado en lenguaje C: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 i n t nummenorque ( i n t ∗ v e c t o r s . num = num + 1 . . . . . . . dim . contesta las siguientes preguntas: a) ¿Qu´ e par´ ametros debe pasar el programa invocador a la subrutina? ¿Y la subrutina al programa invocador? b) ¿Cu´ ales son de entrada y cu´ ales de salida? c) ¿Cu´ ales se pasan por referencia y cu´ ales por valor? d) ¿Qu´ e registros se van a utilizar para cada uno de ellos? · 160 Completa el desarrollo del fragmento de c´ odigo correspondiente a la subrutina. r e s 2 = nummenorque ( v e c t o r . se deber´ a desarrollar el programa que llame a dicha subrutina y obtenga el n´ umero de elementos del vector dado que son iguales a 12. . 5 . int res1 . . /∗ Contador ∗/ n = 0. . . 8 . . num ) . num ) . . } . . . i <d i m s . . . . i n t d a t o s ) { ´n d i c e int i . } } return n . res2 . . i n t num = 1 2 . · 159 Conforme desarrollado el c´ odigo de la subrutina. . 3 . . . . . . Desarrolla el fragmento de c´ odigo correspondiente al programa invo- . . } i n t main ( i n t a r g c .76 Introducci´ on a la gesti´ on de subrutinas Una vez desarrollada la subrutina y teniendo en cuenta los par´ ametros que requiere. . . . . 12 . . . char ∗∗ a r g v ) { i n t v e c t o r [9]={5 . /∗ Contador a 0 ∗/ f o r ( i = 0 . . . · 161 cador. . /∗ I ∗/ i n t n . . r es . . . . . 12 . . i n t di m s . dim . 5 . . . i n t dim = 9 . . . . . r e s 1 = nummenorque ( v e c t o r . . . EJERCICIOS . . . . . r e s = r e s 2 −r e s 1 . 12}. . . i ++) { if ( vector s [ i ] < dato s ) { n = n + 1. . . . 15 .

. Naturalmente. Problemas del cap´ ıtulo Para la realizaci´ on de los siguientes problemas se deber´ a consultar el Ap´ endice B en el que se describen las llamadas a los servicios que proporciona el simulador SPIM..... el programa deber´ a mostrar por pantalla cu´ antos n´ umeros se han introducido y su suma.3. ¿Qu´ e valor se almacena en (( res )) cuando se ejecuta? Modifica el contenido del vector (( vector )).. el programa deber´ a mostrar por pantalla el n´ umero de elementos pares de ambos vectores.... Problemas del cap´ ıtulo 77 · 162 Comprueba que el programa escrito funciona correctamente..... · 163 Desarrolla un programa que lea n´ umeros enteros por teclado hasta que el usuario introduzca el n´ umero 0...... y que almacene en sendas variables....... Una vez el usuario ha introducido el n´ umero 0. Adem´ as.7.. Un ejemplo de ejecuci´ on de dicho programa ser´ ıa el siguiente: # Introduce un n´ umero (0 para 4 # Introduce un n´ umero (0 para 3 # Introduce un n´ umero (0 para 0 Has introducido 2 n´ umeros que · 164 Realiza el siguiente ejercicio: terminar): terminar): terminar): suman 7..... el n´ umero de elementos pares de cada uno de ellos. a) Desarrolla una subrutina que calcule cu´ antos elementos de un vector de enteros son pares (m´ ultiplos de 2).. (( vector1 )) y (( vector2 )). b) Implementa un programa en el que se inicialicen dos vectores de 10 elementos cada uno.............. ((numpares1)) y ((numpares2))...... 7.. el programa deber´ a utilizar la subrutina desarrollada en el apartado a) de este ejercicio. · 165 Realiza el siguiente ejercicio: ........ La subrutina debe recibir como par´ ametros el vector y su dimensi´ on y devolver el n´ umero de elementos pares.3...... El primero de los problemas propuestos permitir´ a practicar el uso de dichos servicios. ... ejecuta de nuevo el programa y comprueba que el resultado obtenido es correcto.......

78 Introducci´ on a la gesti´ on de subrutinas a) Implementa una subrutina que calcule la longitud de una cadena de caracteres que finalice con el car´ acter nulo. Utiliza la subrutina desarrollada en el apartado a) de este ejercicio. Utiliza la subrutina desarrollada en el apartado a) de este ejercicio para sumar los elementos de cada fila de la matriz. b) Desarrolla un programa que sume todos los elementos de una matriz de dimensi´ on m × n. · 166 Realiza el siguiente ejercicio: a) Desarrolla una subrutina que sume los elementos de un vector de enteros de cualquier dimensi´ on. En la versi´ on que se implemente de este programa utiliza una matriz con m = 5 y n = 3. Se debe tener en cuenta que la matriz deber´ ıa poder tener cualquier dimensi´ on. de dimensi´ on 5 × 3 con valores aleatorios (los que se te vayan ocurriendo sobre la marcha). . b) Implementa un programa que solicite dos cadenas de caracteres por el teclado y calcule cu´ al de las dos cadenas es m´ as larga. as´ ı que se deber´ a utilizar un bucle para recorrer sus filas. es decir.

. . . 8. Esta gesti´ on abarca las siguientes tareas: El almacenamiento y posterior recuperaci´ on de la informaci´ on almacenada en determinados registros. 84 Problemas del cap´ ıtulo . . . . . . los detalles de c´ omo se cede el control a dicha rutina y la gesti´ on de informaci´ on que dicha cesi´ on supone. . . es el de la gesti´ on de la informaci´ on requerida por la subrutina. . . . o un programador en ensamblador. . quedan convenientemente ocultos.2. . . s´ ı que debe explicitar todos los aspectos que conlleva la gesti´ on de la llamada y ejecuci´ on de una subrutina. . y que no se ha tratado todav´ ıa. . .3. . . 8 ´ DE SUBRUTINAS G ESTI ON La pila . . Otro aspecto relacionado con la llamada y ejecuci´ on de subrutinas. . . 80 Bloque de activaci´ on de la subrutina . . . . . 8. . . . . . . . Como la transferencia de informaci´ on entre el programa invocador y la subrutina y la devoluci´ on del control al programa invocador cuando finaliza la ejecuci´ on de la subrutina. . . . . . . . . . . . Sin embargo. . Algunos de dichos aspectos se trataron en el cap´ ıtulo anterior. un compilador. . . .1.CAP´ ITULO ´ Indice 8. . . . 98 Cuando se realiza una llamada a una subrutina (procedimiento o funci´ on) en un lenguaje de alto nivel. . 79 . .

en ingl´ es). se muestra en qu´ e consiste la construcci´ on y gesti´ on del bloque de activaci´ on. La acci´ on de a˜ nadir elementos a una pila se denomina apilar (push. en segundo lugar. La creaci´ on y utilizaci´ on de variables temporales y locales de la subrutina. Este cap´ ıtulo muestra c´ omo crear y gestionar el bloque de activaci´ on de una subrutina. Una analog´ que el u ıa que se suele emplear para describir una pila es el de un mont´ on de libros puestos uno sobre otro encima de una mesa.1. Posteriormente. Para poder llevar a cabo dichas tareas es necesario crear y gestionar un espacio de memoria donde la subrutina pueda almacenar la informaci´ on que necesita durante su ejecuci´ on. Para que dicha analog´ ıa sea correcta se debe limitar la forma en la que se pueden a˜ nadir o quitar libros de dicho ´ ste deber´ mont´ on. La gesti´ on del bloque de activaci´ on de la subrutina constituye un tema central en la gesti´ on de subrutinas. Puesto que el bloque de activaci´ on se implementa utilizando una estructura de datos conocida como pila. en ingl´ es) y la de extraer elementos de una pila. Cuando se implementa una pila en la memoria de un computador es necesario. en la segunda parte. Esta direcci´ en la que se encuentra el u on de memoria es lo que se conoce como el tope de la pila. Cuando se quiera a˜ nadir un libro. Cuando se quiera quitar un libro. el ´ ltimo libro a˜ u nadido a la pila de libros ser´ a el primero en ser sacado de ella. A este espacio de memoria se le denomina bloque de activaci´ on de la subrutina. La pila Una pila o cola LIFO (Last In First Out) es una estructura de datos en la ´ ltimo dato almacenado es el primero en ser recuperado. decidir la direcci´ on en la que va a crecer la pila y. En cuanto a la direcci´ on de crecimiento de la pila. e a colocarse encima de los que ya haya (´ esto es. desapilar (pop. 8. no es posible insertar un libro entre los que ya est´ en en el mont´ on). no se puede quitar un libro en particular si previamente no se han quitado todos los que est´ an encima suyo). As´ ı. s´ olo se podr´ a quitar el libro que est´ a m´ as arriba en el mont´ on (´ esto es. disponer de un puntero que indique la direcci´ on de memoria ´ ltimo dato introducido en la pila.80 Gesti´ on de subrutinas El almacenamiento y la recuperaci´ on de la direcci´ on de retorno para permitir que una subrutina llame a otras subrutinas o a si misma (recursividad). la primera parte del cap´ ıtulo se dedica a mostrar c´ omo se utiliza una pila en ensamblador. en primer lugar. se suele seguir el convenio de que la pila crezca de direcciones de memoria altas a direcciones de .

1: Apilar una palabra on de desapilar tambi´ en consta de dos pasos.1. Por tanto. En el segundo. As´ ı.1 muestra el contenido de la pila y el valor del registro $sp antes y despu´ es de apilar una palabra. En el primero de ellos se decrementa el puntero de pila en tantas posiciones como el tama˜ no de los datos que se desean apilar. los pasos que se deber´ an realizar son: (i) decrementar el puntero de pila en 4 posiciones. La operaci´ on de apilar se realiza en dos pasos. El registro $29 es el utilizado por MIPS como puntero de pila. As´ ı por ejemplo. Dicho registro tambi´ en recibe el nombre de $sp (stack pointer). De igual forma. para almacenar la direcci´ on del tope de pila se suele utilizar un registro que recibe el nombre de puntero de pila. ((addi $sp. y (ii) almacenar el contenido del registro $t0 en la direcci´ on indicada por $sp. el tope de pila disminuir´ a al a˜ nadir elementos y aumentar´ a al quitar elementos. La Figura 8. A continuaci´ on se describen con detalle los pasos que se deben realizar para apilar y desapilar en el MIPS32. si se quisiera apilar la palabra que contiene el registro $t0. se almacena el dato que se quiere apilar en la direcci´ on indicada por el puntero de pila. los u poren a la pila estar´ an en direcciones de memoria m´ as bajas que los que ya se encontraban en ella. se deber´ a decrementar el contenido del puntero de pila.8. se incrementa el puntero de pila en tantas posiciones como el tama˜ no del dato que se desea desapilar. los pasos que se deber´ an realizar son: (i) cargar el . La pila 81 ´ ltimos elementos que se incormemoria bajas. En el segundo. ((sw $t0 . −4)). si se quisiera desapilar una palabra para cargarla en el registro $t0. cuando se quiera a˜ nadir elementos a la pila. $sp. En el primero de La operaci´ ellos se recupera el dato que est´ a almacenado en la pila. X X−4 SP X−12 X−8 X−12 SP X−16 + X X−4 X−8 X−12 X−16 + $t0 − − Antes de apilar el registro $t0 Después de apilar el registro $t0 Figura 8. se deber´ a incrementar el contenido del puntero de pila. As´ ı por ejemplo. Por otro lado. cuando se quieran extraer elementos de la pila. 0($sp) )). Siguiendo dicho convenio.

.. . uno detr´ as de otro. . .. . . · 167 Suponiendo que el puntero de pila contiene el valor 0x7fff effc y que se desea apilar una palabra (4 bytes).. .2 muestra el contenido de la pila y el valor del registro $sp antes y despu´ es de desapilar una palabra. . . 0($sp) )).. ... ... . ((lw $t0 . .. . −4 0( $sp ) # # # # # # # Zona de i n s t r u c c i o n e s $ t 0 <−10 $ t 1 <−13 A c t u a l i z a $ s p ( $ sp< −$ sp −4) Apila $t0 A c t u a l i z a $ s p ( $ sp< −$ sp −4) Apila $t1 Crea el programa anterior. .. . .. . ((addi $sp...... .. $sp.2: Desapilar una palabra Realiza los siguientes ejercicios sobre la operaci´ on apilar. ... . . El siguiente fragmento de c´ odigo apila.... −4 0( $sp ) $sp ... . ¿Qu´ e valor deber´ a pasar a tener el puntero de pila antes de almacenar la nueva palabra en la pila? ¿Qu´ e instrucci´ on se utilizar´ a para hacerlo en el ensamblador del MIPS32? · 168 ¿Qu´ e instrucci´ on se utilizar´ a para almacenar en la posici´ on apuntada por el puntero de pila el contenido del registro $t1? · 169 A partir de los dos ejercicios anteriores indica qu´ e dos instrucciones permiten apilar en la pila el registro $t1.... ...... . . ... . . . . inicia el simulador.. .. .. . .. . . . . . .. X X−4 X−8 SP X−16 X−12 X−16 $t0 SP X−12 + X X−4 X−8 X−12 + − − Antes de desapilar el registro $t0 Después de desapilar el registro $t0 Figura 8. .. .. . .. La Figura 8... . .. . . .... .. .. carga el programa y realiza los siguientes ejercicios: .s 1 2 3 4 5 6 7 main : ... . y (ii) incrementar en 4 posiciones el puntero de pila. . . el contenido de los registros $t0 y $t1:  sub-apila-t0t1.. ..82 Gesti´ on de subrutinas dato que se encuentra en la posici´ on indicada por el registro $sp en el registro $t0.. .. EJERCICIOS .. ......text li $t0 li $t1 a d d i $sp sw $t0 a d d i $sp sw $t1 .... . . . .. . . . . 10 13 $sp . . ... . 4)).. . . .

. .. Los registros deben quedar apilados en el mismo orden que en el programa original.... . ........ . ..... . Justifica la propuesta. · 173 ¿Qu´ e instrucci´ on se utilizar´ a para desapilar el dato contenido en el tope de la pila y cargarlo en el registro $t1? · 174 ¿Qu´ e instrucci´ on en ensamblador del MIPS32 se utilizar´ a para actualizar el puntero de pila? · 175 A partir de los dos ejercicios anteriores indica qu´ e dos instrucciones permiten desapilar de la pila el registro $t1. ... . . .1. Realiza los siguientes ejercicios sobre la operaci´ on desapilar.. . . . . ...... . .. EJERCICIOS ... .8.. . ..... .. se obtienen los mismos elementos pero en el orden inverso..... .. ..... . . . (Pista: Si se apilan elementos en la pila y luego se desapilan.. . . . . . · 171 Modifica el programa anterior para que en lugar de actualizar el pun´ nica tero de pila cada vez que se pretende apilar un registro. . . Lea una cadena de caracteres desde el teclado. · 172 Realiza los cambios necesarios en el programa original para que apile ´ nicamente el byte m´ u as bajo del registro $t0 y los 4 bytes del registro $t1... ...... .... . ... . ..... .... .. · 170 Ejecuta el programa paso a paso y comprueba en qu´ e posiciones de memoria... ...... .. .. se realice una u actualizaci´ on al principio del puntero de pila y. ....... · 176 Suponiendo que el puntero de pila contiene el valor 0x7fff eff8 ¿Qu´ e valor deber´ a pasar a tener el puntero de pila despu´ es de desapilar una palabra (4 bytes) de la pila? .... . La pila 83 . .. Invierta el contenido de esta cadena. . ... . . pertenecientes al segmento de pila...... . EJERCICIOS .... .... . . . ...... . ... ... ..... .. .. . . ..... . . .. EJERCICIOS DE AMPLIACI ON · 177 Desarrolla un programa que realice las siguientes acciones: Reserve espacio en memoria para almacenar una tira de caracteres de 10 elementos como m´ aximo. . . .... ... .. .... ... a continuaci´ on. . .... ..... .. .. ...) . . . . . . . .. .. ... . . . .... .. . .... . ..... se almacenen los registros $t0 y $t1.. . .... .. . ..... .. ... . ...... . ´ .... ... . ..... .. ... . . .. . .. . ... ... .. ..... .... .... . ..... . . .. ... . . ... . . .... se almacenan los contenidos de los registros $t0 y $t1. ....... . .. .. ..... .... . almacenando la cadena resultante en las mismas posiciones de memoria que la original. .. ... .... . . .. . .. ... . .

Si durante la ejecuci´ on del programa invocado. Bloque de activaci´ on de la subrutina El bloque de activaci´ on (BA) de una subrutina est´ a formado por el segmento de pila que contiene la informaci´ on manejada por una subrutina durante su ejecuci´ on. lo que obliga a ser cuidadoso con la gesti´ on de las direcciones de retorno. 4 . o a si misma. se almacenar´ a en el registro $ra la nueva direcci´ on de retorno. Dicha instrucci´ on. la direcci´ on de retorno almacenada tras ejecutar el primer (( jal )).word 1 . 2 .  subr-llamada. se perder´ a. cuando se ejecuten las correspondientes instrucciones de vuelta. e llama a otro (o a si mismo) utilizando otra instrucci´ on (( jal )). llama a otra. El siguiente fragmento de c´ odigo ilustra este problema realizando dos llamadas anidadas. almacenar la direcci´ on de retorno. se retornar´ a siempre a la ´ ltima misma posici´ on de memoria.1. dim ( $0 ) beqz $a1 . el contenido original del registro $ra. 5 .data . la instrucci´ on utilizada para llamar a una subrutina es la instrucci´ on (( jal )). Mantener los valores que se han pasado como argumentos a la subrutina. Anidamiento de subrutinas El anidamiento de subrutinas tiene lugar cuando un programa invocador ´ sta. la almacenada en el registro $ra por la u instrucci´ on (( jal )). 8. el programa invocado se convierte en un momento dado en invocador. (( jr $ra )).2. El que una llama a una subrutina y e subrutina pueda llamarse a si misma es lo que se conoce como recursividad. Proporcionar espacio para las variables locales de la subrutina.84 Gesti´ on de subrutinas 8.2. f i n # Paso de p a r a ´ metros para s u m t o t a l # E j e c u t a e l programa s i dim >0 . Por tanto. antes de realizar el salto propiamente dicho.text lw $a1 . Dicho bloque tiene varios prop´ ositos: En el caso de llamadas anidadas. Como se ha visto. almacena la direcci´ on de retorno del programa invo´ ste cador en el registro $ra. 6 . 3 . a su vez. Almacenar los registros que la subrutina necesita modificar pero que el programa que ha hecho la llamada no espera que sean modificados.word 6 . Y si no se hiciera nada para evitar perder la anterior direcci´ on de retorno. Cuando se anidan subrutinas. es decir.s 1 2 A: 3 dim : 4 5 6 main : 7 . cuando se ejecute dicha instrucci´ on.

... . $ t 1 .. . . .. . add $a0 . . .. . ...... . . . . . .. Bloque de activaci´ on de la subrutina 85 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 salto1 : fin : la jal $a0 ... $ t 2 .. ...... .8. .. debe ser capaz de permitir recuperar las direcciones de retorno en orden inverso a su almacenamiento (ya que es el orden en el que se producen los retornos).. Para almacenar y recuperar las direcciones de retorno utilizando una ... .2... .... . . ... . .. · 178 ¿D´ onde se pasa el control del programa tras la ejecuci´ on de la instrucci´ on etiquetada por (( salto1 ))? ¿Qu´ e valor se carga en el registro $ra despu´ es de ejecutar la instrucci´ on etiquetada por (( salto1 ))? · 179 ¿D´ onde se pasa el control del programa tras la ejecuci´ on de la instrucci´ on etiquetada por (( salto2 ))? ¿Qu´ e valor se carga en el registro $ra despu´ es de ejecutar la instrucci´ on etiquetada por (( salto2 ))? · 180 ¿D´ onde se pasa el control del programa tras la ejecuci´ on de la instrucci´ on etiquetada por (( salto3 ))? ¿Qu´ e valor se carga en el registro $ra despu´ es de ejecutar la instrucci´ on etiquetada por (( salto3 ))? · 181 ¿D´ onde se pasa el control del programa tras la ejecuci´ on de la instrucci´ on etiquetada por (( salto4 ))? ¿Qu´ e valor se carga en el registro $ra despu´ es de ejecutar la instrucci´ on etiquetada por (( salto4 ))? · 182 Explica qu´ e ocurre en el programa.. . .... 10 syscall sum total : # .. . . .. A sum total # Llama a l a s u b r u t i n a s u m t o t a l # Finaliza la ejecucio ´n li $v0 . el espacio reservado para este cometido debe poder crecer de forma din´ amica (la mayor´ ıa de las veces no se conoce cu´ antas llamadas se van a producir. . $a0 add $a1 . Dicha estructura de datos debe satisfacer dos requisitos. . . En segundo lugar... . .. . .. . . . . . .. EJERCICIOS ... . ... . .. . . La estructura de datos que mejor se adapta a los anteriores requisitos es la pila. ... . .. .. En primer lugar. .. . pueden depender de los datos del problema). . . . .. $0 salto2 : j a l suma elem # . ... ... ... c´ argalo en el simulador y ejec´ utalo paso a paso... El ejercicio anterior muestra que es necesario utilizar alguna estructura de datos que permita almacenar las distintas direcciones de retorno cuando se realizan llamadas anidadas.. . salto3 : jr $ra Edita el programa anterior. salto4 : jr $ra # Paso de p a r a ´ metros para suma elem # Llama a l a s u b r u t i n a s u m a e l e m sum elem : # ... .. ... . .. .. . .. .

.. .... .. todos los retornos que se produzcan a partir de la u S3.2. . . .. rutina tanto... en el caso de que se realicen llamadas anidadas. Antes de realizar una llamada a otra subrutina (o a si misma).. odigo anterior para que la direcci´ on de · 183 Modifica el fragmento de c´ retorno se apile y desapile de forma adecuada. . siempre que sea posible.. . . En dicha figura se muestra el contenido del registro $ra justo despu´ es de ejecutar una instrucci´ on (( jal )) o (( jr )).. .. Es decir.. . .. Dependiendo del tipo de variables.. ... En el caso de datos de tipo escalar. el registro $ra s´ olo man´ ltimo (( jal )).. .. .. . . . . pero cuando se ejecute el retorno de la rutina S2 se volver´ a de nuevo a la on de un bucle infinito.... el programa invocador deber´ a apilar el registro $ra antes de invocar al nuevo programa y desapilarlo antes de retornar... . se utilizar´ an los registros del procesador que no est´ en ya siendo utilizados. provocando la ejecuci´ La Figura 8. . . .. Es decir.. . .. El retorno de la rutina S3 ser´ a correcto. La Figura 8... . .. EJERCICIOS . Como se puede ver... . . . En dicha figura se muestra cuando se debe apilar y desapilar el registro $ra en la pila para que los retornos se produzcan en el orden adecuado. el contenido del registro $ra formar´ a parte de la informaci´ on que se tiene que apilar en el bloque de activaci´ on de la subrutina.. se deber´ a apilar la direcci´ on de retorno actual.. Variables locales de la subrutina Una subrutina puede requerir durante su ejecuci´ on utilizar variables locales que s´ olo existir´ an mientras se est´ a ejecutando.4 muestra de forma esquem´ atica que es lo que ocurre cuando s´ ı que se almacena la direcci´ on de retorno. . . . . . .... . . ... las variables de tipo estructurado formar´ an parte del bloque de activaci´ on de la subrutina... .3 muestra de forma esquem´ atica que es lo que puede ocurrir si no se almacena la direcci´ on de retorno. . . Pero en el caso de los datos de tipo estructurado. . 8. ... Se puede observar el estado de la pila y del registro $ra justo despu´ es de ejecutar una instrucci´ on (( jal )) o (( jr )).. .. .. En el caso de que sea necesario utilizar la memoria principal. a partir de la llamada a la subrutina S3.. . Por tiene almacenada la direcci´ on de retorno del u ´ ltima llamada.. Por tanto.. ... . la variable deber´ a almacenarse en el bloque de activaci´ on de la subrutina. . retornar´ an a la posici´ on (( dir ret2 )). .... ... se deber´ a desapilar la u on de retorno apilada..2. .. .86 Gesti´ on de subrutinas pila basta con proceder de la siguiente forma.. .. . ... bastar´ a con utilizar los registros no ocupados o ser´ a necesario utilizar la memoria principal. . . . .. posici´ on (( dir ret2 )). se hace necesario el uso de memoria principal. .. .. (( dir ret2 )).. . . . Y ´ ltima direcci´ antes de retornar. .. ..

el contenido original de dichos registros puede perderse en un momento dado. 8. Al inicio de la subrutina se deber´ a reservar espacio en el bloque de activaci´ on para almacenar dichas variables. y por tanto.2.2.3.3: Llamadas anidadas a subrutinas (sin apilar las direcciones de retorno) La forma de utilizar el bloque de activaci´ on para almacenar las variables locales de una subrutina es la siguiente. Almacenamiento de los registros utilizados por la subrutina Como se ha visto en el apartado anterior. Bloque de activaci´ on de la subrutina 87 PP: S1: S2: jal S1 dir_retpp: dir_ret1: jal S2 dir_ret2: jal S3 jr $ra jr $ra $ra=dir_retpp $ra=dir_ret1 $ra=dir_ret2 Llamada subrutina S1 S3: Llamada subrutina S2 S2: Llamada subrutina S3 jal S3 dir_ret2: jr $ra jr $ra $ra=dir_ret2 $ra=dir_ret2 Retorno de S3 Retorno de S2 Figura 8. Y antes del retorno se deber´ a libera dicho espacio. Si la informaci´ on que conten´ ıan dichos registros es relevante para que el programa invocador pueda continuar su .8. la subrutina puede utilizar registros como variables locales.

0($sp) jal S3 dir_ret2: lw $ra.0($sp) addi $sp.$sp.$sp.$sp.$sp.$sp.$sp.$sp.$sp.0($sp) addi $sp.88 Gesti´ on de subrutinas PP: S1: S2: jal S1 dir_retpp: addi $sp.0($sp) jal S3 dir_ret2: lw $ra.−4 sw $ra.−4 sw $ra.4: Llamadas anidadas a subrutinas (apilando las direcciones de retorno) .0($sp) jal S2 dir_ret1: lw $ra.4 addi $sp.4 jr $ra addi $sp.−4 sw $ra.4 jr $ra jr $ra $ra=dir_ret2 pila dir_retpp sp dir_ret1 sp $ra=dir_ret1 pila dir_retpp dir_ret1 sp $ra=dir_retpp pila dir_retpp dir_ret1 Retorno de S3 Retorno de S2 Retorno de S1 Figura 8.−4 sw $ra.0($sp) jal S3 dir_ret2: lw $ra.4 jr $ra $ra=dir_retpp $ra=dir_ret1 pila sp dir_retpp sp jr $ra $ra=dir_ret2 pila dir_retpp dir_ret1 sp Llamada subrutina S1 S3: Llamada subrutina S2 S2: Llamada subrutina S3 S2: addi $sp.0($sp) addi $sp.0($sp) addi $sp.

Los registros $s0 a $s7 ($16 a $23) tambi´ en pueden ser utilizados por el programa invocado para almacenar datos temporales. c ∗ / # define N 6 v o i d main ( ) { i n t A[N] = { 1 . por lo que en el caso de que vayan a ser modificados. los apila en el bloque de activaci´ on. Como ejemplo de c´ omo se utiliza el bloque de activaci´ on se propone el siguiente programa en C del que a continuaci´ on se mostrar´ a una versi´ on equivalente en ensamblador.8. En caso de que lo fuera. para posteriormente recuperar sus valores originales antes de retornar al programa principal. Para disminuir el n´ umero de registros que deben ser guardados y restaurados cada vez que se llame a una subrutina. utilizados para el paso de par´ ametros. 5 . Este planteamiento implica almacenar en primer lugar todos aquellos registros que vaya a modificar la subrutina. En cuanto a qu´ e registros puede modificar o no la subrutina. Bloque de activaci´ on de la subrutina 89 ejecuci´ on tras el retorno. es el programa invocador quien deber´ a apilarlos antes de realizar la llamada y recuperarlos tras el retorno. i f (N> 0) suma (A. 2 . hay que tener en cuenta que los registros $a0 a $a3. Se supone que la informaci´ on que contienen no es relevante para el programa que realiza la llamada. MIPS32 establece el siguiente convenio: Los registros $t0 a $t9 ($8 a $15. La forma en la que se almacena y restaura el contenido de aquellos registros que vaya a sobreescribir la subrutina en el bloque de activaci´ on es la siguiente. 4 .2. } . 1 2 3 4 5 6 7 8 9 10 11 / ∗ program . Una vez finalizada la ejecuci´ on de la subrutina. N ) . antes de modificar el contenido de los registros. y justo antes del retorno. sin embargo. $24 y $25) pueden ser utilizados por el programa invocado (subrutina) para almacenar datos temporales sin que sea necesario guardar sus valores originales. La subrutina. generalmente deber´ an ser preservados. se deber´ an almacenar en el bloque de activaci´ on para posteriormente ser restaurados. estos s´ ı que deben ser almacenados por el programa invocado para posteriormente recuperar su valor original. 6 } . ser´ a necesario almacenar temporalmente dicha informaci´ on en alg´ un lugar. los recupera. 3 . Este lugar ser´ a el bloque de activaci´ on de la subrutina.

text lw $a1 . i ++) suma = suma + A s [ i ] .data .90 Gesti´ on de subrutinas 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 v o i d suma ( i n t ∗ A s . 1 0 syscall #− − − 1− − − a d d i $sp . $sp .s 1 2 A: 3 dim : 4 5 6 main : 7 8 9 10 11 f i n : 12 13 14 s u m t o t a l : 15 16 17 18 19 20 21 22 23 24 25 uno : 26 27 28 29 f o r 1 : 30 31 32 33 . r e t u r n ( suma ) . $0 $ t 1 . } A continuaci´ on se muestra el equivalente en ensamblador del MIPS32 del anterior programa en C. f o r ( i = 0 . 3 . $0 . i <d i m s .  subr-varlocal. 8( $sp ) sw $a0 . $0 beqz $ t 2 .. i ++) B s [ i ] = suma elem (& A s [ i ] . i ++) A s[ i ] = B s[ i ]. 5 . 4 ( $ s p ) sw $a1 . $ t 2 . int i . } i n t suma elem ( i n t ∗ A s . sw $ra . f i n f o r 1 #− − − 2− − − add $a0 . i n t d i m s ) { i n t B s [N ] . la $a0 . f o r ( i = 0 . i n t d i m s ) { int i . i n t suma . suma= 0 . $sp . 4 .word 6 . i <d i m s . 6 . −12 # . −24 # P a r t e p r i n c i p a l de l a s u b r u t i n a add add add $ t 0 . $sp . $0 $ t 2 .word 1 . 0 ( $ s p ) a d d i $sp . beqz $a1 . $0 . 2 . jal sum dim ( $0 ) fin A total li $v0 .. $a1 . $a0 add $a1 . dim s − i ) . f o r ( i = 0 . $ t 1 . i <d i m s .

. 4( $sp ) sw $t2 . . $a1 .... . . EJERCICIOS . .. .. . 12 sw addi addi add lw j finfor1 : add $v0 . . . . ..... −1 .. 4 0 ( $ s p ) for2 : beqz $a1 lw $t1 sw $t1 addi $t0 a d d i $a0 a d d i $a1 j for2 . $sp . −1 $t1 ... 48( $sp ) a d d i $sp ... 4( $sp ) lw $t2 . .. . . 8( $sp ) lw $t1 . . . . −1 finfor2 : #− − − 6− − − lw $ra . $0 #− − − 5− − − lw $a0 . .. $sp . .2. .. . $0 finfor3 0 ( $a0 ) $a0 . .... 4 $ t 2 . for1 $t0 .... . 4 $v0 .. . . $t1 y $t2? ¿Por qu´ · 186 De momento no se ha creado el bloque de activaci´ on de la subrutina ((sum elem)). . ¿a qu´ e crees que es debido? ... . 0( $sp ) j a l suma elem #− − − 4− − − lw $t0 . . .. . $a0 .. $a1 .. . 4 $a1 .. −12 sw $t0 . . $v0 .. 52 # .. . .. . ... . . . . for3 $ra $0 . . 0( $sp ) a d d i $sp .. · 184 Dibuja el bloque de activaci´ on de la subrutina (( sum total )). . .. . $sp . 0 ( $ t 0 ) $t0 .. 4 $a0 . . .... $a0 .. Justifica cada una de las informaciones que forman parte del bloque de activaci´ on. . .......... . ... $t2 .. . $ t 0 $a1 . 4 4 ( $ s p ) lw $a1 ... . .. $sp . .. 4 44( $sp ) $ t 0 .. .. . . $t1 . · 185 e se apilan el contenido de los registros $t0. $t0 . . .. . ... jr $ra sum elem : for3 : finfor3 : add beqz lw addi add addi j jr $v0 . .. finfor2 0( $t0 ) 0 ( $a0 ) $t0 . . . ....8... Bloque de activaci´ on de la subrutina 91 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 #− − − 3− − − a d d i $sp . . 8( $sp ) sw $t1 . .. . . . ..

De esta forma. El desplazamiento ser´ ıa entonces la posici´ on relativa del dato con respecto al puntero de pila. que apunta a la posici´ on de memoria m´ as baja del bloque de activaci´ on (v´ ease la Figura 8. En el modo indexado la direcci´ on del dato se obtiene sumando una direcci´ on base y un desplazamiento. Para conseguir que el desplazamiento de cada uno de los datos sea constante.5: Esquema del bloque de activaci´ on (sin utilizar el registro $fp) Un aspecto que influye en la eficiencia de los programas que manejan subrutinas y sus respectivos bloques de activaci´ on es el modo en el que se accede a la informaci´ on contenida en los respectivos bloques de activaci´ on. basta con disponer de una referencia fija al bloque de activaci´ on. habr´ ıa que variar de manera acorde el desplazamiento necesario para acceder a cada uno de los datos. Parametro 5 Parametro 6 Direcciones de memoria mas altas Registros salvados Crecimiento de la pila Variables locales $sp Direcciones de memoria mas bajas Figura 8.2. El modo m´ as sencillo para acceder a un dato en el bloque de activaci´ on es utilizando el modo indexado. Por ejemplo. se podr´ ıa leer su valor utilizando la instrucci´ on ((lw $t0 . Estructura y gesti´ on del bloque de activaci´ on Como se ha visto. El bloque de activaci´ on visto hasta este momento se muestra en la Figura 8. Como direcci´ on base se puede utilizar el contenido del puntero de pila. sumando el contenido del registro $sp y un determinado desplazamiento se obtendr´ ıa la direcci´ on de memoria de cualquier dato que se encontrara en el bloque de activaci´ on. 8($sp) )). Dicha . utilizar el registro $sp como direcci´ on base para calcular la direcci´ on de un dato presenta un inconveniente: el contenido del registro $sp puede variar durante la ejecuci´ on de la subrutina y. Sin embargo.5). si se ha apilado una palabra en la posici´ on 8 por encima del $sp.4.92 Gesti´ on de subrutinas 8.5. por tanto. el bloque de activaci´ on de una subrutina est´ a localizado en memoria y se implementa por medio de una estructura de tipo pila.

que corresponde al registro $30 del banco de registros. As´ ı que el valor previo del registro $fp deber´ a ser apilado por la subrutina para poder restaurarlo antes de devolver el control al programa invocador. Bloque de activaci´ on de la subrutina 93 referencia se puede almacenar en un registro determinado y dicho registro se puede utilizar entonces como direcci´ on base (en lugar del $sp).2. Parametro 5 Parametro 6 $fp0 (contenido original) $fp Crecimiento de la pila Direcciones de memoria mas altas Registros salvados Variables locales $sp Direcciones de memoria mas bajas Figura 8. el registro $fp (frame pointer. El ensamblador del MIPS32 reserva un registro para dicho fin. Hay que tener en cuenta que. en ingl´ es). cuando se quiera acceder a alg´ un dato apilado por el programa invocador justo antes de llamar a la subrutina se utilizar´ a un desplazamiento positivo respecto a dicha referencia. se utilizar´ a un desplazamiento negativo respecto a dicha referencia. La gesti´ on del bloque de activaci´ on se produce principalmente en los siguientes momentos: Justo antes de que el programa invocador pase el control a la subrutina. puesto que el registro $fp mantiene una referencia fija al bloque de activaci´ on de la subrutina en ejecuci´ on.6: Esquema del bloque de activaci´ on de una subrutina 8. Convenio para la llamada a subrutinas Tanto el programa invocador como el invocado intervienen en la creaci´ on y gesti´ on del bloque de activaci´ on de una subrutina. Por convenio se utiliza como referencia fija al bloque de activaci´ on la direcci´ on de memoria que indica el registro $sp cuando se entra en la subrutina menos 4.6 muestra el bloque de activaci´ se ha descrito. el valor de dicho registro debe ser preservado entre llamadas a subrutinas. .2. on de una subrutina tal y como La Figura 8.5.8. cuando se requiera acceder a alg´ un dato apilado por la subrutina. De esta forma. Por otro lado.

$a0 a $a3. Justo antes de que la subrutina devuelva el control al programa invocador: 1. Almacenar en el bloque de activaci´ on aquellos registros que vaya a modificar la subrutina. e de hacer la llamada. y los restantes se apilan en el bloque de activaci´ on. Actualizar el puntero de bloque de activaci´ on (registro $fp) para que apunte a la direcci´ on m´ as alta del espacio reservado (la misma en la que se ha guardado su valor previo). Almacenar en la pila los registros que deben ser salvados por el invocador.94 Gesti´ on de subrutinas En el momento en que la subrutina toma el control. Almacenar el contenido del registro $fp en la direcci´ on m´ as alta del espacio reservado en el bloque de activaci´ on. Cargar el valor (o valores) que deba devolver la subrutina en los registros $v0 y $v1. Desapilar los registros apilados por la subrutina. El tama˜ no se calcula sumando el espacio en bytes que ocupa el contenido de los registros que vaya a apilar la subrutina ($fp. $ra. $s0 a $s7. 2. Reservar memoria en la pila para el resto del bloque de activaci´ on. excepto el registro $fp. En el momento en el que el programa invocador recupera el control. $a0 a $a3) m´ as el espacio que ocupan las variables locales que se vayan a almacenar en el bloque de activaci´ on. 4. 2. Justo antes de que la subrutina devuelva el control al programa invocador. Seg´ un el convenio. . 2. Cargar los par´ ametros en los lugares establecidos. A continuaci´ on se describe con m´ as detalle qu´ e es lo que debe realizarse en cada uno de dichos momentos. En el momento en que la subrutina toma el control: 1. Justo antes de que el programa invocador pase el control a la subrutina: 1. 3. si al invocador le interesa preservar el contenido ´ stos deben ser apilados antes de algunos de los registros $t0 a $t9. Los cuatro primeros se cargan en registros. Paso de par´ ametros.

En dicha figura aparece enmarcado el bloque de activaci´ on creado por el programa invocador y el invocado.word 1 . Eliminar del bloque de activaci´ on los par´ ametros que hubiera apilado. A ..word 6 . En la Figura 8. 6 . Desapilar el registro $fp.s y contesta a las siguientes cuestiones.$s7. Bloque de activaci´ on de la subrutina 95 3. Copiar el contenido del registro $fp en el registro $sp (con lo que se libera el espacio en pila ocupado por la subrutina para las variables locales). En el momento en el que el programa invocador recupera el control: 1.. dim ( $0 ) beqz $a1 .$ra. siguiendo los pasos que se han descrito.text lw $a1 . 4. f i n la $a0 .2. Recoger los par´ ametros devueltos. Registros salvados $t0..data . 3.7: Estado de la pila despu´ es de una llamada a subrutina Analiza el c´ odigo del programa subr-sc.7 se muestra el estado de la pila despu´ es de que un programa haya invocado a otro.8.$t9 Invocador Parametro 5 Parametro 6 $fp0 (contenido original) $fp Registros salvados Invocado $s0.s 1 2 A: 3 dim : 4 5 6 main : 7 8 .$a3 BA Crecimiento de la pila Direcciones de memoria mas altas Variables locales $sp Direcciones de memoria mas bajas Figura 8. 4 . 5 . 2 . 3 .$a0. 2.  subr-sc. Desapilar los registros que hab´ ıa apilado.

−4( $ f p ) sw $a0 . −12( $ f p ) for2 : beqz lw sw addi addi addi j $a1 . $fp . f i n f o r 1 #− − − 2− − − add $a0 . −8( $ f p ) lw $a1 . $sp . 12 #− − − 4− − − sw $v0 . 0 ( $ t 0 ) addi addi add lw j $t0 . $sp . 1 2 ( $ s p ) a d d i $fp . 4( $sp ) lw $t2 . $a0 add $a1 . $sp . $a0 . 0 ( $ s p ) a d d i $sp . $sp . 12 sw $ r a . $0 #− − − 5− − − lw $a0 . −8( $ f p ) sw $a1 . $a1 . −1 $t1 . $0 $ t 1 . $a1 . 4 $a1 . 4 −8( $ f p ) finfor1 : add $ t 0 . $0 lw $fp . 4( $sp ) sw $t2 . $sp . for1 $t0 . $sp . 10 syscall sum total : #− − − 1− − − a d d i $sp . −4( $ f p ) add $sp . for2 finfor2 0( $t0 ) 0 ( $a0 ) $t0 . 4 . $0 . 8( $sp ) lw $t1 . $ t 2 . 0( $sp ) a d d i $sp . $t2 . $sp . −12( $ f p ) a d d i $sp . −16 sw $fp .96 Gesti´ on de subrutinas 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 jal fin : subr li $v0 . $0 beqz $ t 2 . $ t 1 . $t1 . $t1 . $t0 . 4 $ t 2 . $t1 . $sp . $0 #− − − 2− − − a d d i $sp . 0( $sp ) j a l suma elem #− − − 3− − − lw $t0 . −24 add add add for1 : $ t 0 . 4 $a0 . 8( $sp ) sw $t1 . $a0 . −12 sw $t0 . −1 finfor2 : #− − − 6− − − lw $ r a . $0 $ t 2 .

$t1 y $t2? Dibuja el estado de la pila despu´ es de este apilamiento. . $sp . · 189 Dibuja y detalla (con los desplazamientos correspondientes) el bloque de activaci´ on creado por la subrutina (( sum total )). 0 lw $fp . $sp . f i n f o r 3 lw $ t 0 . $0 beqz $a1 . . · 193 Dibuja el bloque de activaci´ on de la subrutina ((suma elem)). . . . . . · 194 Indica el contenido del registro $ra una vez ejecutada la instrucci´ on (( jr $ra )) de la subrutina ((suma elem)) ¿D´ onde se recupera el valor que permite retornar al programa principal? . . . . . . . . $0 . 4 #− − − 9− − − jr $ra . . . $fp . · 188 Indica el contenido del registro $ra una vez ejecutada la instrucci´ on (( jal sum total )). . EJERCICIOS . . . . . −4 sw $fp . . 0 ( $a0 ) a d d i $a0 . Indica cu´ antos par´ ametros se pasan. . . . $a1 . . . . · 190 ¿Por qu´ e la subrutina (( suma total )) apila en el bloque de activaci´ on el contenido de los registros $t0. . . . . . el lugar por donde se pasan y el tipo de par´ ametros. . . . 4 add $v0 . . . . . . . . 0 add $v0 . . . 0 ( $ s p ) a d d i $sp . · 191 Indica el fragmento de c´ odigo del programa ensamblador donde se antos par´ ametros pasan los par´ ametros a la subrutina ((suma elem)). . Bloque de activaci´ on de la subrutina 97 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 jr $ra suma elem : #− − − 7− − − a d d i $sp . . Justifica el almacenamiento de cada uno de los datos que contiene el bloque de activaci´ on. −1 j for3 for3 : finfor3 : #− − − 8− − − a d d i $sp . . . . . . . 0 ( f p ) a d d i $fp . $ s p . . . . . .2. . $a0 . . · 192 Indica el contenido del registro $ra una vez ejecutada la instrucci´ on (( jal suma elem)). $ t 0 a d d i $a1 . . . . $v0 . Indica cu´ se pasan. . el lugar por donde se pasan y el tipo de par´ ametros. · 187 Localiza el fragmento de c´ odigo del programa ensamblador donde se pasan los par´ ametros a la subrutina (( sum total )). .8.

. . else return ncsr(n-1. La subrutina ((subr1)) tomar´ a como entrada una matriz de enteros de dimensi´ on n × m y devolver´ a dicha matriz pero con los elementos de cada una de sus filas invertidos. . ..... Es decir.. El programa debe tener la siguiente estructura: .. .. .. . .. .. . . . .. .... . .. . . ... ... int k) { if (k>n) return 0. La subrutina ((subr3)) devuelve un 1 si el contenido de los dos vectores que se le pasa como par´ ametros son iguales. .. Por ejemplo.. . . . . .. . .. La subrutina ((subr1)) devolver´ a un 1 si las dos cadenas de caracteres que se le pasan como par´ ametro contienen el mismo n´ umero de los distintos caracteres que las componen. . .. . . . . . . .98 Gesti´ on de subrutinas · 195 Localiza el fragmento de c´ odigo donde se desapila el bloque de activaci´ on de la subrutina (( sum total )). La La subrutina ((subr1)) se apoyar´ subrutina ((subr2)) tiene como finalidad calcular cu´ antos caracteres de cada tipo tiene la cadena que se le pasa como par´ ametro.. .... Suponer que las cadenas est´ an compuestas por el conjunto de letras que componen el abecedario en min´ usculas.. . ((subr2)) y ((subr3)). . · 198 Desarrolla tres subrutinas en ensamblador. . . .. . la cadena ((ramo)) es un anagrama de ((mora)). . ... Problemas del cap´ ıtulo . .. .k)+ncsr(n-1. } · 200 Desarrolla un programa en ensamblador que calcule el m´ aximo de un vector cuyos elementos se obtienen como la suma de los elementos fila de una matriz de dimensi´ on n × n... . else if (n == k || k == 0) return 1. Para realizar la inversi´ on de cada una de las filas se deber´ a utilizar a tomar como entrada la subrutina ((subr2)). .. la subrutina ((subr2)) deber´ un vector de enteros y devolver dicho vector con sus elementos invertidos.. .. . · 199 Desarrolla en ensamblador la siguiente subrutina recursiva descrita en lenguaje C: int ncsr(int n.. Es decir. .. devolver´ a un 1 si una cadena es un anagrama de la otra. . . .k-1).. .. . .. ... ................ ... . ((subr1)). . . EJERCICIOS . · 196 Indica el contenido del registro $ra antes de ejecutar la instrucci´ on (( jr $ra )) en la subrutina (( sum total )).... · 197 Desarrolla dos subrutinas en ensamblador: ((subr1)) y ((subr2)).3. . a en las subrutinas ((subr2)) y ((subr3)).... 8..

Se le pasar´ a como par´ ametros un vector y su dimensi´ on y devolver´ a el m´ aximo de dicho vector......... ((subr3)) calcular´ a el m´ aximo de los elementos de un vector.3.. . qui´ en devolver´ a el m´ aximo buscado....... El programa principal se encargar´ a de realizar la entrada de la dimensi´ on de la matriz y de sus elementos y llamar´ a a la subrutina ((subr1)).... Se le pasar´ a como par´ ametros un vector y su dimensi´ on y la subrutina devolver´ a la suma de sus elementos...8.. El programa principal deber´ a almacenar este dato en la posici´ on etiquetada con ((max))........ Se le pasar´ a como par´ ametros la matriz...... .......... su dimensi´ on y devolver´ a el m´ aximo buscado.. ((subr2)) y ((subr3))................ Problemas del cap´ ıtulo 99 Deber´ a estar compuesto por 3 subrutinas: ((subr1)). ((subr1)) calcular´ a el m´ aximo buscado. ((subr2)) calcular´ a la suma de los elementos de un vector............

.

. . Problemas del cap´ ıtulo . .4. . . por ejemplo. . . . . . Tambi´ en existen perif´ ericos que sirven para introducir informaci´ on en el ´ computador. . 9. Perif´ ericos de salida son. . . . los teclados y los esc´ aneres. . . . . . . . Los dispositivos que permiten la comunicaci´ on de un computador con el exterior. . Perif´ ericos de entrada son. . . . Entrada/Salida de datos . . . 9. . . 9. . Estos perif´ ericos reciben el nombre de perif´ ericos de salida. . . . . tambi´ Por u en hay perif´ ericos que permiten que la informaci´ on vaya en los dos sentidos. por ejemplo. .5. . Dispositivos perif´ ericos en el simulador SPIM Entrada de datos desde el teclado . . . . Algunos perif´ ericos sirven para que el computador presente informaci´ on o lleve a cabo determinadas acciones. . . . 9 104 106 107 109 110 ´ DE LA ENTRADA / SALIDA G ESTI ON MEDIANTE CONSULTA DE ESTADO Los computadores no funcionan de forma aislada. con otros computadores o con otros aparatos electr´ onicos.2. . . ´ ltimo. . . . . Perif´ ericos 101 . . . reciben el nombre de perif´ ericos. . Son los llamados perif´ ericos de entrada/salida. . . . . . Deben relacionarse e interactuar con el entorno que les rodea. los monitores y las impresoras. . . 9. . .1. . Estos reciben el nombre de perif´ ericos de entrada. . . . . . Salida de datos por pantalla . .CAP´ ITULO ´ Indice 9. . Ya sea con sus usuarios.3.

El hardware encargado de facilitar la comunicaci´ on del procesador con uno o varios perif´ ericos recibe el nombre de controlador de E/S. Pero adem´ as. cada fabricante utiliza una determinada tecnolog´ ıa para la fabricaci´ on de sus productos. Al fin y al cabo. Los controladores de E/S ocultan al procesador las dificultades propias de la gesti´ on de los diferentes dispositivos y proporcionan una interfaz com´ un al procesador. Adem´ as de por las funciones que realizan y de los requerimientos de comunicaci´ on. la velocidad con la que se transmite la informaci´ on es crucial. o otro tipo de material. dicho controlador de E/S cumple con una serie de normas que son comunes a todos los controladores de E/S para discos duros y que permiten la comunicaci´ on del disco duro con el procesador. debe enviar la informaci´ on de qu´ e teclas se est´ an pulsando al computador. programas. Por otro lado. por tanto. Los controladores proporcionan una serie de registros que son direccionables por el procesador y que son los utilizados para realizar las operaciones de E/S. los perif´ ericos tambi´ en se diferencian por la tecnolog´ ıa que emplean. Pero en el caso de un disco duro. que en el peor de los casos utilizar´ a m´ as de dos dedos y teclear´ a sin mirar el teclado. Cada uno de ellos realiza funciones muy espec´ ıficas y presenta determinados requerimientos de comunicaci´ on. e ermicas. De hecho. Por ejemplo. los discos duros y las pantallas t´ actiles. l´ aseres. un disco duro permite almacenar y recuperar informaci´ on digital: documentos.102 Gesti´ on de la entrada/salida mediante consulta de estado de entrada/salida son. Por ejemplo. Cada una de ellas utiliza una tecnolog´ ıa distinta para llevar a cabo el mismo fin: presentar sobre papel. De hecho. de inyecci´ on de tinta. Los registros que habitualmente se encuentran en los controladores de E/S son: . ser´ a tanto mejor cuanto m´ as r´ apido permita la lectura o escritura de la informaci´ on. la velocidad con la que debe transmitir dicha informaci´ on no tiene que ser demasiado alta. Por ejemplo. en el caso de los discos duros. Toda esta variedad de funciones. una determinada informaci´ on. por sublimaci´ on. es decir. Sin embargo. etc. Cada disco duro incorpora un controlador de E/S que conoce las peculiaridades de funcionamiento dicho disco duro en concreto. por la forma en la que llevan a cabo su cometido. existe una gran variedad de perif´ ericos. de impacto. por ejemplo. necesidades de comunicaci´ on y tecnolog´ ıas hace necesaria la existencia de hardware encargado de facilitar la comunicaci´ on del procesador con los distintos perif´ ericos. el teclado estar´ a siendo utilizado por una persona. en ´ stas se pueden clasificar en: t´ el caso de las impresoras. un teclado permite introducir caracteres en un computador y. etc.

el controlador cargar´ a en este registro el dato obtenido por el perif´ erico. Esta la arquitectura x86. por contra. Para realizar una operaci´ on de E/S con un determinado perif´ erico. El procesador lee o escribe en los registros de los controladores de E/S de la misma forma que lo har´ ıa en cualquier ´ es la modalidad utilizada por MIPS. En este caso se dice del sistema de E/S que est´ a aislado. Por tanto. Un registro de estado. De esta forma. En una operaci´ on de salida.Gesti´ on de la entrada/salida mediante consulta de estado 103 Un registro de control. El acceso a dichos registros puede conseguirse de una de las siguientes formas: Haciendo que los registros formen parte del espacio de direcciones de memoria del computador. Dicha sincronizaci´ on se puede llevar a cabo de dos formas distintas. Almacena el dato que se va a intercambiar con el perif´ erico durante una operaci´ on de entrada o salida. es necesario esperar a que dicho dato est´ e disponible. el controlador enviar´ a al perif´ erico el dato indicado por el procesador. En este caso se dice del sistema de E/S que est´ a mapeado en memoria. En una operaci´ on de entrada. seg´ un se utilice para realizar operaciones de entrada o salida. el procesador podr´ a leer este registro y obtener el dato proporcionado por el perif´ erico. cuando se env´ ıa un dato a un perif´ erico es necesario esperar a que el env´ ıo se haya concluido antes de enviar un nuevo dato. que recibe el nombre de E/S por consulta de estado. De igual forma. Cuando se pide un dato a un perif´ erico. Uno de los aspectos m´ as importantes en la comunicaci´ on entre el procesador y un perif´ erico es la correcta sincronizaci´ on entre ambos. otra parte de la memoria. En este cap´ ıtulo se explorar´ a la forma m´ as sencilla de sincronizaci´ on. dichos registros deben ser accesibles por el procesador. Esta Haciendo que el computador disponga de un mapa de direcciones para la E/S independiente del mapa de direcciones de memoria. El procesador lee o escribe en los registros de los controladores de E/S utilizando instrucciones es´ es la modalidad utilizada por los procesadores basados en peciales. el procesador debe leer o escribir en los registros de su controlador de E/S. Lo utiliza el procesador para indicar al controlador qu´ e operaci´ on de E/S se debe realizar. Un registro de datos. . ser´ a el procesador quien cargue en este registro el dato que se debe enviar al perif´ erico. Este registro tambi´ en recibe el nombre de puerto de entrada o salida. Almacena el estado del perif´ erico y de la operaci´ on de E/S que se acaba de realizar. De esta forma.

la sincronizaci´ on se realiza por medio de un bucle de espera (espera activa) en el que se comprueba el estado del perif´ erico.104 Gesti´ on de la entrada/salida mediante consulta de estado Cuando la gesti´ on de la E/S se realiza por medio de la consulta de estado. Para que esto sea as´ ı. y un perif´ erico de salida. Dispositivos perif´ ericos en el simulador SPIM SPIM simula el funcionamiento de dos dispositivos de E/S. hay que realizar una operaci´ on de salida sobre la pantalla. un teclado. En esencia. El teclado simulado permite la introducci´ on de caracteres desde el teclado del computador. adem´ as de realizar una operaci´ on de entrada sobre el teclado.1). el car´ acter introducido no se imprime autom´ aticamente en la pantalla. Es decir. 9. Dicho bucle termina cuando al com´ ste indica que est´ probar el estado del perif´ erico. una vez obtenido el car´ acter. e a listo para intercambiar la informaci´ on requerida.1: Dispositivos perif´ ericos en el simulador SPIM Cada controlador de E/S posee dos registros: uno de control/estado y otro de datos (v´ ease la Figura 9. si se pulsa una tecla.1. Un perif´ erico de entrada. Los registros del controlador del teclado son: Registro de control/estado Este registro tiene asignada la direcci´ on de memoria 0xFFFF 0000. una pantalla (v´ ease la Figura 9. Cuando se escribe en dicha posici´ on de me- . Ambas unidades son independientes. el programa que se comunica con un perif´ erico es quien se encarga de la sincronizaci´ on entre el procesador y dicho perif´ erico. Cada uno de dichos registros tiene asignada una direcci´ on dentro del espacio de direcciones de memoria.2). Procesador Unidad de Control Memoria Controladores E/S Transmisor Ruta de Datos Receptor Figura 9. La pantalla simulada permite escribir caracteres en una de las ventanas del simulador. A continuaci´ on se describen los registros de control/estado y de datos de los controladores del teclado y la pantalla.

Su funcionalidad es similar a la del mismo registro en el controlador del teclado. En el pr´ oximo cap´ ıtulo se explicar´ a su funcionalidad.1. se ignoran las escrituras que se hagan sobre e cambia autom´ aticamente de 0 a 1 cuando se teclea un car´ acter en el teclado. e Registro de control/estado Est´ a localizado en la direcci´ on de memoria 0xFFFF 0008.9.2: Registros de los dispositivos de E/S de SPIM moria. tan s´ olo se usan dos de sus bits: El bit 0 de este registro. Dispositivos perif´ ericos en el simulador SPIM No usado 1 1 Control del receptor (0xFFFF0000) Interrupt Enable No usado 8 Datos del receptor (0xFFFF0004) byte recibido Ready 105 No usado 1 1 Control del transmisor (0xFFFF0008) Interrupt Enable No usado 8 Ready Datos del transmisor (0xFFFF000C) byte transmitido Figura 9. Registro de datos Este registro tiene asignada la direcci´ on 0xFFFF 0004. Cuando se realiza una operaci´ on de lectura sobre dicha posici´ on de memoria. Este bit Es decir. Los 8 bits de menor peso de este registro alma´ ltimo car´ cenan el c´ odigo ASCII del u acter pulsado en el teclado. Es de s´ olo lectura y su contenido cambia cuando se pulsa un nuevo car´ acter en el teclado. En realidad. S´ olo se usan dos de sus bits: . El bit 1 de este registro es un bit de escritura que se deber´ a fijar a 0. Los dem´ as bits contienen ceros. Se pone autom´ aticamente a 0 en el momento que el procesador recoge el car´ acter introducido. se accede al registro de control. ´ l. llamado ready. ´ stos son: En cuanto a los registros del controlador de la pantalla. es un bit de s´ olo lectura. se accede al registro de estado.

´ ltimo car´ el bit ready estar´ a a 0. Cuando se escribe un valor en dicha posici´ on de memoria. e l tama n ˜o del buffer bne $v0 . Si la pantalla no est´ a preparada. En el pr´ oximo cap´ ıtulo se explicar´ a su funcionalidad. Es un registro de s´ olo escritura. p o r a h o r a ] # [ En b l a n c o .106 Gesti´ on de la entrada/salida mediante consulta de estado El bit 0. 0 x f f f f # $ a1 < − 0xffff0000 # ( d i r b a s e de l o s r e g i s t r o s de E / S ) la $a0 . −1 # D e c r . c t r # ¿Se ha l l e n a d o e l b u f f e r ? li $s0 . las escrituras en el registro de datos del controlador se ignorar´ an. 0 ( $a0 ) # Almacena e l d a t o en e l b u f f e r a d d i $a0 . b u f f e r # Carga l a d i r e c c i o ´ n del buffer lw $v0 . llamado ready. es de s´ olo lectura. d a t a 0 x10010000 .2. p o r a h o r a ] # [ En b l a n c o . $a0 . Si e ıa ´ ltimo car´ est´ a ocupada escribiendo en la pantalla el u acter enviado. −1 # [ En b l a n c o . los 8 bits de menor peso de dicho valor se env´ ıan a la pantalla. el bit ready pasar´ a a 1. 1 # Incrementa el puntero del b u f f e r a d d i $v0 . Indica si se ha termi´ sta todav´ nado de escribir el car´ acter enviado en pantalla. La operaci´ on se va a realizar sobre el teclado del simulador SPIM. 9. S´ olo se debe escribir en el registro de datos del controlador cuando el bit ready valga 1. 0 x00 sb $s0 . Si ya se ha escrito el u acter en la pantalla.space 7 # Tama n ˜o del b u f f e r # B u f f e r donde s e a l m a c e n a n l o s # cara ´ c t e r e s que s e p u l s a n main : ctr : fin : # Zona de i n s t r u c c i o n e s . $0 . los caracteres enviados no se imprimir´ an en pantalla. 4 ( $a1 ) # Lee d e l p u e r t o d e l t e c l a d o sb $s0 .  esc-lee.text l u i $a1 . Entrada de datos desde el teclado En este apartado se muestra un ejemplo de c´ omo se lleva a cabo una operaci´ on de entrada mediante la t´ ecnica de E/S programada por consulta de estado. El bit 1 de este registro es un bit de escritura que se deber´ a fijar a 0. 0 ( $a0 ) # Almacena f i n de c a d e n a en b u f f e r li $v0 . $v0 . 1 0 syscall # Finaliza la ejecucio ´n . El siguiente programa lee los caracteres introducidos desde el teclado sin utilizar ninguna t´ ecnica que sincronice las operaciones de entrada. $v0 . Registro de datos Este registro tiene asignado la direcci´ on 0xFFFF 000C. Es decir.word 7 . l o n g ( $0 ) # Carga l a l o n g i t u d d e l b u f f e r a d d i $v0 .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 long : buffer : # Zona de d a t o s . p o r a h o r a ] lb $s0 .

. .... La operaci´ on se va a realizar sobre la pantalla del simulador SPIM. .. . . . Para ello.. . por lo tanto. .. . . . . el programa ha finalizado sin que se haya podido introducir nada por el teclado.. .... .. . . .. . .. .. ... . . ... . .. 9. . Si sit´ uas el cursor del rat´ on sobre la ventana de la pantalla y tecleas 6 letras.. .. . .. ... . .... . . . . (NOTA: el programa s´ olo lee del teclado.... .. . .. aparecen los c´ odigos ASCII de las letras tecleadas.... ... EJERCICIOS . · 202 Describe con detalle qu´ e hace el fragmento de c´ odigo anterior. ... . ... ..3. . Esto servir´ a para indicar que la entrada de datos ha terminado antes de que se haya llenado el (( buffer ))..... . ... en hexadecimal). se tiene que almacenar dicho car´ acter seguido del car´ acter de fin de cadena.. . . Como habr´ as podido comprobar.. ..3... .. Salida de datos por pantalla En este apartado se describe c´ omo se realiza una operaci´ on de salida utilizando la t´ ecnica de E/S programada por consulta de estado. $t0 . . . . mientras dure la ejecuci´ on del programa no se ver´ a nada de lo que se est´ e tecleando. . . . carga el programa anterior y ejec´ utalo.. ¿Qu´ e tipo de instrucci´ on es? ¿Por qu´ e se utiliza ese tipo de instrucci´ on? nadir la siguiente funcionalidad: · 205 Modifica de nuevo el programa para a˜ cuando el usuario pulse la tecla de retorno de carro.9. ((\n)) (0x0d. EJERCICIOS . . 0 ( $a1 ) andi $t0 .... . el programa acaba. 0x00...... . . .. . Analiza qu´ e ocurre.. . .. . .. . .. .. .. ..... . .... . 1 beqz $ t 0 . .. Al finalizar su ejecuci´ on.. . ... · 203 Comprueba que el nuevo programa funciona de la siguiente forma.. .) · 204 Indica qu´ e instrucci´ on ejecuta el procesador para recoger el dato almacenado en el registro de datos (introducido a trav´ es del teclado).. · 201 Ejecuta el simulador XSPIM con la opci´ on ((-mapped io)). .. .. . ..... .. . . .. XSPIM refresca el contenido de los paneles y entonces se puede observar que a partir de la direcci´ on de memoria (( buffer )).. .. Para que el programa funcione correcta´ nicamente cuando se haya pulsado mente se deber´ a leer el puerto de entrada u una tecla. . . ..... ... .... . . .. . ... .... . . .. . . Salida de datos por pantalla 107 . . . se debe modificar el programa anterior incluyendo el siguiente fragmento de c´ odigo a partir de la etiqueta (( ctr )): 14 15 16 ctr : lb $ t 0 .. . ... . ...... ..... . . .. .. . no muestra por pantalla lo que se escribe. . . .. ... c t r ...... .. .. .. . .. .. . . . . ... .

. . . . $ t 0 . . . 0 ( $a0 ) # # # # # # # # main : $ a0 < − 0 xFFFF0000 ( d i r b a s e de l o s r e g i s t r o s de E / S ) Carga l a d i r e c c i o ´ n de l a c a d e n a Lee un b y t e de c a d e n a [ B u c l e de r e t a r d o ] E s c r i b e en l a p a n t a l l a I n c r e m e n t a e l p u n t e r o de c a d e n a Lee e l s i g u i e n t e b y t e de c a d e n a ¿Se ha l l e g a d o a l f i n a l de c a d e n a ? [ B u c l e de r e t a r d o ] E s c r i b e en l a p a n t a l l a e l c a r a c t e r \ 0 ctr1 : sb addi lb bne ctr2 : sb $s0 . . . . . .  esc-escribe. . . . . . . . . 1 0 syscall # Finaliza la ejecucio ´n Ejecuta el programa en el simulador (recuerda ejecutar XSPIM con la opci´ on ((-mapped io))). para mostrarlos en la pantalla del simulador. . ” # Zona de i n s t r u c c i o n e s . . c o n t 2 # [ B u c l e de r e t a r d o ] # R e t a r d o en f u n c i o ´ n d e l v a l o r de $ t 0 # [ F i n b u c l e de r e t a r d o ] . no se muestra en la pantalla toda la frase almacenada en memoria. . . . . a s c i i z ” E s t o e s un t e x t o de p r u e b a . . . d a t a 0 x10010000 . . no se ha implementado. 0xC ( $a1 ) $a0 .text l u i $a1 . . . . . . −1 bnez $ t 0 . . .108 Gesti´ on de la entrada/salida mediante consulta de estado El siguiente programa lee los caracteres almacenados en memoria a partir de la direcci´ on ((cadena)) y los escribe en el puerto de salida. c o n t 1 # [ B u c l e de r e t a r d o ] # R e t a r d o en f u n c i o ´ n d e l v a l o r de $ t 0 # [ F i n b u c l e de r e t a r d o ] 21 22 23 24 ctr2 : cont2 : li $ t 0 . . . . 0xC ( $a1 ) $s0 $a0 $s0 $s0 . . 10 a d d i $ t 0 . . . . . . $ t 0 . . carga el nuevo programa en el simulador y ejec´ utalo. EJERCICIOS . . . .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 cadena : # Zona de d a t o s . 0 x f f f f # # la $a0 . · 206 Es posible que ahora aparezcan m´ as caracteres de la cadena en la pantalla ¿Los caracteres que aparecen tienen alg´ un sentido? ¿Forman parte de la cadena? ¿Siguen alg´ un patr´ on? . . Inserta ahora los siguientes fragmentos de c´ odigo d´ onde antes s´ olo estaban las l´ ıneas etiquetadas con (( ctr1 )) y (( ctr2 )): 12 13 14 15 ctr1 : cont1 : li $ t 0 . la sincronizaci´ on necesaria para que la operaci´ on de salida tenga lugar de una forma ordenada. . Como puedes comprobar. c t r 1 li $v0 . 1 0 ( $a0 ) $0 . . . . . al igual que ocurr´ ıa en el apartado anterior. F´ ıjate en que se ha puesto 10 como valor inicial del registro $t0 en los dos bucles de retardo. . . . . . . . por el momento. . . . . 10 a d d i $ t 0 . . . . c a d e n a # lb $s0 . −1 bnez $ t 0 . Sin embargo.

. jal lb jal sb addi beq wi $t7 wo $t7 $s0 $t7 instrucciones 0xFFFF l o n g ( $0 ) $s0 .... f i n # Lee d e l t e c l a d o # E s c r i b e en l a p a n t a l l a # ¿Se ha p u l s a d o r e t o r n o de c a r r o ? ...4. Sin embargo..9..4....... $t6 ..... 9.. Entrada/Salida de datos 109 · 207 Sustituye el n´ umero 10 que aparece en las l´ ıneas 13 y 22 por n´ umeros cada vez mayores y comprueba si con cada modificaci´ on del programa aparecen m´ as caracteres de la cadena en la pantalla...... $s0 ...... a d d i $s0 .. −1 .. −1 0x0D # D i r b a s e de l o s r e g i s t r o s de E / S # C a r a c t e r de r e t o r n o de c a r r o ’ \ n ’ ctri : .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 long : # Zona de d a t o s .. d a t a 0 x10010000 . lw $s0 .word 10 # Tama n ˜o del b u f f e r main : # Zona de . ¿Qu´ e tipo de instrucci´ on es? ¿Porqu´ e se utiliza ese tipo de instrucci´ on? . se ha omitido a prop´ osito el c´ odigo de las rutinas ((wi)) y ((wo)) que deben realizar el control de la consulta de estado de los perif´ ericos de entrada y salida......text l u i $t1 ................ 4( $t1 ) .....  esc-lee-escribe. modifica el c´ odigo para que realice el control de la salida de datos por la pantalla mediante consultas de estado (en lugar de utilizar los bucles de retardo).......... li $t6 . ¿A partir de qu´ e valor aparece la cadena completa? · 208 ¿Qu´ e se est´ a haciendo realmente al incrementar el valor asignado a $t0? · 209 ¿Crees que el n´ umero que permite ver toda la cadena ser´ ıa v´ alido si se ejecutara el programa en un computador m´ as o menos r´ apido que el que has utilizado? ¿Por qu´ e motivo? · 210 Tomando como ejemplo la secci´ on anterior. Entrada/Salida de datos El siguiente c´ odigo lee los caracteres pulsados desde el teclado (hasta un total de 10) y los muestra por la pantalla.. 0xC ( $ t 1 ) ... respectivamente.. · 211 ¿Servir´ ıa este programa para ser ejecutado en un computador distinto al que has utilizado? ¿Por qu´ e motivo? · 212 Indica qu´ e instrucci´ on ejecuta el procesador para que el dato que se va a imprimir en la pantalla se almacene en el registro de datos del transmisor.

. . b) En hexadecimal.. . .. 0 25 j a l wo 26 sb $ t 7 . .... ... Comprueba su funcionamiento en el simulador.. .. completa las rutinas de control de los perif´ ericos. ... EJERCICIOS ...... . .. . . . muestre su valor por la pantalla: a) En decimal. . ... ...110 Gesti´ on de la entrada/salida mediante consulta de estado 19 bne $s0 .. .. .5... . . ... .. . .. . ... . ... ´ nica ru· 214 Modifica el c´ odigo del programa anterior para utilizar una u tina de consulta de estado que tome como par´ ametro el registro de control del perif´ erico y sirva para realizar tanto la sincronizaci´ on de la entrada como la de la salida. .. . · 217 Desarrolla un programa que. ... $0 .. · 215 Desarrolla un programa en ensamblador que... .. .. . .. .... .. . . . . . .... dada una direcci´ on de memoria. . · 213 Bas´ andote en los ejemplos anteriores. .. ... . ..... . .. .... ...... .. . 0x0A 22 j a l wo 23 sb $ t 7 . Comprueba el funcionamiento del programa en el simulador. .... Problemas del cap´ ıtulo Los ejercicios propuestos a continuaci´ on deben realizarse sin utilizar la on del instrucci´ on (( syscall )) de llamada al sistema —salvo para la finalizaci´ programa. .. .. .. c t r i 20 j cero 21 f i n : li $ t 7 ... . · 216 Desarrolla un programa que pida un entero por el teclado y lo guarde en memoria. ... . .. . .. .... . .. .. ... ... . .. .. .. . . . . .. . . .. ... .. .. .. . . .. . . . .. ... . . ... .... . . ... . . muestre por la pantalla el contenido de los diez bytes de memoria almacenados a partir de dicha direcci´ on. . .. . . .... ... EJERCICIOS . .. 1 0 29 syscall 30 31 # −<[ C o n s u l t a d e l e s t a d o de l a 32 wi : 33 34 # −<[ C o n s u l t a d e l e s t a d o de l a 35 wo : # ¿Se ha l l e n a d o e l b u f f e r ? # E s c r i b e en l a p a n t a l l a # E s c r i b e en l a p a n t a l l a # Finaliza la ejecucio ´n entrada ]>− salida ]>− . 0xC ( $ t 1 ) 27 28 l i $v0 . . . .. . . . $t7 . dado un n´ umero entero almacenado en memoria. ((wi)) y ((wo))... .. .. .. . . ... Expresa el valor de cada byte en hexadecimal y separa la representaci´ on de cada uno de los bytes con guiones (((-))). . .. . ...... . . .. 9.... . .. ... .. . 0xC ( $ t 1 ) 24 c e r o : andi $t7 ..

. . Excepciones software . . . . . . . 10. . . . . . . . . . . . . . . . Opciones del programa SPIM para la simulaci´ on de interrupciones . . .4. . . . 10. . . . . . . .1. Cuando se completa una operaci´ on de entrada o salida. . . . . . . 10. . . .ITULO CAP´ 10 . 10. . . .5. Tratamiento de las excepciones .2. . . . Registros para el tratamiento de las excepciones . parte de la potencia de c´ alculo de un computador se malgasta en una tarea que la mayor parte de las veces ser´ a improductiva.6. . . . En el cap´ ıtulo anterior se ha visto c´ omo gestionar la entrada y salida de un computador utilizando la t´ ecnica de consulta de estado. Una gesti´ on m´ as eficiente de la entrada y salida conlleva que sean los propios dispositivos los que avisen al procesador en el momento en el que se haya completado una operaci´ on de entrada o salida. . . . . Interrupciones . . . . Por tanto. . . . . . . . . . . Problemas del cap´ ıtulo . . . . 124 124 127 141 ´ DE LA ENTRADA / SALIDA G ESTI ON MEDIANTE INTERRUPCIONES ´ Indice 10. . . al tener que consultar el estado de los dispositivos. La t´ ecnica de consulta de estado obliga al procesador a encargarse de revisar peri´ odicamente el estado de los distintos dispositivos de entrada y salida. . . 10. . .3. . . . . . . . . 117 . . . . . . el dispositivo genera lo que se conoce como una 111 . 113 . . . . . Cuando podr´ ıa estar realizando en su lugar otro tipo de tareas.

el procesador debe disponer de hardware espec´ ıfico. Es decir. comprueba el estado de la entrada de interrupci´ on. y antes de comenzar la ejecuci´ on de la siguiente instrucci´ on. el programa que estaba siendo ejecutado no debe verse afectado por el hecho de que se haya producido una interrupci´ on. Permite que el procesador y los perif´ ericos trabajen de forma paralela. Para atender dicha petici´ on. el procesador debe ser capaz de comprobar si alg´ un perif´ erico ha generado una petici´ on y de llevar a cabo las acciones necesarias para su tratamiento. el procesador debe ser capaz de almacenar el ´ ste se encontraba antes de llamar a dicha rutina y de recupeestado en el que e rar dicho estado antes de devolver el control al programa original. En primer lugar. el procesador puede estar ejecutando instrucciones que resuelven otra tarea distinta o atendiendo a otro perif´ erico. Si no dispusiera de dicho hardware. . de excepciones. Dicha entrada ser´ a la que activar´ an los perif´ ericos para indicar que est´ an generando una interrupci´ on y que solicitan la atenci´ on del procesador. el procesador no pierde el tiempo interrogando peri´ odicamente a los dispositivos para saber si se ha completado o no una operaci´ on de entrada o salida. Para soportar la gesti´ on de la entrada y salida por medio de interrupciones. En segundo lugar. Una vez completa la ejecuci´ on de la instrucci´ on en curso. Adem´ as de los procesos de entrada y salida. Si dicha entrada est´ a activa. durante el funcionamiento de un computador se pueden producir otra serie de eventos que requieren ser tratados de forma inmediata por el procesador. De esta forma. La forma en la que el procesador comprueba si se ha generado una interrupci´ on es la siguiente. ´ ltimo lugar. Mientras un determinado perif´ erico est´ a realizando una operaci´ on de entrada y salida. sabe que hay una petici´ on de interrupci´ on pendiente. llamada en ocasiones IRQ (Interruption ReQuest). transfiere el control a una rutina especial llamada rutina de tratamiento de interrupciones (RTI). puesto que el tratamiento de una interrupci´ En tercer y u on implica el dejar de ejecutar el programa en curso y transferir el control a la rutina de tratamiento de interrupciones. Dichos eventos reciben el nombre. no ser´ ıa posible realizar el tratamiento de la entrada y salida por medio de interrupciones. en la terminolog´ ıa MIPS. es necesario que disponga de al menos una entrada de control. son los dispositivos los que avisan al procesador cuando dicha operaci´ on de entrada o salida ha terminado. Por el contrario. El uso de interrupciones permite compaginar eficientemente las diferentes velocidades de funcionamiento de los distintos perif´ ericos y del procesador.112 Gesti´ on de la entrada/salida mediante interrupciones interrupci´ on.

En la tercera secci´ on c´ omo ejecutar el simulador para poder realizar las pr´ acticas propuestas con excepciones. En la sexta secci´ on se tratan ´ ltimo. respectivamente. 10. La Tabla 10. En las dos siguientes secciones se muestra c´ omo capturar las excepciones producidas por desbordamiento y por direccionamiento err´ oneo. el intento de ejecutar una instrucci´ on con c´ odigo de operaci´ on incorrecto o de referenciar una direcci´ on de memoria prohibida. A continuaci´ on se explica el significado y funci´ on de cada uno de dichos registros.1. una divisi´ on por cero. En este grupo tambi´ en se encuentran las generadas durante el funcionamiento normal de los perif´ ericos de entrada y salida (que se denominan. Por ejemplo. se proponen una serie de ejercicios m´ las interrupciones. en el llamado coprocesador 0. que proporciona a los programas en ejecuci´ on acceso a . Este cap´ ıtulo muestra c´ omo se realiza el procesamiento de las excepciones en el procesador MIPS32. como se ha visto. Es decir. al contrario de lo que ocurre con las interrupciones propiamente dichas. la ejecuci´ on de una instrucci´ on de llamada al sistema operativo (syscall). un desbordamiento aritm´ etico.10. En la primera secci´ on se describen los registros para el tratamiento de excepciones proporcionados por el simulador SPIM. El modo n´ ucleo. Registros para el tratamiento de las excepciones 113 Las excepciones se pueden agrupar en: Excepciones software (internas al procesador). Excepciones hardware (externas al procesador).1 muestra un resumen de dichos registros. el procesador no espera a que la instrucci´ on en curso sea completada. Destacar que. Registros para el tratamiento de las excepciones En un procesador MIPS. interrupciones). En la segunda secci´ on se describe c´ omo se lleva a cabo el procesamiento de las excepciones. Registro Status Este registro se utiliza para almacenar informaci´ on referente al modo de trabajo del procesador y el estado de las interrupciones. Por u as avanzados. Por ejemplo. etc. el resto de excepciones se atienden en el momento en que se producen. se encuentran los registros necesarios para el tratamiento de las excepciones.1. un corte de corriente o un error de acceso a memoria producida por un perif´ erico. El procesador puede trabajar en uno de los dos siguientes modos.

Valor que debe compararse con el del registro Count Tabla 10. el procesador atender´ a las peticiones de interrupci´ on en cuanto se produzcan. Si est´ a a 1. en el que el acceso a los recursos est´ a limitado.1: Registros para el tratamiento de excepciones e interrupciones todos los recursos del sistema. Si est´ an enmascaradas. el modo de funcionamiento ser´ a el de usuario. 15 . ´ ltima instrucDirecci´ on de memoria de la u ci´ on ejecutada por el procesador. se utilizan para el tratamiento de las excepciones.1. el modo de funcionamiento ser´ a el de n´ ucleo. Tipo de excepci´ on y bits de interrupciones pendientes.114 Gesti´ on de la entrada/salida mediante interrupciones Nombre Status Cause EPC BadVaddr Count Compare N´ umero 12 13 14 8 9 11 Funci´ on M´ ascara de interrupciones y bits de autorizaci´ on..1 muestra los campos del registro Status. los bits 0. e o enmascaradas. Temporizador (timer).1: Registro Status La Figura 10. ´ stas pueden estar habilitadas En cuanto al estado de las interrupciones.. y el modo usuario. el bit 4 siempre estar´ a a 1. Direcci´ on de memoria que ha provocado la excepci´ on. el procesador ignorar´ a las peticiones de interrupci´ on. Modo usuario 4 1 0 Figura 10. En dicho registro. el bit 4 se utiliza para indicar el modo de funcionamiento. Si las interrupciones est´ an habilitadas. es decir.. 1 y 8 al 15. Puesto que el simulador SPIM no implementa el modo n´ ucleo. El bit 0 (habilitaci´ on de interrupciones) se utiliza para habilitar o enmascarar. de forma . El resto de bits mostrados en la Figura 10... Máscara de interrupciones Nivel de excepción Habilitación de interrupción 8 . Si est´ a a 0..

se evita que el tratamiento de una excepci´ on sea interrumpido por una nueva excepci´ on. La Figura 10.. En el momento en que una excepci´ on comienza a ser atendida. Si uno de los bits de la m´ ascara de interrupciones est´ a a 1. Interrupciones pendientes 8 . se permite que las excepciones de dicho nivel interrumpan al procesador.. La existencia de diferentes niveles de prioridad. Para que una excepci´ on de un determinado nivel de prioridad pueda ser atendida. La correspondencia entre los bits de la m´ ascara de interrupciones y los niveles de excepci´ on hardware y software es la siguiente. todas las interrupciones. Sin un bit de la m´ ascara est´ a a 0. es necesario que tanto el bit de habilitaci´ on de interrupci´ on como el bit correspondiente a dicho nivel de la m´ ascara de interrupciones est´ en a 1.. ´ ltima Registro Cause Este registro se utiliza para almacenar el c´ odigo de la u excepci´ on o interrupci´ on generada.. dicho bit se pone autom´ aticamente a 1. atender primero a la que sea m´ as prioritaria. El bit 1 (nivel de excepci´ on) indica si actualmente se est´ a tratando una excepci´ on.. ante la llegada de dos o m´ as excepciones simult´ aneas.2 muestra los campos de este registro. Código de excepción 5 4 3 2 Figura 10. La rutina de tratamiento de la excepci´ on debe volver a colocar dicho bit a 0 antes de devolver el control al programa en curso.1. es posible asignar a las distintas causas de excepci´ on un nivel de prioridad determinado. 15 . Cuando se pone a 1 se habilitan las interrupciones. Los bits 10 al 15 de la m´ ascara de interrupciones sirven para habilitar o enmascarar los niveles de interrupci´ on hardware 0 al 5. se enmascaran las excepciones de dicho nivel. Los bits 8 al 15 (m´ ascara de interrupciones) de este registro sirven para habilitar o enmascarar cada uno de dichos niveles de prioridad. Cuando se pone a 0 se enmascaran las interrupciones. De esta forma..2: Registro Cause . Por tanto. respectivamente. permite al procesador. Los bits 8 y 9 de la m´ ascara de interrupciones sirven para habilitar o enmascarar los niveles de excepci´ on software 0 y 1.10. respectivamente. Registros para el tratamiento de las excepciones 115 general. MIPS32 dispone de seis niveles de prioridad para el tratamiento de excepciones hardware y dos m´ as para excepciones software.

se almacena en este registro la direcci´ on de memoria por la que se ha generado dicha excepci´ on. la direcci´ on de memoria almacenada en este registro ser´ a la direcci´ on de memoria de la instrucci´ on que debe ejecutarse despu´ es de procesar la interrupci´ on (para continuar la ejecuci´ on del programa que haya sido interrumpido). El campo c´ odigo de excepci´ on (bits 2 al 5) se utiliza para codificar la causa de la excepci´ on. . Esta direcci´ on de memoria ser´ a. la direcci´ on de la instrucci´ on que ha provocado la excepci´ on. Cada uno de estos bits se pone a 1 cuando se produce una excepci´ on en el nivel de prioridad correspondiente. N´ um. 0 4 5 6 7 8 9 10 12 Nombre INT ADDRL ADDRS IBUS DBUS SYSCALL BKPT RI OVF Descripci´ on Interrupci´ on externa Excepci´ on por direcci´ on err´ onea (carga o lectura de instrucci´ on) Excepci´ on por direcci´ on err´ onea (almacenamiento) Error de bus durante la lectura de instrucci´ on Error de bus durante la carga o almacenamiento de datos Excepci´ on por llamada al sistema (syscall) Excepci´ on por punto de ruptura (breakpoint) Excepci´ on por instrucci´ on reservada Excepci´ on por desbordamiento aritm´ etico Registro EPC (Exception Program Counter) Este registro se utiliza para almacenar una direcci´ on de memoria. Si en lugar de una excepci´ on se ha producido una interrupci´ on. Dicho bit permanecer´ a a 1 hasta que la excepci´ on correspondiente haya sido atendida. Aunque debe ser puesta a 1 expl´ ıcitamente. Registro BadVaddr (Bad Virtual Address) Cuando se produce una excepci´ on por acceso a una direcci´ on de memoria err´ onea. en el caso de que se haya producido una excepci´ on software.116 Gesti´ on de la entrada/salida mediante interrupciones Los ocho bits del campo interrupciones pendientes se corresponden con los ocho niveles de excepci´ on: seis hardware (bits 10 al 15) y dos software (bits 8 y 9). e en el modo de Registro Count Es un contador. Mientras el simulador est´ ejecuci´ on de instrucciones. su valor se actualiza con una frecuencia fija (cada 10 milisegundos). La siguiente tabla muestra los c´ odigos utilizados para la codificaci´ on de las distintas causas de excepci´ on soportadas.

.2. . . cuando se ejecute la instrucci´ on ((lw $t0 . . .. . EJERCICIOS ... . . .. . Para acceder a los registros del coprocesador 0 se utilizan las instrucciones: ((mfc0)) (move from coprocessor 0) y ((mtc0)) (move to coprocessor 0). . . . 10...... La segunda de ellas. . . . . .. . ((mtc0 rd.. ¿qu´ e valor se deber´ ıa cargar en dicho registro si se quieren enmascarar todas las interrupciones? Enumera las instrucciones que llevar´ ıan a cabo dicha operaci´ on... .... . .. . .. . ..10.. .. e valor se · 219 Considerando el valor original del registro Status. . . ..... . .. . . .. . . ...... ... .11( $0))).. permite realizar la operaci´ on inversa: transferir el contenido de un registro del procesador a uno de los registros del coprocesador 0... ((mtc0)). .2.. . . Tratamiento de las excepciones Para poder tratar adecuadamente una excepci´ on es necesario conocer en primer lugar qui´ en la ha generado....... . · 218 Ejecuta el simulador SPIM y comprueba el contenido inicial del registro Status... . . . .... · 221 ¿Qu´ e valor se almacenar´ a en el registro EPC si se produce una excepci´ on mientras se ejecuta la instrucci´ on almacenada en 0x0004 0020? · 222 ¿Qu´ e valores se almacenar´ an en los registros EPC y BadVAddr.. . .. rd )): Transfiere el contenido del registro rd del coprocesador 0 al registro rt del procesador. Tratamiento de las excepciones 117 Registro Compare Se utiliza para almacenar un n´ umero que ser´ a comparado de forma autom´ atica con el contenido del registro Count. . . ... La primera de ellas. Cuando el valor del registro Count llegue al n´ umero almacenado en este registro. ((mfc0)).. .. . .. almacenada en la posici´ on de memoria 0x0004 0040? ..... ... permite transferir el contenido de un registro del coprocesador 0 a uno de los registros del procesador. · 220 Considerando el valor original del registro Status..... . . . se generar´ a una interrupci´ on de nivel 5 (m´ axima prioridad). . . . La sintaxis completa de dichas instrucciones es la siguiente: ((mfc0 rt . . . ¿qu´ deber´ ıa cargar en dicho registro si se pretenden habilitar las interrupciones de nivel 0 y 1 y enmascarar las restantes? Enumera las instrucciones que llevar´ ıan a cabo dicha operaci´ on y comenta brevemente su cometido. . ... rt )): Transfiere el contenido del registro rd del procesador al registro rt del coprocesador 0. .

En este caso. el problema de identificaci´ on de qu´ e dispositivo perif´ erico ha generado la interrupci´ on se convierte en un problema de asignaci´ on de los n´ umeros de interrupci´ on disponibles entre los perif´ ericos existentes. El tratamiento de la excepci´ on propiamente dicho. En dicho vector se encuentran almacenadas las direcciones de comienzo de las rutinas de tratamiento de excepciones asociadas a las diferentes causas de excepci´ on. Actualmente. As´ ı. A cambio. algunas arquitecturas. si es una interrupci´ on. dicha asignaci´ on se realizaba de forma manual. El instante en el que el procesador decide procesar la excepci´ on. no hay que asignar n´ umeros a las distintas causas de excepciones. se almacena en el campo c´ odigo de excepci´ on del registro Cause el c´ odigo que identifica la causa de dicha excepci´ on. y puesto que no existe dicha diferenciaci´ on. Hab´ ıa que variar la posici´ on de determinados jumpers en las placas de los dispositivos para indicar qu´ e n´ umero de IRQ se asignaba al dispositivo. Adem´ as. los dispositivos —y los buses— est´ an preparados para poder variar dicho recurso de forma electr´ onica. El instante en el que el procesador decide tratar la excepci´ on. en el campo de Interrupciones pendientes del registro Cause se activa el bit correspondiente al nivel de prioridad de dicha excepci´ on. la rutina de tratamiento de excepciones deber´ a encargarse de. averiguar qui´ en ha generado la excepci´ on. Una estrategia diferente. en una primera fase. El instante en el que se produce una excepci´ on En el instante en el que se produce una excepci´ on.118 Gesti´ on de la entrada/salida mediante interrupciones Para identificar qui´ en ha generado una excepci´ on. como las del 8086 de Intel o el MC68000 de Motorola. almacena el . En este caso. es la utilizaci´ on de una gesti´ on no vectorizadas. En el instante en el que el procesador decide procesar la excepci´ on. la BIOS del computador o el Sistema Operativo pueden modificar las IRQs asignadas a los diferentes dispositivos de forma autom´ atica para resolver los conflictos que puedan surgir en la asignaci´ on de IRQs. Para describir los procesos que se llevan a cabo durante una excepci´ on se van a considerar los siguientes momentos: El instante en el que se produce. y que es la utilizada por la arquitectura MIPS32. implementan interrupciones vectorizadas. Originalmente. Se llaman as´ ı porque se asigna a cada causa de excepci´ on ´ dispositivo un n´ o umero que la identifica y que se corresponde con el ´ ındice de un vector.

Almacenamiento en el registro EPC de una de dos: si la excepci´ on se ha producido al intentar ejecutar una determinada instrucci´ on. 4. 3. 2. Dicha rutina forma parte del sistema operativo instalado en el computador. el c´ odigo fuente de dicha rutina se proporciona en el fichero exceptions. En el caso del simulador SPIM. . Escritura de un 1 en el bit nivel de excepci´ on del registro Status. Para ello. debe utilizar el contenido del registro Cause para determinar la causa de la excepci´ on y transferir el flujo del programa a la parte de la rutina que se encarga del tratamiento de dicho tipo de excepciones. se almacena la direcci´ on de memoria de la instrucci´ on siguiente a la que acaba de ser ejecutada. almacenamiento en el registro BadVAddr de la direcci´ on de memoria a la que se ha intentado acceder. Si la excepci´ on ha sido provocada por el acceso a una posici´ on de memoria err´ onea. Una vez encontrado el causante de la excepci´ on y habiendo realizado las acciones que dicha excepci´ on requiera.10. Generar el salto a la rutina de tratamiento de excepciones conlleva las siguientes acciones: 1. la direcci´ on de comienzo de la rutina de tratamiento de excepciones est´ a en la posici´ on de memoria 0x8000 0180. El tratamiento de la excepci´ on propiamente dicho. Almacenamiento en el registro PC de la direcci´ on de comienzo de la rutina de tratamiento de excepciones. si la excepci´ on ha sido motivada por una interrupci´ on.2. A partir de este momento se lleva a cabo la ejecuci´ on de la rutina de tratamiento de excepciones. La primera de las tareas que debe realizar la rutina de tratamiento de excepciones es la de identificar qui´ en ha generado la excepci´ on que se est´ a atendiendo. el siguiente paso consiste en decidir si: ´ ste debe abortar la ejecuci´ on del programa interrumpido (s´ olo si e ha sido el causante de la excepci´ on). Tratamiento de las excepciones 119 estado actual y genera un salto a la direcci´ on de memoria donde est´ a almacenada la rutina de tratamiento de excepciones. se almacena la direcci´ on de la instrucci´ on causante de la excepci´ on. En el caso del simulador SPIM.s. o debe continuar la ejecuci´ on del programa interrumpido.

2.120 Gesti´ on de la entrada/salida mediante interrupciones Dependiendo de un caso u otro se deber´ a escribir una direcci´ on de vuelta distinta en el registro EPC. si se debe continuar la ejecuci´ y se estaba tratando una excepci´ on. La ejecuci´ on de dicha instrucci´ on provoca las siguientes acciones: 1. se debe poner a cero el registro Cause y a continuaci´ on llevar a cabo el retorno de la rutina de tratamientos de excepciones.  exceptions.s 1 2 3 4 5 6 7 # # R u t i n a de t r a t a m i e n t o de e x c e p c i o n e s y programa c a r g a d o r # ( D e r i v a d o s de l a r u t i n a y c a r g a d o r p r o p o r c i o n a d o s con SPIM ) # #====================================================================== # R u t i n a de t r a t a m i e n t o de l a s e x c e p c i o n e s . se deber´ a poner en el registro EPC la direcci´ on siguiente a la instrucci´ on que se estaba ejecutando (caso de una excepci´ on software) o se hab´ ıa ejecutado (caso de una interrupci´ on) cuando el programa fue interrumpido. En el primer caso. cuando se deba continuar la ejecuci´ on del programa interrumpido. A continuaci´ on se muestra una rutina de tratamiento de excepciones basada en la proporcionada con el simulador SPIM. se deber´ a incrementar en 4 el contenido del registro EPC. Pone a 0 el bit nivel de excepci´ on del registro Status. no hay que hacer nada con el EPC. Ya que el contenido del registro EPC es justamente la direcci´ on de la siguiente instrucci´ on que se deb´ ıa ejecutar cuando el programa fue interrumpido. Y con esta instrucci´ on finaliza la rutina de tratamiento de excepciones. el registro EPC contiene la direcci´ on de la instrucci´ on causante de la excepci´ on y se quiere retornar ´ sta. on del programa interrumpido Por tanto. En el segundo de los casos. deber´ a darse el control al Sistema Operativo. Carga en el registro PC el valor almacenado en el registro EPC. Una vez se ha puesto en el registro EPC la direcci´ on correcta de retorno. por lo que se realizar´ a una llamada al mismo para finalizar la ejecuci´ on del programa en curso. Ya que en este caso. si se debe continuar la ejecuci´ on del programa interrumpido y se estaba tratando una interrupci´ on. Para llevar a cabo el retorno de la rutina de tratamiento de excepciones se debe utilizar la instrucci´ on (( eret )). a la siguiente instrucci´ on a e Por otro lado.

a s c i i z ” ∗ Se ha g e n e r a d o una i n t e r r u p c i o . $k0 . $a0 . int syscall j ret #============================================================ e x c s w : #============================================================ # T r a t a m i e n t o de e x c e p c i o n e s ( no i n t e r r u p c i o n e s ) l i $v0 . 4 # | Excepcio −EPC+4 ´ n : EPC< mtc0 $k0 . . # .set at sw $v0 . D i s t i n g u e e n t r e e x c e p c i o n e s que no s o n i n t e r r u p c i o n e s e # i n t e r r u p c i o n e s . $k0 . 0 x 1 f # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # S i e l Co ´ digo de E x c e p c i o ´ n e s 0 . s e p u e d e n u t i l i z a r # l o s r e g i s t r o s $ k0 y $ k1 s i n a l m a c e n a r s u s v a l o r e s a n t i g u o s . 4 # syscall 4 ( print str ) l a $a0 .word 0 exc : int : s1 : s2 : # Debido a que l a r u t i n a s e e j e c u t a en e l k e r n e l . a s c i i z ” ∗ Se ha g e n e r a d o una e x c e p c i o ´ n ∗\ n ” . e s una i n t e r r u p c i o ´n bne $a0 .word 0 . e x c s w nop # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − int : #============================================================ # T r a t a m i e n t o de i n t e r r u p c i o n e s l i $v0 .kdata ´ n s o f t w a r e ∗\ n ” . s 1 sw $a0 . S i m p l e m e n t e i m p r i m e un m e n s a j e i n d i c a d o qu e ´ t i p o de # excepcio ´ n s e ha g e n e r a d o . 4 # syscall 4 ( print str ) l a $a0 . $ a t . e x c syscall mfc0 $k0 . Tratamiento de las excepciones 121 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 #====================================================================== # # E s t a r u t i n a de t r a t a m i e n t o de e x c e p c i o n e s s e e j e c u t a cuando o c u r r e # una e x c e p c i o ´ n . $13 # R e g i s t r o Cause s r l $a0 . $14 # + #============================================================ . 0 . 2 # Extraccio ´ n d e l Co ´ digo de E x c e p c i o ´n a n d i $a0 . No s e p u e d e u t i l i z a r l a p i l a . E l r e s t o # de r e g i s t r o s u t i l i z a d o s d e b e r a ´ n almacenarse y r e s t a u r a r s e . # Se g u a r d a n : # ∗ E l r e g i s t r o $ a t en e l r e g i s t r o $ k1 # ∗ E l r e g i s t r o $ v0 en l a p o s i c i o ´ n de memoria s 1 # ∗ E l r e g i s t r o $ a0 en l a p o s i c i o n de memoria s 2 . s e t noat move $k1 .10.2. s 2 # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Determinacio ´ n de l a c a u s a de l a e x c e p c i o ´n mfc0 $k0 . $14 # + addiu $k0 . k t e x t 0 x80000180 # Comienzo d e l v e c t o r de e x c e p c i o n e s # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Los r e g i s t r o s que v a y a n a u t i l i z a r s e d e b e r a ´ n guardarse para # p o s t e r i o r m e n t e r e s t a u r a r s e .

$13 # R e g i s t r o Cause s r l $a0 . . 2 # Extraccio ´ n d e l Co ´ digo de E x c e p c i o ´n a n d i $a0 . . . $k0 . . $a0 . . . . . .text . $13 # P u e s t a a 0 d e l r e g i s t r o Cause # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # R e t o r n o de l a r u t i n a de t r a t a m i e n t o de e x c e p c i o n e s eret # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − #====================================================================== # Programa c a r g a d o r . . . . . . . . . s 2 · 224 43 44 45 46 47 48 49 50 51 52 ¿Qu´ e funci´ on tiene el siguiente fragmento de exceptions. . . . . . . . . . . s 1 lw $a0 . . . . . . . . .122 Gesti´ on de la entrada/salida mediante interrupciones 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 ret : # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Restauracio ´ n de l o s r e g i s t r o s u t i l i z a d o s p o r l a r u t i n a lw $v0 . . . . e n v p ) #====================================================================== .globl eoth : eoth # s y s c a l l 10 ( e x i t ) . . . . . . . EJERCICIOS . . 0 . . e s una i n t e r r u p c i o ´n bne $a0 . · 223 ¿Qu´ e funci´ on tiene el siguiente fragmento de exceptions. s 2 . . .s? #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Determinacio ´ n de l a c a u s a de l a e x c e p c i o ´n mfc0 $k0 . s 1 sw $a0 . I n v o c a l a r u t i n a ” main ” con l o s a r g u m e n t o s : # main ( argc . . argv . . . . . .set at # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Restauracio ´ n del estado mtc0 $0 . .globl start start : lw $a0 0 ( $ s p ) # argc addiu $a1 $ s p 4 # argv addiu $a2 $a1 4 # envp s l l $v0 $a0 2 addu $a2 $a2 $v0 j a l main nop l i $v0 10 syscall . . . . 0 x 1 f #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # S i e l Co ´ digo de E x c e p c i o ´ n e s 0 . . . . . . e x c s w .s? 39 40 sw $v0 . . s e t noat move $ a t $k1 . .

s? # Restauracio ´ n de l o s r e g i s t r o s u t i l i z a d o s p o r l a r u t i n a lw $v0 .s? #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Restauracio ´ n del estado mtc0 $0 ......s? #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # R e t o r n o de l a r u t i n a de t r a t a m i e n t o de e x c e p c i o n e s eret #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − · 230 Una vez analizada paso a paso la rutina de tratamiento de excepciones del simulador SPIM. $k0 .........10........ Tratamiento de las excepciones 123 53 54 nop #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − · 225 57 58 59 60 61 62 63 ¿Qu´ e funci´ on tiene el siguiente fragmento de exceptions. $14 # + #============================================================ · 227 78 79 80 ¿Qu´ e funci´ on tiene el siguiente fragmento de exceptions........ . 4 # syscall 4 ( print str ) l a $a0 . $13 # P u e s t a a 0 d e l r e g i s t r o Cause #− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − · 229 91 92 93 94 ¿Qu´ e funci´ on tiene el siguiente fragmento de exceptions. 4 # syscall 4 ( print str ) l a $a0 ........... 4 # | Excepcio −EPC+4 ´ n : EPC< mtc0 $k0 ...... int syscall j ret #============================================================ int : · 226 66 67 68 69 70 71 72 73 74 ¿Qu´ e funci´ on tiene el siguiente fragmento de exceptions......... explica de forma resumida qu´ e acciones se llevan a cabo para tratar las excepciones e interrupciones...2....s? #============================================================ # T r a t a m i e n t o de i n t e r r u p c i o n e s l i $v0 .s? e x c s w : #============================================================ # T r a t a m i e n t o de e x c e p c i o n e s ( no i n t e r r u p c i o n e s ) l i $v0 ..... e x c syscall mfc0 $k0 . ... s 1 lw $a0 . $14 # + addiu $k0 ........ s 2 · 228 86 87 88 89 ¿Qu´ e funci´ on tiene el siguiente fragmento de exceptions..

es necesario cargar en primer lugar la nueva versi´ on de la rutina y despu´ es el programa que se quiere probar. para cargar la nueva rutina de tratamiento de excepciones y el c´ odigo que se desee probar. En los dos siguientes apartados se estudian dos de las excepciones m´ as comunes que se pueden producir durante la ejecuci´ on de una instrucci´ on: la de .4. lo anterior se consigue desactivando la opci´ on Load trap file y activando la opci´ on Mapped I/O en el cuadro de di´ alogo Settings (v´ ease la Figura 10.3: Cuadro de di´ alogo de preferencias de la versi´ on para Windows de SPIM Una vez hecho lo anterior. error de direccionamiento. entre ellas: desbordamiento aritm´ etico. es necesario ejecutar el simulador SPIM evitando que cargue la rutina por defecto de tratamiento de excepciones y habilitando el mapeo a memoria de la entrada y salida.124 Gesti´ on de la entrada/salida mediante interrupciones 10. divisi´ on por cero. Excepciones software Las excepciones software se producen por errores que ocurren durante la ejecuci´ on de una instrucci´ on o son generados por instrucciones espec´ ıficas. Figura 10.3. Las causas de estos errores pueden ser muy diversas. Opciones del programa SPIM para la simulaci´ on de interrupciones Para poder realizar correctamente los ejercicios propuestos en las siguientes secciones.3). etc. e PIM con la siguiente l´ ınea de comandos: ((xspim -noexception -mapped io)) En la versi´ on de SPIM para Windows. ejecuci´ on de una instrucci´ on ilegal. ´ sto se consigue ejecutando XSEn la versi´ on de SPIM para GNU/Linux. 10.

.. . .. . 0x0000 0007. .... .. . .....10.. aparezca un mensaje que lo indique y finalice la ejecuci´ on del programa en curso.. . ..... · 232 Desarrolla un peque˜ no programa en ensamblador que sume los 10 elementos del siguiente vector y almacene el resultado en una variable ((suma)).... 10. ...... Para probar su funcionamiento emplea el c´ odigo del ejercicio 232.... .. ....... . 0x0000 0004....... . 0x7FFF FFFF. .. . . . . ..... ...... 0x0000 0002.... . . .... el procesador debe avisar de este error... .. .. . . ... El objetivo de los siguientes ejercicios es justamente el de explorar la forma en la que se tratan las excepciones por desbordamiento en el simulador SPIM y proponer una modificaci´ on a la rutina de tratamiento de excepciones ´ ste provoca una excepci´ que finalice un programa si e on por desbordamiento.. .. ´ .. ... . .... .. .. . .. . .... .. ... ..... . . ..... . . . . .. . . ..... .. ..s mostrado en la e ocurrir´ a cuando se produzca una excepci´ on por secci´ on 10... .1. Excepciones software 125 error por desbordamiento y la de error por direccionamiento err´ oneo... .... . 0x0000 0005. ......... . 0x0000 0003.. .. ........2 y explica qu´ desbordamiento. Puesto que el resultado obtenido no es el correcto.. .4... . .. ... .....s para que el simulador SPIM para que cuando se produzca una excepci´ on por desbordamiento... ¿qu´ ocurrido durante la ejecuci´ on de dicho programa? · 234 ci´ on? ¿Qu´ e valor se carga en el registro EPC cuando se produce la excep- · 235 ¿Qu´ e valor se carga en el registro Cause cuando se produce la excepci´ on? Comprueba que el campo c´ odigo de excepci´ on contiene el valor 12.. ... . . .... . . . V = ( 0x0000 0001... . . EJERCICIOS .. .. . ..4... 0x0000 0009 ) e se almacena en la variable ((suma))? ¿Qu´ e ha · 233 Ejecuta el programa.. . .... La forma en la que lo hace es generando una excepci´ on por desbordamiento. ...... . . . ... 0x0000 0006. Tratamiento de la excepci´ on por desbordamiento Se dice que se ha producido un desbordamiento en una operaci´ on aritm´ etica cuando el resultado no puede ser correctamente representado. EJERCICIOS DE AMPLIACI ON · 236 Modifica la rutina exceptions... .. ... . · 231 Examina el c´ odigo del programa exceptions. . .. ..... 0x0000 0008...

... La forma en la que lo hace es generando una excepci´ on por direccionamiento err´ oneo.. . . EJERCICIOS .. . 0($0))) y ((lw $t0 .... . una palabra tan s´ olo puede escribirse o leerse de una direcci´ on de memoria m´ ultiıa correcta plo de 4. . De igual forma.. Por tanto.. · 238 Desarrolla un sencillo programa en ensamblador en el que se produzca un error de direccionamiento durante su ejecuci´ on. . .. . .. . .. . .... . .. el procesador deber´ a avisar de este hecho. . . .2.. . .. . una instrucci´ on como ((lw $t0 . .. ..2 y explica qu´ e ocurrir´ a cuando se produzca una excepci´ on por direccionamiento err´ oneo en almacenamiento. . ....... s´ ı que ser´ ıan correctas ya que leen una palabra de la posici´ on de memoria 0 y 4.. . .. .4.. . .. . Es decir. .. . 4($0))). Por contra.... respectivamente.. .. .. ... . . .. . . .. . ..126 Gesti´ on de la entrada/salida mediante interrupciones 10.... . . . · 237 Examina el c´ odigo del programa exceptions.. . . . . ..... ... una media palabra tan s´ olo puede escribirse o leerse de una direcci´ on de memoria m´ ultiplo de 2... . . . .... . ((lw $t0 . . · 242 ¿Qu´ e valor se almacena en el registro BadVaddr cuando se produce la excepci´ on? .. ... .. .. Tratamiento de la excepci´ on por direccionamiento err´ oneo en almacenamiento La arquitectura MIPS32 obliga a que las direcciones de memoria est´ en alineadas en m´ ultiplos de 2 para las medias palabras (2 bytes) y en m´ ultiplos de 4 para las palabras (4 bytes). El objetivo de los siguientes ejercicios es justamente el de explorar la forma en la que se tratan las excepciones por direccionamiento err´ oneo en el simulador SPIM y proponer una modificaci´ on a la rutina de tratamiento de ´ ste provoca una excepci´ excepciones que finalice un programa si e on por direccionamiento err´ oneo... ... . 1($0))) no ser´ ya que intentar´ ıa leer una palabra de una direcci´ on de memoria (la 1) que no es m´ ultiplo de 4. ..s mostrado en la secci´ on 10. · 239 ¿Termina correctamente la ejecuci´ on del programa? · 240 ¿Qu´ e valor se almacena en el registro EPC cuando se produce la excepci´ on? · 241 ¿Qu´ e valor se carga en el registro Cause cuando se produce la excepci´ on? Comprueba que el campo c´ odigo de excepci´ on contiene el valor 5. . Puesto que la implementaci´ on de una arquitectura MIPS32 no permite el acceso a direcciones de memoria no alineadas... si una determinada instrucci´ on intenta acceder a una posici´ on de memoria no alineada.

... . .... Para enmascarar la interrupci´ on de reloj..1. El registro Count es un contador ascendente no c´ ıclico que incrementa su valor en una unidad cada 10 milisegundos.. . ..... se deber´ an poner a 1 los bits 15 y 0 del registro Status.. Interrupciones 127 ´ .. llamada de reloj....... El funcionamiento de este reloj programable se describe a continuaci´ on. .. SPIM simula tres dispositivos capaces de generar interrupciones: un reloj programable..5.... 10.. ... . para que el procesador atienda la interrupci´ on que se genera cuando el valor de Count alcanza el de Compare.5... . Si no que ser´ an los dispositivos los que avisen al procesador de que requieren de su atenci´ on generando una petici´ on de interrupci´ on. Y como la rutina de tratamiento de excepciones puede reaccionar ante dichas excepciones. .... Cuando el contenido de este registro alcanza el valor almacenado en el registro Compare.. ........5.. . Es necesario inicializarlo.. con nivel de prioridad 5.... ........ ... .. Para probar su funcionamiento emplea el c´ odigo del ejercicio 238. por ejemplo... . El registro Count no est´ a siempre contando. . .... .. Reloj programable El simulador SPIM proporciona un reloj programable por medio de los registros Count y Compare del coprocesador 0.. .... es decir..10... 10.... . . Para habilitar la interrupci´ on de reloj... .... no s´ olo la de reloj). En las siguientes secciones se proporcionan ejercicios que muestran como gestionar dichos dispositivos utilizando interrupciones.. Interrupciones En las dos secciones anteriores se ha visto como el procesador genera dos tipos de excepciones ante los errores de desbordamiento y de direccionamiento err´ oneo. Para ha- .... un teclado y una pantalla.... En este caso no ser´ a la ejecuci´ on de una instrucci´ on la que provoque la excepci´ on... aparezca un mensaje que lo indique y finalice la ejecuci´ on del programa en curso... ..s para que cuando se produzca una excepci´ on por direccionamiento err´ oneo.. el coprocesador 0 genera una interrupci´ on. . finalizando la ejecuci´ on de los programas que las han provocado.. En esta secci´ on se ver´ a como se puede gestionar la entrada y salida de un computador utilizando interrupciones..... se deber´ a poner a 0 el bit 15 del registro Status (conviene recordar que poner a 0 el bit 0 implicar´ ıa enmascarar todas las interrupciones. EJERCICIOS DE AMPLIACI ON · 243 Modifica la rutina exceptions....

El segundo de los listados presentados. 0 x8001 mtc0 $ t 0 . $ t 7 . $12 # Inicializacio ´ n del contador a d d i $ t 2 .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # # Programa que u t i l i z a e l r e l o j p r o g r a m a b l e # . se escribe un 0 en el campo c´ odigo de excepci´ on del registro Cause y un 1 en el bit 15 del mismo registro y se genera una interrupci´ on de nivel de prioridad 5. $9 # B u c l e i n f i n i t o que i m p r i m e l a c a d e n a ” E s t o e s un p r u e b a ” la $a0 . El primero de ellos. r e t a r d o beqz $0 . exceptions-2. 4 syscall a d d i $ t 7 . $ t 0 . 30000 sll $t7 . es una modificaci´ on del fichero exceptions. Cuando lo hace.s. codigo-reloj. −1 bnez $ t 7 . a s c i i z ” E s t o e s una p r u e b a \ n ” . $0 . $t7 . $12 o r i $ t 0 . seg´ un lo anterior. $0 .data cadena : . inicializa el reloj programable para despu´ es entrar en un bucle sin fin en el que imprime por pantalla la frase ((Esto es una prueba)). se debe habilitar la interrupci´ on de reloj y escribir en el registro Count el valor inicial del contador (que habitualmente ser´ a 0). El procesador atender´ a dicha petici´ on de interrupci´ on en cuanto complete la ejecuci´ on de la instrucci´ on en curso.128 Gesti´ on de la entrada/salida mediante interrupciones cerlo. 3 # $ t 7 <−30000∗8 r e t a r d o : a d d i $ t 7 . el registro Count incrementa su valor cada 10 ms hasta que alcanza el valor almacenado en el registro Compare. c a d e n a li $v0 . bucle bucle : . 100 mtc0 $ t 2 . $11 mtc0 $0 . que el tiempo que transcurre desde que se inicializa el contador hasta que el procesador atiende la interrupci´ on se puede calcular como: T iempo = (Compare − Initial Count) × 10ms Para poder comprobar como se utiliza el reloj programable de SPIM se proporcionan los siguientes listados. Una vez inicializado el contador.text main : # Habilitacio ´ n de l a i n t e r r u p c i o ´ n de r e l o j mfc0 $ t 0 . Es f´ acil ver.  codigo-reloj.s en la que se han a˜ nadido las instrucciones necesarias para poder atender la interrupci´ on de reloj.s.

a s c i i z ” ∗ Se ha g e n e r a d o una i n t e r r u p c i o ´ n de r e l o j ∗\ n ” . E l r e s t o # de r e g i s t r o s u t i l i z a d o s d e b e r a ´ n almacenarse y r e s t a u r a r s e . D i s t i n g u e e n t r e e x c e p c i o n e s que no s o n i n t e r r u p c i o n e s e # i n t e r r u p c i o n e s .set at sw $v0 . $k0 . No s e p u e d e u t i l i z a r l a p i l a . k t e x t 0 x80000180 # Comienzo d e l v e c t o r de e x c e p c i o n e s # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Los r e g i s t r o s que v a y a n a u t i l i z a r s e d e b e r a ´ n guardarse para # p o s t e r i o r m e n t e r e s t a u r a r s e . e x c s w nop # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − int : #============================================================ # T r a t a m i e n t o de i n t e r r u p c i o n e s a n d i $a0 . $k0 . # Se g u a r d a n : # ∗ E l r e g i s t r o $ a t en e l r e g i s t r o $ k1 # ∗ E l r e g i s t r o $ v0 en l a p o s i c i o ´ n de memoria s 1 # ∗ E l r e g i s t r o $ a0 en l a p o s i c i o n de memoria s 2 . s 2 # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Determinacio ´ n de l a c a u s a de l a e x c e p c i o ´n mfc0 $k0 .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 # # R u t i n a de t r a t a m i e n t o de e x c e p c i o n e s y programa c a r g a d o r # ( D e r i v a d o s de l a r u t i n a y c a r g a d o r p r o p o r c i o n a d o s con SPIM ) # #====================================================================== # R u t i n a de t r a t a m i e n t o de l a s e x c e p c i o n e s #====================================================================== # # E s t a r u t i n a de t r a t a m i e n t o de e x c e p c i o n e s s e e j e c u t a cuando o c u r r e # una e x c e p c i o ´ n . s e p u e d e n u t i l i z a r # l o s r e g i s t r o s $ k0 y $ k1 s i n a l m a c e n a r s u s v a l o r e s a n t i g u o s . $ a t . int syscall # ¿Es de r e l o j ? # # Interrupcio ´ n no r e c o n o c i d a .5. s e t noat move $k1 . $a0 . a s c i i z ” ∗ Se ha g e n e r a d o una i n t e r r u p c i o . e s una i n t e r r u p c i o ´n bne $a0 . 2 # Extraccio ´ n d e l Co ´ digo de E x c e p c i o ´n a n d i $a0 . S i m p l e m e n t e i m p r i m e un m e n s a j e i n d i c a d o qu e ´ t i p o de # excepcio ´ n s e ha g e n e r a d o . $13 # R e g i s t r o Cause s r l $a0 . $0 .word 0 .10. 4 l a $a0 . i n t c l k l i $v0 . # . . Interrupciones 129  exceptions-2.kdata ´ n s o f t w a r e ∗\ n ” . s 1 sw $a0 . a s c i i z ” ∗ Se ha g e n e r a d o una e x c e p c i o ´ n ∗\ n ” . 0 x 1 f # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # S i e l Co ´ digo de E x c e p c i o ´ n e s 0 . 0 . 0 x8000 bne $a0 .word 0 exc : int : clk : s1 : s2 : # Debido a que l a r u t i n a s e e j e c u t a en e l k e r n e l .

4 # syscall 4 ( print str ) l a $a0 . 4 # + l a $a0 . I n v o c a l a r u t i n a ” main ” con l o s a r g u m e n t o s : # main ( argc .130 Gesti´ on de la entrada/salida mediante interrupciones 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 j ret i n t c l k : l i $v0 .set at # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Restauracio ´ n del estado mtc0 $0 .globl eoth : eoth # s y s c a l l 10 ( e x i t ) Recuerda lo comentado en la secci´ on 10. 4 # | Excepcio −EPC+4 ´ n : EPC< mtc0 $k0 .text . $k0 .globl start start : lw $a0 0 ( $ s p ) # argc addiu $a1 $ s p 4 # argv addiu $a2 $a1 4 # envp s l l $v0 $a0 2 addu $a2 $a2 $v0 j a l main nop l i $v0 10 syscall . $14 # + addiu $k0 . e n v p ) #====================================================================== . s 2 . $9 # + j ret #============================================================ e x c s w : #============================================================ # T r a t a m i e n t o de e x c e p c i o n e s ( no i n t e r r u p c i o n e s ) l i $v0 .3 sobre la ejecuci´ on de SPIM . $14 # + #============================================================ ret : # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Restauracio ´ n de l o s r e g i s t r o s u t i l i z a d o s p o r l a r u t i n a lw $v0 . argv . $11 # | V u e l t a a programar e l r e l o j mtc0 $0 . $0 . $13 # P u e s t a a 0 d e l r e g i s t r o Cause # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # R e t o r n o de l a r u t i n a de t r a t a m i e n t o de e x c e p c i o n e s eret # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − #====================================================================== # Programa c a r g a d o r . s e t noat move $ a t $k1 . s 1 lw $a0 . 100 # + mtc0 $k0 . c l k # | M e n s a j e de i n t e r r u p c i o ´ n de r e l o j syscall # + a d d i $k0 . e x c syscall mfc0 $k0 .

. ... . Modifica el programa codigo-reloj. Justifica dichos cambios. Adem´ as.s. . . . . . ..... .... ..... . . .. .. Para detener el bucle sin fin en el que entrar´ a el simulador. ... . . .. ..s inicializan el · 245 ¿Qu´ reloj? ¿Cu´ anto tiempo pasar´ a hasta que se genere la primera interrupci´ on de reloj? · 246 ¿Qu´ e hace el simulador entre interrupciones de reloj? · 247 Estudia con detalle el c´ odigo de la rutina exceptions-2.10..... Si el programa no ha finalizado en el tiempo establecido. .. . ... ..s habilitan la interrupci´ on de reloj? ¿Qu´ e bits del registro Status se ponen a 1? e instrucciones del programa codigo-reloj.... · 248 Detalla los procesos que tienen lugar cuando se produce una interrupci´ on de reloj.. .. .. . ... . se puede pulsar la combinaci´ on de teclas Ctrl+C. . . . .. ... . . . .s para que programe una interrupci´ on de reloj transcurrido un minuto.5.. · 244 ¿Qu´ e instrucciones del programa codigo-reloj.. . ..s para que cuando atienda dicha interrupci´ on de reloj. el programa ha finalizado antes de que se genere la interrupci´ on de reloj. . .s si el procesador est´ a ejecutando el programa codigo-reloj... se programa el temporizador para que genere una interrupci´ on cuando se haya sobrepasado el tiempo m´ aximo de ejecuci´ on.. . .. EJERCICIOS . ... finalice la ejecuci´ on del programa en curso. ...... . . Explica c´ omo se captura la interrupci´ on de reloj y qu´ e cambios se han a˜ nadido con respecto a la rutina exceptions.... . . .. . . . se generar´ a una interrupci´ on de reloj y la rutina de tratamiento de excepciones finalizar´ a la ejecuci´ on del programa. · 251 La interrupci´ on de reloj tambi´ en puede utilizarse para evitar que los programas se queden en un bucle sin fin o para forzar que terminen en caso de sobrepasar un determinado tiempo de ejecuci´ on... . . · 250 Modifica los c´ odigos presentados para que se generen interrupciones de reloj cada 20 segundos. . .. . Interrupciones 131 para la simulaci´ on de interrupciones y sobre la carga del nuevo fichero de interrupciones antes del c´ odigo que se quiere ejecutar. deber´ a deshabilitar la interrupci´ on de reloj. ... · 249 Explica c´ omo se ejecuta la rutina exceptions-2.. .. ..s...s. modifica el programa exceptions-2. . . . En estos casos.. Si por el contrario. . ... .

. el teclado y la pantalla tienen asignados dos niveles de prioridad distintos. De esta forma. Si dicho bit est´ a a 1 el dispositivo generar´ a interrupciones. . . . En cuanto al nivel de prioridad de las interrupciones generadas. El teclado permite comprobar c´ omo se realizar´ ıa la gesti´ on de un dispositivo de entrada por medio de interrupciones. . se pondr´ a a 1 el bit correspondiente al nivel de prioridad 0 del campo de interrupciones pendientes del registro Cause. no es necesario que el procesador interrogue peri´ odicamente a la pantalla para saber si ya ha ´ ltimo dato enviado o todav´ terminado de escribir el u ıa no. . Por tanto. Cada uno de dichos dispositivos posee un registro de Control. . el controlador del teclado generar´ a una interrupci´ on cada vez que se pulse una tecla. Si se activa el manejo por interrupciones del teclado. . El bit 1 de dicho registro determina si el dispositivo en cuesti´ on debe generar o no interrupciones. cuando el controlador del teclado genere una interrupci´ on. . as. . . Teclado y pantalla SPIM simula dos dispositivos de entrada/salida que pueden gestionarse por medio de interrupciones: un teclado y una pantalla. cuando el controlador de la pantalla genere una interrupci´ on. . . . se pondr´ a a 1 el bit 11 del registro Cause. . . . . . . Ambos dispositivos permiten ser instruidos sobre si deben generar o no interrupciones. . si se quiere gestionar el teclado por medio de interrupciones se deber´ a poner a 1 el bit 1 de su registro de Control. . . . . . . . que se ha producido una interrupci´ on. Por otro lado. . . . Esto es.2. . . EJERCICIOS . Dicho c´ odigo de excepci´ on indica. . . . . . tambi´ en Adem´ se pondr´ a a 0 el campo c´ odigo de excepci´ on del registro Cause. Esto es. . . . . si se activa el manejo por interrupciones de la pantalla. . · 252 Se ha explicado c´ omo se puede activar o desactivar la generaci´ on de interrupciones en los dispositivos simulados por SPIM: modificando el bit 1 del registro de Control de dichos dispositivos. . . De forma similar. no es necesario que el procesador interrogue peri´ odicamente al teclado para saber si se ha pulsado una tecla o no. . De esta forma. . . . . . . la pantalla permite comprobar c´ omo se realizar´ ıa la gesti´ on de un dispositivo de salida por medio de interrupciones. En caso contrario.132 Gesti´ on de la entrada/salida mediante interrupciones 10. . . . . . .5. . cuando el teclado o la pantalla generen una interrupci´ on. no lo har´ a. . . se pondr´ a a 1 el bit 10 del registro Cause. . . tal y como se ha visto anteriormente. . . . el controlador de la pantalla generar´ a una interrupci´ on cuando el dato escrito en su registro de Datos haya sido impreso. De igual forma. . As´ ı. El teclado tiene asignado el nivel de prioridad 1 y la pantalla el nivel de prioridad 0. se pondr´ a a 1 el bit correspondiente al nivel de prioridad 1 del campo de interrupciones pendientes del registro Cause.

manteniendo el resto de interrupciones tal y como est´ en.. ...s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 # # R u t i n a de t r a t a m i e n t o de e x c e p c i o n e s y programa c a r g a d o r # ( D e r i v a d o s de l a r u t i n a y c a r g a d o r p r o p o r c i o n a d o s con SPIM ) # #====================================================================== # R u t i n a de t r a t a m i e n t o de l a s e x c e p c i o n e s #====================================================================== # # E s t a r u t i n a de t r a t a m i e n t o de e x c e p c i o n e s s e e j e c u t a cuando o c u r r e # una e x c e p c i o ´ n . E l r e s t o # de r e g i s t r o s u t i l i z a d o s d e b e r a ´ n almacenarse y r e s t a u r a r s e ...... a s c i i z ” ∗ Se ha g e n e r a d o una i n t e r r u p c i o ´ n de t e c l a d o ∗\ n ” .... habilitar la atenci´ on de dichas interrupciones en el procesador.word 0 ... # . Explica qu´ e se tendr´ ıa que hacer para habilitar en el procesador las interrupciones de teclado y pantalla.. ... no basta con que e adem´ as..... · 253 Escribe el c´ odigo necesario para habilitar en el procesador la interrupci´ on de teclado y enmascarar la de la pantalla..... D i s t i n g u e e n t r e e x c e p c i o n e s que no s o n i n t e r r u p c i o n e s e # i n t e r r u p c i o n e s . a s c i i z ” ∗ Se ha g e n e r a d o una e x c e p c i o ´ n ∗\ n ” .  exceptions-3. Es necesario... a s c i i z ” ∗ Se ha g e n e r a d o una i n t e r r u p c i o . interrupciones.. s e p u e d e n u t i l i z a r # l o s r e g i s t r o s $ k0 y $ k1 s i n a l m a c e n a r s u s v a l o r e s a n t i g u o s . es una nueva modificaci´ on del c´ odigo de la rutina de tratamiento de excepciones.....s. S i m p l e m e n t e i m p r i m e un m e n s a j e i n d i c a d o qu e ´ t i p o de # excepcio ´ n s e ha g e n e r a d o .. · 254 Escribe el c´ odigo necesario para enmascarar las interrupciones tanto de pantalla como de teclado...word 0 exc : int : kbd : s1 : s2 : # Debido a que l a r u t i n a s e e j e c u t a en e l k e r n e l .. Tiene por objeto capturar la interrupci´ on del teclado y gestionar la entrada de datos (del teclado) por interrupciones...kdata ´ n s o f t w a r e ∗\ n ” .................... Entrada de datos gestionada mediante interrupciones El siguiente programa. Interrupciones 133 Sin embargo. k t e x t 0 x80000180 # Comienzo d e l v e c t o r de e x c e p c i o n e s # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Los r e g i s t r o s que v a y a n a u t i l i z a r s e d e b e r a ´ n guardarse para # p o s t e r i o r m e n t e r e s t a u r a r s e .. ... Analiza la nueva versi´ on de la rutina de tratamiento de excepciones y contesta a las cuestiones que aparecer´ an a continuaci´ on.. No s e p u e d e u t i l i z a r l a p i l a . para gestionar los dispositivos de entrada/salida por medio de ´ stos generen las interrupciones.. exceptions-3...5..10......

$14 # + #============================================================ ret : # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Restauracio ´ n de l o s r e g i s t r o s u t i l i z a d o s p o r l a r u t i n a lw $v0 . s 2 # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Determinacio ´ n de l a c a u s a de l a e x c e p c i o ´n mfc0 $k0 . 4 # syscall 4 ( print str ) l a $a0 .set at # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # Restauracio ´ n del estado mtc0 $0 . 2 # Extraccio ´ n d e l Co ´ digo de E x c e p c i o ´n a n d i $a0 . 4 # | Excepcio −EPC+4 ´ n : EPC< mtc0 $k0 . s e t noat move $ a t $k1 . 4 # + l a $a0 . s 1 sw $a0 . $k0 . e x c s w nop # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − int : #============================================================ # T r a t a m i e n t o de i n t e r r u p c i o n e s a n d i $a0 . 4 l a $a0 . i n t k b d l i $v0 . 0 . $a0 . $k0 . e s una i n t e r r u p c i o ´n bne $a0 . k b d # | M e n s a j e de i n t e r r u p c i o ´ n de t e c l a d o syscall # + j ret #============================================================ e x c s w : #============================================================ # T r a t a m i e n t o de e x c e p c i o n e s ( no i n t e r r u p c i o n e s ) l i $v0 .set at sw $v0 . $13 # P u e s t a a 0 d e l r e g i s t r o Cause # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − . $ a t . $13 # R e g i s t r o Cause s r l $a0 . $k0 . int syscall j ret # ¿Es de t e c l a d o ? # # Interrupcio ´ n no r e c o n o c i d a i n t k b d : l i $v0 . s 2 . 0 x 1 f # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # S i e l Co ´ digo de E x c e p c i o ´ n e s 0 . s 1 lw $a0 . s e t noat move $k1 . $14 # + addiu $k0 . 0 x0800 bne $a0 .134 Gesti´ on de la entrada/salida mediante interrupciones 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 # Se g u a r d a n : # ∗ E l r e g i s t r o $ a t en e l r e g i s t r o $ k1 # ∗ E l r e g i s t r o $ v0 en l a p o s i c i o ´ n de memoria s 1 # ∗ E l r e g i s t r o $ a0 en l a p o s i c i o n de memoria s 2 . $0 . e x c syscall mfc0 $k0 .

. .. . ..globl eoth : eoth # s y s c a l l 10 ( e x i t ) . 0( $t1 ) o r i $t0 .s. .. . . . .. . I n v o c a l a r u t i n a ” main ” con l o s a r g u m e n t o s : # main ( argc .. . .. Para gestionar mediante interrupciones la entrada de datos desde un teclado es necesario habilitar las interrupciones de teclado tanto en el procesador como en el controlador del teclado... . El c´ odigo necesario para llevar a cabo dichas operaciones se muestra en el siguiente programa.. . 0 x f f f f # Activacio ´ n de l a s i n t e r r u p c i o n e s en e l t e c l a d o lw $t0 .s.. . ..10. . . · 255 Analiza la rutina exceptions-3. . ... Explica las diferencias con la rutina exceptions-2..data cadena : . . e n v p ) #====================================================================== . . . ... EJERCICIOS . . . . ..... . . . .... .. .text .. .. .. . .5. .... . . ... ..  codigo-teclado... . .. · 256 Explica de qu´ e tipo de son las excepciones que trata el programa exceptions-3..s y en qu´ e consiste su tratamiento.. .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # # Programa que g e s t i o n a e l t e c l a d o p o r medio de i n t e r r u p c i o n e s # ... . .. .globl start start : lw $a0 0 ( $ s p ) # argc addiu $a1 $ s p 4 # argv addiu $a2 $a1 4 # envp s l l $v0 $a0 2 addu $a2 $a2 $v0 j a l main nop l i $v0 10 syscall .text main : # $t1 < − direccio ´ n b a s e de l o s c o n t r o l a d o r e s ( 0 x f f f f 0 0 0 0 ) l u i $t1 ... . .. .. .. a s c i i z ” E s t o e s una p r u e b a \ n ” . argv . ... . . . . $t0 .. . .. ... .... .. 2 sw $t0 . Interrupciones 135 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − # R e t o r n o de l a r u t i n a de t r a t a m i e n t o de e x c e p c i o n e s eret # − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − #====================================================================== # Programa c a r g a d o r ... ...... ... .... . 0( $t1 ) .

bucle bucle : Para comprobar el funcionamiento de la nueva rutina de excepciones y del programa codigo-teclado. la rutina exceptions-3. . ... . . . . . . implementada en el ejercicio 259 para que cuando se pulse la tecla ((e)) se enmascaren las interrupciones de teclado. en primer luUna vez el simulador est´ gar. el fichero correspondiente al programa codigo-teclado. −1 bnez $ t 7 . ...... por ejemplo la letra ((t)).. . .136 Gesti´ on de la entrada/salida mediante interrupciones 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # Habilitacio ´ n de l a s i n t e r r u p c i o n e s de n i v e l de p r i o r i d a d uno mfc0 $ t 0 . . · 261 Modifica la rutina de tratamiento de la interrupci´ on del teclado. . . .....s y exceptions-3. el c´ odigo ASCII de la tecla pulsada se escriba en la pantalla.. ... . .. ... .. . . ... · 257 Explica la funci´ on que tiene cada instrucci´ on (o grupo de instrucciones) del programa codigo-teclado...... . . .. .. .. $ t 0 .. . se termine la ejecuci´ on del programa. . .. .. ... . ... . $12 # B u c l e i n f i n i t o que i m p r i m e l a c a d e n a ” E s t o e s un p r u e b a ” la $a0 ..... . .. .. Tal y como se ha explicado en la secci´ on 10. . .. . .... . ..... . ... . 0 x801 mtc0 $ t 0 .. $0 . ...... ... .... EJERCICIOS DE AMPLIACI ON · 260 Modifica la rutina de tratamiento de la interrupci´ on del teclado. ... c a d e n a li $v0 ..... .... ´ ... 30000 sll $t7 ...s se deber´ a cargar el simulador con la opci´ on de entrada/salida mapeada en memoria y sin la rutina por defecto de tratamiento de excepciones. Una vez cargados ambos c´ odigos. . se puede proceder a su ejecuci´ on (comenzando en la direcci´ on de memoria 0x0040 0000). $ t 7 ..... para que cuando se pulse una determinada tecla. ..... . 3 # $ t 7 <−30000∗8 r e t a r d o : a d d i $ t 7 .. ... . 4 syscall a d d i $ t 7 .. ........... EJERCICIOS . . . .. . ... ... .s. .... .. .. ... .. r e t a r d o beqz $0 .. .... .3.s...... e en ejecuci´ on se deber´ a cargar.s y. . . implementada en el ejercicio 259.. .... · 259 Modifica la rutina de tratamiento de la interrupci´ on de teclado para que cuando se produzca una interrupci´ on de teclado.. . . . Por tanto.. ...... . .... .. en cuanto se pulse la tecla ((e)) se deber´ an ignorar las peticiones de interrupci´ on generadas por el teclado.. .... .. ...... .s.. . . .. Indica cu´ ales son las dos posibles formas de enmascarar la interrupci´ on de teclado.... $12 o r i $ t 0 ... ... .. · 258 Describe c´ omo interact´ uan los programas codigo-teclado. a continuaci´ on.. .... $t7 ........

3. No se ha visto c´ omo gestionar el que varios dispositivos generen de forma simult´ anea una interrupci´ on. es en dicha rutina donde debe decidirse qu´ e es lo que se debe hacer cuando se han generado dos o m´ as interrupciones simult´ aneas. e tina de tratamiento de excepciones. posteriormente. Por tanto.5. De hecho. la gesti´ on de interrupciones generadas simult´ aneamente por el teclado y la pantalla. La identificaci´ on de la causa de la interrupci´ on: reloj programable o teclado. la de reloj y la de teclado. 3. . Por tanto. Se va a estudiar dicha problem´ atica suponiendo que se pretende dise˜ nar un sistema que disponga de un reloj programable y un teclado que se quieren gestionar mediante interrupciones. sea cual sea. La habilitaci´ on de las interrupciones pertinentes para que dichos dispositivos se puedan gestionar por interrupciones. A continuaci´ on se describe con m´ as detalle cada uno de los anteriores aspectos. El objetivo de este apartado es el de mostrar c´ omo se pueden gestionar las interrupciones producidas por dos dispositivos de forma simult´ anea.5. Consiste en la habilitaci´ on de las interrupciones. 2. en un computador es bastante habitual que varios dispositivos soliciten de forma simult´ anea la atenci´ on del procesador. se va a estudiar la gesti´ on de interrupciones generadas simult´ aneamente por el reloj y el teclado y. Tratamiento de interrupciones simult´ aneas En los apartados anteriores se ha visto como tratar las interrupciones generadas por el reloj programable. Habilitaci´ on de las interrupciones. Interrupciones 137 10. El software de dicho sistema deber´ a tener en cuenta los siguientes aspectos: 1. Pero en cada uno de los casos s´ olo se ha visto c´ omo tratar cada una de dichas interrupciones por separado. la rutina de tratamiento de excepciones debe dise˜ narse para poder gestionar el que varias interrupciones se produzcan de forma simult´ anea. el teclado y la pantalla. El procesamiento adecuado de cada una de dichas interrupciones. En concreto. Reloj programable y teclado ´ sta es tratada por la ruCuando se produce una excepci´ on.10. tanto en los dispositivos como en el procesador.

. . Desarrollo del c´ odigo que deber´ a tratar la interrupci´ on de reloj y retornar al proceso interrumpido. . . Consiste en codificar las operaciones que se deben llevar a cabo para el tratamiento de cada una de dichas interrupciones. . . . . Programar el reloj para que genere interrupciones peri´ odicas. . .s para que se traten las interrupciones generadas por el reloj y el teclado. . .138 Gesti´ on de la entrada/salida mediante interrupciones Habilitar las interrupciones en el teclado. . · 263 Modifica el programa exceptions. . . . . . Procesamiento de las interrupciones. . . . . Identificaci´ on de la causa de la interrupci´ on (reloj o teclado). . . . . . . EJERCICIOS . . . . . Habilitar las interrupciones en el procesador: poner a 1 los bits correspondientes a los niveles de prioridad 1 y 5 en la m´ ascara de interrupciones y poner a 1 el bit de habilitaci´ on de interrupci´ on. Consiste en incluir en la rutina de tratamiento de excepciones el c´ odigo necesario para determinar la causa de la interrupci´ on para entonces saltar a la parte de c´ odigo correspondiente. Cuando se produce una interrupci´ on. seg´ pendiente: 15 o un sea la interrupci´ on pendiente del reloj o del teclado. ya sea de reloj o de teclado. . . . . . . en el campo c´ odigo de excepci´ on del registro Cause se carga un 0. . . . . . . . . Ejecute un bucle infinito que imprima alg´ un mensaje. . . . . . . · 262 Desarrolla un programa en ensamblador que realice las siguientes tareas: Inicialice el sistema para que los dispositivos de reloj y teclado se gestionen mediante interrupciones. . . de acuerdo con las siguientes indicaciones: La parte de la rutina que trate la interrupci´ on de reloj deber´ a imprimir por pantalla el mensaje ((INT DE RELOJ)). . . . . Desarrollo del c´ odigo que deber´ a tratar la interrupci´ on del teclado y retornar al proceso interrumpido. . Programe el reloj para que genere interrupciones cada 20 segundos. . . . En ese mismo registro se pone a 1 el bit correspondiente del campo interrupci´ on ´ 11. . . . . .

Cuando se pulse la tecla ((t)).... 2.. · 265 ¿En qu´ e orden se servir´ an las interrupciones en caso de producirse simult´ aneamente la de reloj y la de teclado? . El software de dicho sistema deber´ a tener en cuenta los siguientes aspectos: 1.... La sincronizaci´ on de la operaci´ on de salida debe realizarse por consulta de estado.. La habilitaci´ on de las interrupciones pertinentes para que dichos dispositivos se puedan gestionar por interrupciones..... · 264 Carga los dos programas anteriores en el simulador y comprueba su funcionamiento. Identificaci´ on de la causa de la interrupci´ on (teclado o pantalla)....... Habilitar las interrupciones en el teclado..... Consiste en la habilitaci´ on de las interrupciones.. Teclado y pantalla Se pretende dise˜ nar un sistema que disponga de un teclado y una pantalla que se quieren gestionar mediante interrupciones.. Habilitar las interrupciones en el procesador: poner a 1 los bits correspondientes a los niveles de prioridad 0 y 1 en la m´ ascara de interrupciones y poner a 1 el bit de habilitaci´ on de interrupci´ on.. deber´ a imprimir los caracteres que se hab´ ıan almacenado en dicho buffer......... Habilitar las interrupciones en la pantalla.5. La identificaci´ on de la causa de la interrupci´ on: teclado o pantalla.. .... Consiste en incluir en la rutina de tratamiento de excepciones el c´ odigo necesario para determinar la causa de la interrupci´ on para entonces saltar a la parte de c´ odigo correspondiente.....10. A continuaci´ on se describe con m´ as detalle cada uno de los anteriores aspectos.......... El procesamiento adecuado de cada una de dichas interrupciones.... 3. la de teclado y la de pantalla.. Habilitaci´ on de las interrupciones...... tanto en los dispositivos como en el procesador.......... Interrupciones 139 La parte de la rutina que trate la interrupci´ on del teclado deber´ a imprimir por pantalla el mensaje ((INT DE TECLADO)) y almacenar el car´ acter introducido en un buffer..

. .. ya sea de teclado o de pantalla. . .140 Gesti´ on de la entrada/salida mediante interrupciones Cuando se produce una interrupci´ on...... . . Procesamiento de las interrupciones.. . .. .. .. . 2.. . Si es as´ ı.. . .... . deber´ as seguir los siguientes pasos: 1.. . . Mientras se est´ e realizando la impresi´ on por pantalla se enmascararan las interrupciones de teclado. . . . utilizando la funci´ on 4 del monitor.. . ... . ... . Modifica el programa exceptions. teclado y pantalla.. simplemente deber´ a entrar en un bucle sin fin en el que no har´ a nada (es decir. .. El programa principal.... . . Para realizar este ejercicio. ... El funcionamiento de las operaciones de entrada y salida realizadas a trav´ es de estos dispositivos ser´ an gestionadas mediante interrupciones de la siguiente forma: Gesti´ on de la entrada... . . .. se habilitar´ an las interrupciones de teclado y se comprobar´ a si se han almacenado 10 caracteres en el buffer.... una vez habilitadas las interrupciones pertinentes. .. .. ...s para que el procesador sea capaz de gestionar y procesar las interrupciones del teclado y la pantalla. . Desarrollo del c´ odigo que deber´ a tratar la interrupci´ on de la pantalla y retornar al proceso interrumpido. Desarrollo del c´ odigo que deber´ a tratar la interrupci´ on del teclado y retornar al proceso interrumpido... . . Cada vez que finalice una operaci´ on de salida se imprimir´ a en la pantalla el siguiente mensaje: ((INT CONSOLA\n)).. . . . en el campo c´ odigo de excepci´ on del registro Cause se carga un 0. . no imprimir´ a nada por pantalla).. .. .. El dato introducido por el teclado se almacenar´ a en un buffer y se imprimir´ a en la pantalla. se imprimir´ a el contenido de dicho buffer. . ... .. . . para que las operaciones de entrada y salida realizadas a trav´ es de ellos se realicen mediante interrupciones seg´ un el funcionamiento descrito. . En ese mismo registro se pone a 1 el bit correspondiente del campo interrupci´ on ´ 10... .. .. . Dise˜ na un programa que inicialice los dispositivos..... . .... Gesti´ on de la salida. · 266 Un sistema basado en el procesador MIPS32 tiene conectados un teclado y una pantalla. y se terminar´ a el programa en ejecuci´ on. ..... EJERCICIOS . .. . . . ... seg´ pendiente: 11 o un sea la interrupci´ on pendiente del teclado o de la pantalla... Consiste en codificar las operaciones que se deben llevar a cabo para el tratamiento de cada una de dichas interrupciones. .. . . . .. . .

. . El cambio de ejecuci´ on de un c´ odigo a otro se realizar´ a por medio de la pulsaci´ on de una tecla. . . . . Para poder observar claramente que dicho programa funciona como se ha indicado. El cambio de ejecuci´ u on entre un c´ odigo y el otro ser´ a realizado por la rutina de tratamiento de la interrupci´ on de teclado. pru´ ebalo con los dos siguientes c´ odigos: un c´ odigo que imprima la secuencia de n´ umeros del 0 al 9 y otro que imprima la secuencia del 9 al 0. . . · 268 Desarrolla un programa que permita la ejecuci´ on alternada de dos c´ odigos. . · 267 Desarrolla un programa que gestione la entrada y salida de datos mediante interrupciones. . . . . . . . . . . .10. Hasta que se pulse la tecla ((v)). La gesti´ on se deber´ a realizar de la siguiente forma. . pru´ ebalo con los dos siguientes c´ odigos: un c´ odigo que imprima la secuencia de n´ umeros del 0 al 9 y otro que imprima la secuencia del 9 al 0. Cuando se retome la ejecuci´ on del c´ odigo previa´ ste deber´ mente interrumpido. . Para poder observar claramente que dicho programa funciona como se ha indicado. . En esta nueva versi´ on. . El programa deber´ a comenzar enmascarando la interrupci´ on de reloj. . . . Cada vez que se pulse una tecla. . . La sincronizaci´ on del env´ ıo de datos a la pantalla se deber´ a realizar mediante ´ ltimo car´ ´ ste haya sido viinterrupciones. el cambio de ejecuci´ on de un c´ odigo a otro se realizar´ a por medio de la interrupci´ on de reloj. . . A partir de dicho momento. . Cuando se retome la ejecuci´ on ´ ste deber´ del c´ odigo previamente interrumpido. . . A partir de dicho momento. Coincidiendo con en pantalla los caracteres que se hab´ ıan almacenado en e el comienzo del vaciado del buffer. . . . la gesti´ on de la entrada y salida deber´ a realizarse mediante interrupciones. Problemas del cap´ ıtulo 141 10. En todos los casos. Problemas del cap´ ıtulo . . . . . . . . uno a uno. Cuando se haya enviado el u acter y e sualizado. e a continuar a partir del punto ´ ltimo cambio. . . e a continuar a partir del punto donde se realiz´ o el ´ ltimo cambio. . . · 269 Desarrolla de nuevo un programa que permita la ejecuci´ on alternada de dos c´ odigos. . se enmascarar´ a la interrupci´ on de teclado y se imprimir´ an. . .6. . . . . . se deber´ a almacenar el c´ odigo correspondiente a dicha tecla en un buffer. . Los c´ odigos de las teclas pulsadas se ir´ an almacenando en un buffer hasta que se pulse la tecla ((w)). . se volver´ a a habilitar la interrupci´ on del teclado y se repetir´ a todo el proceso de nuevo.6. se deber´ a enmascarar la interrupci´ on del . . EJERCICIOS . se comenzar´ a el vaciado del buffer mostrando ´ l. . . . . El cambio de ejecuci´ donde se realiz´ o el u on entre un c´ odigo y el otro ser´ a realizado por la rutina de tratamiento de la interrupci´ on de reloj. . . los c´ odigos de las teclas pulsadas. · 270 Desarrolla un programa que implemente el funcionamiento descrito a continuaci´ on. El cambio entre un c´ odigo y el otro deber´ a realizarse cada minuto.

. Transcurridos los 20 segundos desde que se puls´ o la tecla ((s))... se dar´ a por vaciado del buffer.. el sem´ Transcurridos los 10 segundos desde que se puso en a aforo cambiar´ a a rojo (en pantalla se mostrar´ a el texto ((Sem´ aforo en rojo. Los datos introducidos durante dicho intervalo se ir´ an almacenando en un buffer. comenzando de nuevo todo el proceso... esperando pulsador))). en 10 segundos.. ´ mbar.. una vez vaciado el buffer se los datos del buffer por la pantalla.... se enmascarar´ a la interrupci´ on de la pantalla..... sem´ aforo en rojo))).. en 30 segundos. se enmascarar´ a la interrupci´ on de reloj y se habilitar´ a la del teclado..... sem´ aforo en verde).... comenzando de nuevo todo el proceso.. .. Durante 20 segundos. Por u volver´ a a repetir todo el proceso. Transcurrido dicho tiempo. Transcurridos los 20 segundos.. El sem´ aforo estar´ a inicialmente en verde (se mostrar´ a el texto ((Sem´ aforo en verde..... se imprimir´ an ´ ltimo...... transcurridos 30 segundos con el sem´ ´ ste volPor u aforo en rojo....142 Gesti´ on de la entrada/salida mediante interrupciones teclado durante 20 segundos.. el sistema desarrollado debe permitir la entrada de datos a trav´ es del teclado. e ver´ a a ponerse en verde... el sem´ aforo deber´ a cambiar despu´ es de 20 ´ mbar (al pulsar la tecla ((s))...... · 271 Desarrolla un programa que implemente el siguiente funcionamiento utilizando interrupciones para la gesti´ on de todas las operaciones de entrada y salida..... el sem´ aforo ´ mbar (en pantalla se mostrar´ cambiar´ aaa a el texto ((Sem´ aforo en ´ ambar... Cuando se pulse la tecla ((s))......... se mostrar´ segundos.. Tiempo durante el cual no se deber´ an aceptar nuevos datos... El funcionamiento de dicho sem´ aforo deber´ a ser el siguiente. a a a el texto ((Pulsador activado: en 20 segundos. .... ´ ltimo. · 272 Desarrolla un programa que simule el funcionamiento de un sem´ aforo controlado por un pulsador. el sem´ aforo cambiar´ a a ´ ambar)))....

Larus. SPIM S20: A MIPS32 Simulator. Editorial Revert´ e.B IBLIOGRAF ´ IA [Lar] J. Hennessy (2000). R. Estructura y dise˜ no de computadores: interficie circuiter´ ıa/programaci´ on. Patterson y J. L. A. 143 . [Pat00] D.

.

se reproduce la salida del comando man xspim correspondiente a la versi´ on 7.0 de dicho simulador. SPIM can read and immediately execute files containing assembly language or MIPS executable files. and spim executes your command. It uses the Xwindow system. SPIM is a self-contained system for running these programs and contains a debugger and interface to a few operating system services. The fancier version of SPIM is called xspim.A MIPS32 Simulator SYNTAX xspim [-asm/-bare -exception/-noexception -mapped_io/-nomapped_io -delayed_branches -delayed_loads -stext size -sdata size -sstack size -skdata size -ldata size -lstack size -hexgpr/-nohexgpr -hexfpr/-nohexfpr] -file file -execute file A XSPIM spim(1) M ANUAL DE USO DEL COMANDO A continuaci´ on. is a much easier program to learn and use because its commands are always visible on the screen and because it continually displays 145 . however. so you must have a bit-mapped display to run it. It operates like most programs of this type: you type a line of text. -quiet/-noquiet -sktext size -lkdata size DESCRIPTION SPIM S20 is a simulator that runs programs for the MIPS32 RISC computers. It runs on any type of terminal. The plain version is called spim. hit the return key. xspim. SPIM comes in two versions.´NDICE APE spim(1) NAME xspim .

This exception handler handles exceptions. ktext. -quiet Print a message default. Without the startup routine. and kdata. or call before transferring control. The data segment holds the program’s data. In addition. when an exception occurs. unless the -bare flag is set. When an exception occurs. assembler. is the default.146 Manual de uso del comando xspim the machine’s registers. SPIM’s default is to simulate non-delayed loads. OPTIONS xspim has many options: -asm Simulate the virtual MIPS machine provided by the This is the default. The stack segment holds its runtime stack. SPIM’s default is to simulate non-delayed transfers. data. This -noexception Do not load the standard exception handler and startup code. -mapped_io Enable the memory-mapped IO facility. non-interlocked load instructions. SPIM jumps to location 0x80000080. -nomapped_io Disable the memory-mapped IO facility. -exception Load the standard exception handler and startup code. which must contain code to service the exception. this file contains startup code that invokes the routine main. unless the -bare flag is set. This is the -noquiet Do not print a message at exceptions. -stext size -sdata size -sstack size -sktext size -skdata size Sets the initial size of memory segment seg to be size bytes. Programs that use SPIM syscalls to read from the terminal cannot also use memorymapped IO. -delayed_loads Simulate MIPS’s original. jump. The text segment contains instructions from a program. SPIM begins execution at the instruction labeled __start. -delayed_branches Simulate MIPS’s delayed control transfers by executing the instruction after a branch. In addition to running a . stack. Implies -quiet. -bare Simulate a bare MIPS machine without pseudo-instructions or the additional addressing modes provided by the assembler. The memory segments are named: text.

-hexfpr Disply the floating-point registers (FPRs) in hexadecimal. The memory segments that can grow are data. There is no kstack segment since the system code uses the same stack as the program. Microsoft Research.000 bytes. the pair of arguments -sdata 2000000 starts the user data segment at 2. Larus. -execute file 10 Load and execute the MIPS executable (a. University of Wisconsin-Madison. Computer Sciences Department.com). -nohexfpr Disply the floating-point registers (FPRs) as values floating-point -file file 10 Load and execute the assembly code in the file.’’ included with AUTHOR James R. SPIM also executes system code that handles interrupts and exceptions. -ldata size -lstack size -lkdata size Sets the limit on how large memory segment seg can grow to be size bytes.out) file.Manual de uso del comando xspim 147 program.000. and kdata. For example. SEE ALSO spim(1) James R. works on systems using a MIPS processors. stack. ‘‘SPIM S20: A MIPS SPIM distribution. Only BUGS Instruction opcodes cannot be used as labels. This code resides in a separate part of the address space called the kernel. R2000 Simulator. Larus. -nohexgpr Disply the general purpose registers (GPRs) in decimal. spim(1) . Current address: James R Larus (larus@microsoft. The ktext segment holds this code’s instructions and kdata holds its data. -hexgpr Disply the general purpose registers (GPRs) in hexadecimal.

´NDICE APE

B

L LAMADAS AL S ISTEMA O PERATIVO
El simulador SPIM proporciona, por medio de la instrucci´ on (( syscall )) (llamada al sistema), un peque˜ no conjunto de servicios similares a los que proporciona habitualmente un sistema operativo. En este ap´ endice se tratan con detalle tan s´ olo algunas de las llamadas al sistema proporcionadas por SPIM: la que sirve para indicar la finalizaci´ on del programa y algunas de las que proporcionan la entrada por teclado y salida por pantalla del simulador.

B.1.

Introducci´ on

La Tabla B.1 muestra todos los servicios proporcionados por el sistema operativo del simulador SPIM [Lar]. En dicha tabla se muestran los servicios disponibles, el c´ odigo que se debe utilizar para indicar qu´ e servicio se quiere utilizar, los argumentos de entrada, y en el caso de que el servicio en cuesti´ on devuelva un resultado, cu´ al es el registro utilizado para ello. Para solicitar un servicio, un programa debe cargar el c´ odigo de llamada al sistema en el registro $v0 y sus argumentos en los registros $a0. . .$a3 (o $f12 para los valores en coma flotante, seg´ un se muestra en la Tabla B.1). Aquellas llamadas al sistema que devuelven resultados proporcionan los resultados en el registro $v0 (o $f0 si el resultado es un n´ umero en coma flotante). ´ nicamente ejemplos de las llamadas a los En este ap´ endice se muestran u siguientes servicios: exit: finaliza el programa en curso. 149

150

Llamadas al Sistema Operativo

print int: imprime un entero en la pantalla. print string: imprime una cadena de caracteres en la pantalla. read int: lee un entero del teclado. read string: lee una cadena de caracteres del teclado.
C´ odigo de llamada al sistema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Servicio print int print float print double print string read int read float read double read string sbrk exit print character read character open read write close exit2

Argumentos $a0 = integer $f12 = float $f12 = double $a0 = cadena de caracteres

Resultado

integer (en $v0) float (en $f0) double (en $f0) $a0 = buffer, $a1 = longitud $a0 = cantidad $a0 = car´ acter $a0 = nombre de fichero, $a1 = flags, $a2 = modo $a0 = descriptor de fichero, $a1 = buffer, $a2 = cuenta $a0 = descriptor de fichero, $a1 = buffer, $a2 = cuenta $a0 = descriptor de fichero $a0 = valor car´ acter (en $v0) descriptor de fichero (en $v0) bytes le´ ıdos (en $v0) bytes escritos (en $v0) 0 (en $v0) direcci´ on (en $v0)

Tabla B.1: Llamadas al sistema

B.2.

Finalizaci´ on del programa en curso: exit

Para finalizar un programa de forma correcta, es decir, informando al sistema operativo de que el programa ha concluido, se debe llamar al servicio exit (c´ odigo 10). Este servicio no requiere de ning´ un par´ ametro de entra´ nico que habr´ da por lo que lo u a que hacer antes de la instrucci´ on (( syscall )) ser´ a cargar en el registro $v0 el valor 10. El siguiente programa de ejemplo suma dos n´ umeros y luego llama al servicio exit.

syscall # Zona de d a t o s main : 1 v e c t o r ( $0 ) v e c t o r +4 ( $0 ) # Zona de i n s t r u c c i o n e s # Llamada a l s i s t e m a p a r a p r i n t i n t # M u e s t r a e l p r i m e r nu ´ mero en p a n t a l l a # M u e s t r a e l s e g u n d o nu ´ mero en p a n t a l l a v e c t o r +8 ( $0 ) # M u e s t r a e l t e r c e r numero en p a n t a l l a # F i n a l i z a r programa l i $v0 . Si se quisiera introducir alg´ un tipo de separador entre los n´ umeros. 28 . cuando no se utiliza la llamada al sistema. habr´ ıa que . Sin embargo. Impresi´ on de un entero: print int Para imprimir un entero en pantalla se debe utilizar el servicio print int (c´ odigo 1). 28 y -1 deber´ ıa llamar para cada uno de los n´ umeodigo 1).text l i $v0 . $ t 0 . los n´ umeros aparecen uno a continuaci´ on de otro. lw $a0 .word 34 .s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 vector : . Por ejemplo.data . al ejecutar el pro´ ste hubiera terminado pero con el siguiente error (que se puede ver en grama. syscall lw $a0 . 20 add $ t 2 . De esta forma. 10 syscall # Zona de programa # F i n a l i z a r programa ´ ste Si no se utiliza al final de un programa la llamada al sistema exit y e se ejecuta en el simulador. lo que generalmente provoca un error por intento de ejecuci´ on de algo que no es una instrucci´ on. Este servicio requiere que se indique en el registro de entrada $a0 el entero que se quiere imprimir en pantalla. la secuencia de enteros 34. si en el programa anterior no se hubiera utilizado la llamada al sistema exit. Un programa que hace e  syscall-print-int.3. e el panel de mensajes): Attempt to execute non-instruction at 0x00400030 B.B. 10 l i $ t 1 . −1 . el procesador ´ ltima insintenta decodificar la palabra que se encuentra a continuaci´ on de la u trucci´ on del programa. Impresi´ on de un entero: print int 151  syscall-exit. un programa que quiera imprimir en pantalla. pasando en el registro $a0 el valor del ros al servicio print int (c´ ´ sto es: entero que se quiere imprimir. $ t 1 l i $v0 . syscall lw $a0 .text l i $ t 0 . por ejemplo. da la impresi´ on de que el programa termina correctamente. 10 syscall En el programa anterior.3.s 1 2 3 4 5 6 7 main : .

un programa que quiera imprimir en pantalla ((¡Hola mundo!)) deber´ ıa llamar al servicio print string (c´ odigo 4).data # Zona de d a t o s .4. lee un entero del teclado y luego imprime el n´ umero le´ ıdo. Para ello.text # Zona de i n s t r u c c i o n e s . De esta forma. Lectura de un entero: read int Para leer un entero del teclado se debe utilizar el servicio read int (c´ odigo 5).s 1 2 3 4 5 6 . entre las llamadas al servicio print int. Este servicio requiere que se indique en el registro de entrada $a0 la direcci´ on de comienzo de la cadena que se quiere imprimir en pantalla. c a d e n a syscall l i $v0 .152 Llamadas al Sistema Operativo utilizar el servicio print string que se explica en la siguiente secci´ on. un programa que quiera leer un entero del teclado. De esta forma. B. 4 l a $a0 . a s c i i z ” E l nu cr : . a s c i i z ” \ n ” # r e t o r n o de c a r r o . Un pro´ sto es: grama que hace e  syscall-hola-mundo.  syscall-read-int. El siguiente programa muestra un mensaje solicitando la introducci´ on de un entero. pasando en el registro $a0 la direcci´ on de comienzo de la cadena ((¡Hola mundo!)).text l i $v0 . deber´ ıa odigo 5). Este servicio no requiere de ning´ un par´ ametro de entrada y devuelve el resultado en el registro $v0. 10 syscall # # # # Zona de i n s t r u c c i o n e s Llamada a l s i s t e m a p a r a p r i n t s t r Direccio ´ n de c o m i e n z o de l a c a d e n a M u e s t r a l a c a d e n a en p a n t a l l a main : # F i n a l i z a r programa B. Impresi´ on de una cadena: print string Para imprimir una cadena en pantalla se debe utilizar el servicio llamado print string (c´ odigo 4). La cadena debe terminar con el valor 0. a s c i i z ” ¡ H o l a mundo ! ” .data # Zona de d a t o s ´ mero e n t e r o : ” m e n s a j e 1 : . adem´ as de la llamada al servicio read int utiliza llamadas a los servicios print int y print string explicadas en las secciones anteriores.s 1 2 3 4 5 6 7 8 9 10 cadena : . a s c i i z ” I n t r o d u c e un n u ´ mero que h a s i n t r o d u c i d o e s e l : ” m e n s a j e 2 : .5. a la vuelta de dicha llamada el rellamar al servicio read int (c´ gistro $v0 tendr´ a el entero le´ ıdo.

4 l a $a0 . syscall l i $v0 .word 100 .B.6. deber´ ıa llamar al servicio read string (c´ en el registro $a0 la direcci´ on de comienzo de la zona de memoria en la que se debe almacenar la cadena y en el registro $a1 el tama˜ no en bytes de dicha zona de memoria. s p a c e 100 size : . 4 l a $a0 . 5 syscall o r i $ t 0 . a s c i i z ” Hola ” buffer : . 0 l i $v0 .  syscall-read-string. Lectura de una cadena: read string 153 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 main : l i $v0 . Este servicio requiere como par´ ametro de entrada la direcci´ on inicial donde se debe almacenar la cadena le´ ıda y el tama˜ no disponible para dicha cadena. un programa que quiera leer una cadena de caracteres del odigo 8). Lectura de una cadena: read string Para leer una cadena del teclado se debe utilizar el servicio read string (c´ odigo 8). $v0 . 0 4 cr # p r i n t s t r i n g mensaje1 # Llamada a l s i s t e m a p a r a r e a d i n t # Lee un n u ´ mero e n t e r o d e l t e c l a d o # $t0 < − $ v0 # p r i n t s t r i n g mensaje2 # print int # p r i n t s t r i n g r e t o r n o de c a r r o l i $v0 . 10 syscall # F i n a l i z a r programa B. adem´ as de la llamada al servicio read string utiliza la llamada al servicio print string explicada en la secci´ on B.s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 . o r i $a0 . a s c i i z ”¿Co m e n s a j e 2 : . 8 l a $a0 . syscall l i $v0 .text l i $v0 . l a $a0 . s i z e ( $0 ) syscall # Zona de i n s t r u c c i o n e s # p r i n t s t r i n g mensaje1 main : # # # # Llamada a l s i s t e m a p a r a r e a d s t r i n g Direccio ´ n d e l b u f f e r para l a cadena Tama n ˜o del b u f f e r Lee una c a d e n a de c a r a c t e r e s d e l t e c l a d o . b u f f e r lw $a1 . m e n s a j e 1 syscall l i $v0 . m e n s a j e 1 syscall l i $v0 .4. lee la cadena y luego la imprime de nuevo. El siguiente programa muestra un mensaje solicitando la introducci´ on de una cadena de caracteres. syscall 4 mensaje2 1 $t0 . De esta forma. y proporcionar teclado.data # Zona de d a t o s ´ mo t e l l a m a s ? \ n ” m e n s a j e 1 : .6. l a $a0 . Para ello.

l a $a0 . syscall l i $v0 . syscall 4 mensaje2 4 buffer # p r i n t s t r i n g mensaje2 # print string buffer l i $v0 . 10 syscall # F i n a l i z a r programa .154 Llamadas al Sistema Operativo 17 18 19 20 21 22 23 24 25 l i $v0 . l a $a0 .

´ ltima Contiene la direcci´ on de memoria de la u instrucci´ on ejecutada por el procesador. M´ ascara de interrupciones y bits de autorizaci´ on. Tipo de excepci´ on y bits de interrupciones pendientes.´NDICE APE Nombre del registro BadVaddr Status Cause EPC N´ umero de registro 8 12 13 14 Funci´ on Registro Status ··· 12 11 10 9 8 M´ ascara de Int. 3 2 Permiso de interrupci´ on 1 0 Permiso de interrupci´ on Antiguos Previos Actuales N´ ucleo/usuario N´ ucleo/usuario Registro Cause ··· 12 11 10 9 8 Interrupciones pendientes 5 4 3 2 C´ odigo de excepci´ on 155 N´ ucleo/usuario . 5 4 Permiso de interrupci´ on C R EGISTROS DEL C OPROCESADOR 0 Contiene la direcci´ on de memoria que ha provocado la excepci´ on.

156 Registros del Coprocesador 0 Excepciones del MIPS N´ um. 0 4 5 6 7 8 9 10 12 Nombre INT ADDRL ADDRS IBUS DBUS SYSCALL BKPT RI OVF Descripci´ on Interrupci´ on externa Excepci´ on por direcci´ on err´ onea (carga o lectura de instrucci´ on) Excepci´ on por direcci´ on err´ onea (almacenamiento) Error de bus en lectura de instrucci´ on Error de bus en carga o almacenamiento de datos Excepci´ on por llamada al sistema (syscall) Excepci´ on por punto de ruptura (breakpoint) Excepci´ on por instrucci´ on reservada Excepci´ on por desbordamiento aritm´ etico .

´NDICE APE 157 D C UADRO RESUMEN DEL JUEGO DE INSTRUCCIONES DEL MIPS .

.

Los 32 MSB del resultado se almacenan en el registro HI y los 32 LSB en el registro LO sle $t0. El resultado se almacena en el registro rd # $t0 ←$a0 + $a1 slti rt.0) ← 0x0000 li reg. $a2 # if ( $a0 == $a2) $t0 ← 1 # else $t0 ← 0 lh rt. rs. $a0. sin considerar el signo.. asociada a etiqueta VAR lui rt.16)← $s0(15) addi $t0. rt Resta R Resta el contenido de los registro rs y rt considerando el signo. slti $t0. inm Activa si menor con inmediato I Pone el registro rt a 1 si rs es menor que el dato inmediato inm y a 0 en caso contrario lb $s0. rs. El resultado se almacena en el registro r. $a0. $a2 # $t0 ←$a0 + 24 lhu $s0. El resultado se almacena en el registro rd COMPARACIONES slt rd. $a2 # $LO ← $s0 / $s1 # $HI ← $s0 % $s1 li $s0. 12($a0) # $s0 ← 0x000000(Mem[ 12 + $a0 ])(1byte) subu $t0. rs. rsrc2 Activa si mayor o igual PS Pone el registro rdest a 1 si rsrc1 es mayor o igual que rsrc2 y a 0 en caso contrario addi rt.0)← Mem[ 12 + $a0 ](2bytes) # $s0 (31. $a0. valor Suma inmediata I Suma el contenido del registro rs con el valor inmediato. $a0. dirección Carga dirección Carga la dirección calculada en reg la $s0. 12 # $s0 ← 12 # if ( $a0 != $a2) $t0 ← 1 # else $t0 ← 0 159 . dato Carga inmediata superior I Carga el dato inmediato en los 16 MSB del registro rt mult rs. $a0. -15 # if ( $a0 < -15) $t0 ← 1 # else $t0 ← 0 lbu rt. rt Suma R Suma el contenido de los registros rs y rt. $a1 subu rd.. rsrc2 Activa si mayor PS Pone el registro rdest a 1 si rsrc1 es mayor que rsrc2 y a 0 en caso contrario lhu rt. $a0. rt PS # $s0← dir. rs. rt Activa si menor R Pone el registro rd a 1 si rs es menor que rt y a 0 en caso contrario CARGA lw rt. 12($a0) # $s0(7. sin considerar el signo. sge $t0. $a0. signo I Carga media palabra (16 bits) almacenada en la media palabra de memoria especificada por la dirección en la parte baja del registro rt y extiende el signo sge rdest. $a2 lh $s0. rsrc1. rsrc2 Activa si no igual PS Pone el registro rdest a 1 si rsrc1 es diferente de rsrc2 y a 0 en caso contrario lui $s0. $a0.. rs. $a1 lb rt.16) ← 12 # $s0(15. 12($a0) # $s0← 0x0000Mem[ 12 + $a0 ])(2bytes) addiu $t0. VAR mult $s0. $a0. $a0. $a0. rsrc2 Activa si menor o igual PS Pone el registro rdest a 1 si rsrc1 es menor o igual que rsrc2 y a 0 en caso contrario la reg. El resultado se almacena en el registro rt..0) ← Mem[ 12 + $a0 ](1byte) # $s0(31.$a1 seq $t0. $a1 # $t0 ←$a0 . 12 # $s0(31. dirección Carga media palabra y no ext.CUADRO RESUMEN DEL LENGUAJE ENSAMBLADOR BÁSICO DEL MIPS-R2000 ARITMÉTICAS add rd. rsrc2 Activa si igual PS Pone el registro rdest a 1 si rsrc1 es igual que rsrc2 y a 0 en caso contrario Cuadro resumen del juego de instrucciones del MIPS lbu $s0. signo I Carga media palabra (16 bits) almacenada en la media palabra de memoria especificada por la dirección en la parte baja del registro rt y no extiende el signo addiu rt. $s1 sne $t0. sgt $t0.. rt Resta sin signo R Resta el contenido de los registros rs y rt. rsrc1. considerando el signo.dirección Carga palabra I Carga los 32 bits almacenados en la palabra de memoria especificada por dirección en el registro rt. 24 PS # if ( $a0 > $a2) $t0 ← 1 # else $t0 ← 0 sle rdest. sin considerar el signo. valor Suma inmediata sin signo I Suma el contenido del registro rs con el valor inmediato. rsrc1. -24 # $t0 ←$a0 + (-24) # if ( $a0 >= $a2) $t0 ← 1 # else $t0 ← 0 sgt rdest. rs. rs. $a2 # $HI ←($s0 * $s1) (31…16) # $LO←($s0 * $s1) (15…0) # if ( $a0 <= $a2) $t0 ← 1 # else $t0 ← 0 sne rdest. El resultado se almacena en el registro rd # $t0 ←$a0 + $a1 slt $t0. rsrc1. dato Carga inmediato Carga el dato inmediato en el registro reg. rs. dirección Carga byte y extiende signo I Carga los 8 bits almacenados en el byte de memoria especificado por dirección en el LSB del registro rt y extiende el signo # if ( $a0 < $a1) $t0 ← 1 # else $t0 ← 0 addu $t0. El resultado se almacena en el registro rt. $a1 addu rd. rsrc1. considerando el signo. $a0. div $s0. rt Suma sin signo R Suma el contenido de los registros rs y rt. $a1 sub rd. El cociente se almacena en LO y el resto en HI. $a0.$a1 seq rdest.. 12($a0) # $s0 (15. rt Multiplicación R Multiplica el contenido de los registros rs y rt. dirección Carga media palabra y ext. dirección Carga byte y no extiende signo I Carga los 8 bits almacenados en el byte de memoria especificado por dirección en el LSB del registro rt sin extender el signo # $t0 ←$a0 .8) ← $s0(7) sub $t0. 12($a0) # $s0 ← Mem[ 12 + $a0 ] add $t0. $s1 div rs. lw $s0. División R Divide el registro rs por el rt.

DIR jal rutina jr rs bge reg1. DIR ble reg1. shamt Desplaz. reg2. # $t0 ←$a0 & $a1 sra rd. El resultado se almacena en rt. $a1 # $t0 ←$a0 | $a1 bne rs. etiqueta Salto si distinto Salta a etiqueta si rs es diferente de rt I ori rt.Cuadro resumen del juego de instrucciones del MIPS CUADRO RESUMEN DEL LENGUAJE ENSAMBLADOR BÁSICO DEL MIPS-R2000 ALMACENAMIENTO sw rt. SLT blez $t1. # if ( $t0>$t1) $pc ← DIR ble $t0. etiq Salto menor o igual Salta a etiq si reg1 es menor o igual que reg2 PS mfhi $t0 mflo $t1 # $t0 ← HI # $t1 ← LO mflo rd mueve desde LO R Transfiere el contenido del registro LO al registro rd. El resultado se almacena en rd bltz rs. y el registro rs. rs. inm OR con inmediato I Operación OR bit a bit entre el dato inmediato. rt. rt. extendiendo ceros.$t1. rt AND entre registros R Operación AND bit a bit entre los registros rs y rt. shamt Desplazamiento lógico a la derecha R Desplaza el registro rt a la derecha tantos bits como indica shamt. 12($a0) # Mem[ 12 + $a0 ] ←$s0(15. $t1. DIR bgez $t0. reg2. 4 and $t0. $a0. inm AND con inmediato I Operación AND bit a bit entre el dato inmediato. 0xA1FF # $t0 ←$a0 | (0x0000A1FF) bgt reg1. # if ( $t0<>$t1) $pc ← DIR bge $t0. 12($a0) # Mem[ 12 + $a0 ] ←$s0(7. $a0. SLT # if ( $t0=$t1) $pc ← DIR srl rd. $t1. jr $ra # $pc ← $ra # if ( $t0<=$t1) $pc ← DIR blt $t0.28) ← $t1(31) # if ( $t1<=0) $pc ← ETQ or rd. y el registro rs. rs. bgez rs. aritmético a la derecha R Desplaza el registro rt a la derecha tantos bits como indica shamt. $t1. El resultado se almacena en rt. etiq Salto mayor o igual Salta a etiq si reg1 es mayor o igual que reg2 PS # if ( $t0>=$t1) $pc ← DIR # $pc ← dirección etiqueta rutina # $ra ← dirección siguiente instrucción bgt $t0.. $t1. rt. rt. etiqueta Salto si menor que cero Salta a etiqueta si rs es menor que 0 SALTOS INCONDICIONALES j dirección Salto incondicional J Salta a la instrucción apuntada por la etiqueta dirección I bltz $t1. dirección Almacena media palabra I Almacena en los 16 bits de menos peso del registro en la media palabra de memoria indicada por dirección. DIR Saltar a registro R Salta a la instrucción apuntada por el contenido del registro rs. Los bits MSB toman el mismo valor que el bit de signo de rt.0) sll $t0. 4 andi $t0. reg2. $a1 andi rt.0) sh rt. $t1. rs. $a0. ETQ bne $t0. etiqueta Salto si mayor que cero Salta a etiqueta si rs es mayor que 0 I bgtz $t0. 12($a0) # Mem[ 12 + $a0 ] ←$s0 sb rt. $a0. etiq Salto menor PS Salta a etiq si reg1 es menor que reg2 # if ( $t0<$t1) $pc ← DIR 160 . DIR blt reg1. etiqueta Salto si mayor o igual que cero I Salta a etiqueta si rs es mayor o igual que 0 # if ( $t0>=0) $pc ← SLT # $s0 ← $t1 >> 4 srl $s0. rs. etiqueta Salto si igual Salta a etiqueta si rs es igual a rt sb $s0.. rt. etiq Salto mayor Salta a etiq si reg1 es mayor que reg2 PS MOVIMIENTO ENTRE REGISTROS mfhi rd mueve desde HI R Transfiere el contenido del registro HI al registro rd. 16 LÓGICAS and rd. dirección Almacena palabra I Almacena el contenido del registro rt en la palabra de memoria indicada por dirección sw $s0. shamt Desplamiento logico a la izquierda R Desplaza el registro rt a la izquierda tantos bits como indica shamt SALTOS CONDICIONALES beq rs. dirección Almacena byte I Almacena el LSB del registro en el byte de memoria indicado por dirección FORMATO DE LAS INSTRUCCIONES tipo R inst(6 bits) rs(5bits) rt (5bits) rd( 5bits) shamt(5bits) co (6bits) tipo I inst(6bits) rs(5bits) rt(5bits) inm(16 bits) tipo J inst(6bits) objetivo (26 bits) DESPLAZAMIENTO sll rd. etiqueta Salto si menor o igual que cero I Salta a etiqueta si rs es menor o igual que 0 sra $s0. ori $t0. I sh $s0. El resultado se almacena en rd # $t0 ← $t1 << 16 beq $t0.$t1. ETQ # if ( $t0>0) $pc ← SLT blez rs. reg2. El resultado se almacena en rd bgtz rs. $t1. DIR j finbucle # $pc ← dirección etiqueta finbucle jal dirección Saltar y enlazar J Salta a la instrucción apuntada por la etiqueta dirección y almacena la dirección de la instrucción siguiente en $ra # if ( $t1<0) $pc ← ETQ or $t0.. $t1. extendiento ceros. 0xA1FF # $t0 ←$a0 & (0x0000A1FF) # $s0 ← $t1 >> 4 # $s0(31. rt OR entre registros R Operación OR bit a bit entre los registros rs y rt.