Contents
Al finalizar esta práctica el estudiante será capaz de:
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
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.
Para poder sacar el máximo partido a la sesión de laboratorio debes realizar las siguientes actividades:
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]
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.
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.
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.
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?
La directiva .byte DATO inicializa una posición de memoria, es decir, un byte, con el contenido DATO.
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
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
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.
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
La directiva .space N sirve para reservar N bytes de memoria e inicializarlos a 0.
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
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.
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
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.
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.
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.
Desarrolla un programa ensamblador que inicialice, en el espacio de datos, la cadena de caracteres Esto es un problema, utilizando:
(Pista: Comienza utilizando sólo la directiva .ascii y visualiza cómo se almacena en memoria la cadena para obtener la secuencia de bytes.)