EC/FC - Práctica 6: Introducción a MIPS

11 de March de 2008

Contents

Introducción

Objetivos

Al finalizar esta práctica el estudiante será capaz de:

  • Manejar el simulador SPIM.
  • Conocer la sintaxis básica del lenguaje ensamblador del MIPS32.
  • Declarar palabras, bytes y caracteres para el MIPS32
  • Reservar espacio y alinear la memoria en el lenguaje ensamblador del MIPS32.

Material necesario

Para la realización de esta práctica se necesita un ordenador personal con Windows o Linux y el simulador SPIM, disponible en http://pages.cs.wisc.edu/~larus/spim.html. Es muy recomendable que e instales este programa en tu ordenador

Evaluación de la práctica

La evaluación de la práctica comenzará antes de asistir al laboratorio. Así, el estudiante deberá reunirse con su compañero de grupo para preparar cada sesión. El trabajo previo a la práctica consistirá en un conjunto de actividades que nos prepararán para obtener el máximo provecho de la sesión de laboratorio. El trabajo previo tendrá una valoración variable y se mostrará al profesor de laboratorio en la primera media hora de cada sesión.

El resto de la evaluación de la práctica estará relacionado con el trabajo en la sesión presencial en el laboratorio. Cada apartado, formado por actividades diversas, tendrá una puntuación. Esta puntuación aparecerá indicada junto a cada actividad.

Trabajo previo antes del Laboratorio (3 puntos)

Para poder sacar el máximo partido a la sesión de laboratorio debes realizar las siguientes actividades:

Actividades

  1. Dado el siguiente ejemplo de programa ensamblador, identifica y señala las etiquetas, directivas y comentarios que aparecen en él:
  introsim.s
1   .data    
2 dato: .word 3 #Inicializa una palabra con el valor 3  
3        
4   .text    
5 main: lw $t0, dato($0) #Carga el contenido de M[dato]  
  1. Crea un fichero con el programa anterior, cárgalo en el simulador y responde a las siguientes preguntas:
  • ¿En qué dirección de memoria se ha almacenado el 3?
  • ¿En qué dirección de memoria se ha almacenado la instrucción lw $t0, dato($0)?.
  • ¿Qué registro, del $0 al $31, es el registro $t0?.
  1. Ejecuta el programa anterior, ¿qué valor tiene el registro $t0 después de ejecutar el programa?

Trabajo en el laboratorio (7 puntos)

Prácticamente cualquier programa de computador requiere de datos para llevar a cabo su tarea. Por regla general, estos datos son almacenados en la memoria del computador. Al programar en un lenguaje de alto nivel se utilizan variables de diversos tipos. Es el compilador (o el intérprete según sea el caso) quien se encarga de decidir en qué posiciones de memoria se almacenarán las estructuras de datos requeridas por el programa.

En esta práctica vamos a empezar a ver las primeras instrucciones de reserva de espacio y de almacenaje para el MIPS.

Declaración de palabras en memoria

En este apartado se verán las directivas data y word. Como punto de partida se considera el siguiente ejemplo:

        palabras.s
1   .data    
2 palabra1: .word 15 # Representación decimal del dato  
3 palabra2: .word 0x15 # Representació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. Sin embargo, utiliza una serie de directivas que le indican al ensamblador (a SPIM) qué información debe almacenar en memoria y dónde.

La primera de las directivas utilizadas, .data, 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 ón en la que deben comenzar a almacenarse. Cuando se utiliza la directiva .data sin argumentos (tal y como está en el ejemplo) se utilizará como dirección de comienzo de los datos el valor por defecto 0x1001 0000. Para indicar otra dirección de comienzo de los datos se debe utilizar la directiva en la forma .data DIR. Por ejemplo, si se quisiera que los datos comenzaran en la posición 0x1001 0020, se debería utilizar la directiva data 0x10010020.

Volviendo al programa anterior, las dos siguientes líneas utilizan la directiva .word. Esta directiva sirve para almacenar una palabra en memoria. La primera de las dos, la .word 15, almacenará el número 15 en la posición 0x1001 0000 (por ser la primera después de la directiva .data. La siguiente, la``word 0x15``, almacenará el valor 0x15 en la siguiente posición de memoria no ocupada.

Actividades (1 punto)

Crea el fichero anterior, cárgalo en el simulador y resuelve los siguientes ejercicios.

4. Encuentra los datos almacenados en memoria por el programa anterior. Localiza dichos datos en la zona de visualización de datos e indica su valor en hexadecimal.

  1. ¿En qué direcciones se han almacenado las dos palabras? ¿Por qué?
  2. ¿Qué valores toman las etiquetas palabra1 y palabra1?

Crea ahora otro fichero con el siguiente código:

  palabras2.s
1   .data    
2 palabra1: .word 15 0x15 # En decimal y hexadecimal  

7. Borra los valores de la memoria utilizando el botón CLEAR y carga el nuevo fichero. ¿Se observa alguna diferencia en los valores almacenados en memoria respecto a los almacenados por el programa anterior? ¿Están en el mismo sitio?

8. Crea un programa en ensamblador que defina un vector de cinco palabras (words), asociado a la etiqueta vector, que comience en la dirección 0x1000 0000 y que tenga los siguientes valores 0x10, 30, 0x34, 0x20 y 60. Cárgalo en el simulador y comprueba que se ha almacenado de forma correcta en memoria.

9. Modifica el código anterior para intentar que el vector comience en la dirección de memoria 0x1000 0002 ¿En qué dirección comienza realmente? ¿Por qué? ¿Crees que tiene algo que ver la directiva .word?

Declaración de bytes en memoria.

La directiva .byte DATO inicializa una posición de memoria, es decir, un byte, con el contenido DATO.

Actividades (1 punto)

Limpia el contenido de la memoria y carga el siguiente código en el simulador:

        octeto.s
1   .data    
2 octeto: .byte 0x15 # Dato en hexadecimal  
  1. Qué dirección de memoria se ha inicializado con el valor 0x15?
  2. Qué valor posee la palabra que contiene el byte?

Limpia el contenido de la memoria y carga el siguiente código en el simulador:

        octeto2.s
1   .data    
2 palabra1: .byte 0x10, 0x20, 0x30, 0x40 # Datos en hexadecimal  
3 palabra3: .word 0x10203040 # Dato en hexadecimal  
  1. ¿Qué valores se han almacenado en memoria?
  2. Viendo cómo se ha almacenado la secuencia de bytes y la palabra, ¿qué tipo de organización de los datos, big-endian o little-endian, utiliza el simulador? ¿Por qué?
  3. ¿Qué valores toman las etiquetas palabra1 y palabra1

Declaración de cadenas de caracteres

La directiva .ascii (cadena) le indica al ensamblador que debe almacenar los códigos ASCII de los caracteres que componen la cadena entrecomillada.

Dichos códigos se almacenan en posiciones consecutivas de memoria, de un byte cada una.

Actividades (1 punto)

Limpia el contenido de la memoria y carga el siguiente código en el simulador:

        datos-cad.s
1   .data    
2 cadena: .ascii "abcde" # Declaración de la cadena  
3 palabra3: .byte 0xff # Dato en hexadecimal  
  1. ¿Qué rango de posiciones de memoria se han reservado para la variable etiquetada con cadena?
  2. ¿Cuál es el código ASCII de la letra a?¿Y el de la b?
  3. ¿A qué posición de memoria hace referencia la etiqueta octeto?
  4. ¿Cuántos bytes se han reservado en total?¿Y cuántas palabras?
  5. La directiva .asciiz "abcde" también sirve para declarar cadenas. Modifica el programa anterior para que utilice .asciiz en lugar de .ascii. ¿Hay alguna diferencia en el contenido de la memoria utilizada?¿Cuál? Describe cuál es la función de esta directiva y qué utilidad tiene.

Reserva de espacio en memoria

La directiva .space N sirve para reservar N bytes de memoria e inicializarlos a 0.

Actividades

Dado el siguiente código:

  datos-spa.s
1   .data  
2 byte1: .byte 0x10  
3 espacio: .space 4  
4 byte2: .byte 0x10  
5 palabra: .word 10  
  1. ¿Qué posiciones de memoria se han reservado para almacenar la variable``espacop``?
  2. ¿Los cuatro bytes utilizados por la variable .space podrían ser leídos o escritos como si fueran una palabra? ¿Por qué?
  3. ¿A partir de qué dirección se ha inicializado byte1? ¿Y byte1?
  4. ¿A partir de qué dirección se ha inicializado palabra? ¿Por qué ha hecho esto el ensamblador? ¿Por qué no ha utilizado la siguiente posición de memoria sin más?

Alineación de datos en memoria

La directiva .align N le indica al ensamblador que el siguiente dato debe ser almacenado en una dirección de memoria que sea múltiplo de 2n.

Actividades (1 punto)

Dado el siguiente código:

        datos-ali.s
1   .data    
2 byte1: .byte 0x10    
3   .align 2    
4 espacio: .space 4    
5 byte2: .byte 0x10    
6 palabra: .word 10    
  1. ¿Qué posiciones de memoria se han reservado para almacenar la variable espacio? Compara la respuesta con la obtenida en el ejercicio 20.
  2. ¿Los cuatro bytes utilizados por la variable espacio podrían ser leídos o escritos como si fueran una palabra? ¿Por qué?¿Qué es lo que ha hecho la directiva .align 2?

Actividades globales

GL - 1 (1 punto)

Desarrolla un programa ensamblador que reserve espacio para dos vectores consecutivos, A y B, de 20 palabras cada uno a partir de la dirección 0x1000 0000.

GL - 2 (1 punto)

Desarrolla un programa ensamblador que realice la siguiente reserva de espacio en memoria a partir de la dirección 0x1000 1000: una palabra, un byte y otra palabra alineada en una dirección múltiplo de 4.

GL - 3 (1 punto)

Desarrolla un programa ensamblador que realice la siguiente reserva de espacio e inicialización de memoria: una palabra con el valor 3, un byte con el valor 0x10, una reserva de 4 bytes que comience en una dirección múltiplo de 4, y un byte con el valor 20.

GL - 4 (1 punto)

Desarrolla un programa ensamblador que inicialice, en el espacio de datos, la cadena de caracteres Esto es un problema, utilizando:

  1. La directiva .ascii
  2. La directiva .byte
  3. La directiva .word

(Pista: Comienza utilizando sólo la directiva .ascii y visualiza cómo se almacena en memoria la cadena para obtener la secuencia de bytes.)