Está en la página 1de 7

Arquitecturas y Organización de Computadoras I

2° Cuatrimestre 2018
Facultad de
Informática
TP N° 3 - Pseudo-instrucciones, direccionamiento, instrucciones, registros
y organización de la memoria en MIPS

Objetivo:​ Comprender la diferencia entre las instrucciones de la máquina básica MIPS y la utilizada al
programar en lenguaje ensamblador MIPS (instrucciones y pseudo-instrucciones). Estudiar la codificación
de instrucciones, la utilidad de los registros, y la organización y gestión (básica) de memoria de los
programas en ejecución.

Recursos:
​ punte de Arquitectura y Lenguaje Ensamblador MIPS (PDF)​ (en PEDCO)
i) A
ii) MIPS32​™ Architecture For Programmers Volume I: Introduction to the MIPS32™
Architecture (en PEDCO). Capítulos 2, 3 y 4.
iii) ​MIPS32​™ Architecture For Programmers Volume II (en PEDCO)
iv) Programa mipsx desarrollado por la cátedra.

1. Formatos de direccionamiento a memoria (ensamblador de MIPS)

MIPS es una arquitectura carga-almacenamiento, es decir, solo las instrucciones de carga y


almacenamiento acceden a la memoria. Las instrucciones que realizan algún cálculo con la ALU operan
sobre valores en registros o literales (es decir, el dato está codificado en la misma instrucción).

Ejercicios

1. El lenguaje ensamblador MIPS presenta varios ​formatos de direccionamiento(**)​ para las instrucciones
de carga y almacenamiento. En la siguiente tabla se listan los formatos posibles (su sintaxis):

Format  Address computation 


 
(register)  contents of register 
imm  immediate 
imm (register)  immediate + contents of register 
label  address of label 
label ± imm  address of label + or – immediate 
label ± imm (register)  address of label + or – (immediate + contents of register) 

Identificar el formato de direccionamiento utilizado en las siguientes instrucciones en lenguaje


ensamblador de MIPS y calcular la ​dirección efectiva (absoluta)​ cuando el operando es un acceso a
memoria.
Suponga que el segmento de datos se carga en la dirección 0x4100f0.
(Realice el cálculo en papel).

.data 
memoria: 
vector: .word 3, 6, 9 

(**) No confundir formato de direccionamiento con modos de direccionamiento. El ​formato de direccionamiento​ es la sintaxis
permitida por el ensamblador para direccionar un operando. En cambio, los ​modos de direccionamiento​ son los mecanismos
del hardware (CPU) para acceder a los operandos (especificados en las instrucciones código máquina)
total:.space 20 
 
.text 
.globl main 
.globl __start 
__start: 
main: 
li $t1, 4 
li $t2, 0xffff1024 
lw $t3, vector + 12 
lw $t4, vector($t1) 
lw $t1, 0x10010101($t3)  
lw  $t5, vector + 4($t1) 
add $t6, $t1, $t1 
sw $s3, total  
lw $t0, ($t3)  
 
# finaliza el programa 
move $a0, $0 
li $v0, 4001 
syscall 

2. ​¿Cuál es el único ​modo de direccionamiento​ de la máquina básica MIPS (bare machine) para las
instrucciones de carga y almacenamiento?.

3. Escriba el siguiente programa en mipsx:


 
.data 
memoria: 
vector: .word 3, 6, 9 
 
.text 
.globl main 
.globl __start 
__start: 
main: 
li $t1, 4 
li $t2, 0xffff1024 
lw $t3, vector 
lw $t4, vector($t1) 
lw  $t5, vector + 4($t1) 
add $t6, $t1, $t1 
 
# finaliza el programa 
move $a0, $0 
li $v0, 4001 
syscall 
 
 
3.a. Compilar, cargar y ejecutar el programa. Observe los valores cargados en los registros una vez
finalizada la ejecución del programa.

3.b. Analice detenidamente las instrucciones reales ejecutadas por la CPU MIPS (panel “Programa Binario
Decodificado”). Encuentre cuáles son las instrucciones de carga de valores en registros, y qué modos de
direccionamiento de la máquina básica se han utilizado.

4. Explique qué son las pseudo-instrucciones en el lenguaje ensamblador de MIPS, y para que se utilizan.
Analice, del programa estudiado con mipsx en el ejercicio anterior, cuáles instrucciones del programa
original son pseudo-instrucciones, y cuáles son instrucciones reales ejecutadas por el procesador para cada
pseudo-instrucción. Ayuda: utilice los paneles del programa original y del “Programa Binario
Decodificado”.
 
2. Organización de la memoria
Los programas en ejecución (procesos), son organizados o desplegados en segmentos de memoria de
diferentes tamaños y con distintas propiedades. Esta organización en segmentos de memoria de los
programas dependen fuertemente del compilador, sistema operativo y hardware subyacente para los
cuales fueron construidos. Además de esta organización de alto nivel, los datos individuales pueden ser
almacenados en la memoria utilizando diferentes tipos de organizaciones, que se distinguen por: el orden
de los bytes, y la restricción en la ubicación o alineación de los datos en memoria.

2.1 Gestión de memoria en MIPS


La arquitectura MIPS define cuatro segmentos de memoria para el espacio de usuario: código (texto),
datos estáticos, datos dinámicos, y pila (stack). El segmento de código se ubica en direcciones bajas de
memoria, seguidas por los segmentos de datos estáticos y dinámicos (en este orden) en direcciones más
altas. El segmento de datos dinámicos crece hacia direcciones altas de memoria.
Finalmente, en la parte más alta de memoria se encuentra la pila, que crece hacia direcciones bajas
de memoria.
En lenguaje ensamblador MIPS, el segmento de código se identifica en un programa con la directiva .text, y
el segmento de datos estáticos con la directiva .data. La pila (stack), utilizada para almacenar datos
temporales como argumentos y variables de subrutinas, es accedida a partir de registros destinados a su
gestión. En particular, el registro de la CPU sp (stack pointer) contiene la dirección del tope de la pila.
Cuando el programa se inicia y aún no ha utilizado el segmento de pila (pila vacía) sp contiene la dirección
del inicio del segmento de pila.

Ejercicio

1. Dado el siguiente programa escrito en lenguaje ensamblador de MIPS:


 
.data  
memoria: 
v1: .byte 45  
v2: .byte 20  
 
.text  
.globl main 
.globl __start 
__start: 
main: 
cargat2: 
lb $t2, v1  
cargat3: 
lb $t3, v2 
add $t1, $t2, $t3  
   
# finaliza el programa 
move $a0, $0 
li $v0, 4001 
syscall 
 
(a) Cargar el programa en mipsx, e identificar los segmentos de memoria de código, datos y pila (utilice
direcciones) e indique la cantidad de datos o instrucciones que contienen.

(b) Las etiquetas (su sintaxis es nombre_etiqueta:) permiten referenciar datos o instrucciones sin
especificar direcciones. Indique las direcciones de memoria que el ensamblador de MIPS asignó a cada
etiqueta.

2.2 Orden de bytes


El orden de bytes o endianness es el ordenamiento de las sub unidades direccionables individualmente
(normalmente se utiliza el byte, aunque podrían ser el bit o word) dentro de una palabra de datos mayor,
almacenada en memoria. Los ordenes de bytes más utilizados se distinguen por ubicar primero al byte más
o menos significante, denominados big-endian y little- endian, respectivamente.

Algunas arquitecturas permiten configurar el orden de bytes, como por ejemplo la arquitectura MIPS. Así,
en MIPS, los datos con formatos half-word, word, y doubleword pueden configurarse tanto en orden
big-endian como little-endian.

Ejercicios

1. Escriba el valor 12.000 en un valor hexadecimal notación complemento a 2, tanto en orden big- endian
como little-endian (ejemplifique especificando direcciones de memoria para cada byte).

2. Escriba la siguiente definición en mipsx.

.data 
memoria: 
.word 0xabcd1234 
.byte 2, 3, a, b 

Agregue una sección de instrucciones para cargar los primeros 4 bytes del segmento de datos en 4
registros diferentes. Compilar, cargar y ejecutar. Compruebe si la máquina es big-endian o little-endian.

3. Se tiene dos máquinas MIPS, una configurada como big-endian y la segunda como little-endian.
Razone la siguiente definición: en una máquina big-endian, el byte MÁS significativo de una palabra es
ubicado en las dirección más baja. Por el contrario, en una máquina little-endian, el byte MENOS
significativo de una palabra es ubicado en la dirección más baja.

Describa cómo queda el contenido de la memoria, en ambas máquinas MIPS, cuando se ejecuta el
siguiente programa :

li $s1, 0xff04aa85 
li $s3, 0xfe09bcaa 
sw $s3, 0x0a000100 
sw $s1, 0x0a000104 

Memoria en máquina 1, big-endian Memoria en máquina 2, little-endian


dirección contenido dirección contenido
0x0a000100 0x0a000100
0x0a000101 0x0a000101
0x0a000102 0x0a000102
0x0a000103 0x0a000103
0x0a000104 0x0a000104
0x0a000105 0x0a000105
0x0a000106 0x0a000106
0x0a000107 0x0a000107

4. Imagine que ahora la máquina 1 envía a la máquina 2 los 8 bytes en memoria (a través de algún
mecanismo de red serial, es decir, cada byte es enviado de manera secuencial). La máquina 2 almacena
cada byte recibido en posiciones de memoria secuenciales, tal cual los recibe.
¿Qué inconvenientes puede tener el programador de la máquina 2 con los bytes recibidos y almacenados
en memoria de manera secuencial? Sugiera y razone posibles problemas y soluciones.

5. ¿Qué es “network byte order”?

2.3 Alineación de datos en memoria


En MIPS, la CPU usa direccionamiento por byte para acceder a datos tipo halfword, word, y doubleword,
con las siguientes restricciones de alineación:

• El acceso a los halfword debe ser alineado en 0, 2, 4...


• El acceso a los word debe ser alineado en 0, 4, 8...
• El acceso a los doubleword debe ser alineado en 0, 8, 16...

Ejercicio

1. ¿Los datos definidos en un programa y cargado en memoria de una máquina MIPS, se encuentran
alineados? Escriba un programa que reserve e inicialice memoria para datos, y que pueda validar su
respuesta anterior.

3. Registros
Un registro permite almacenar bits de información, normalmente utilizados para realizar operaciones
matemáticas. Los registros ubicados dentro de la unidad de procesamiento central (CPU) son llamados
registros del procesador. Ellos pueden ser accedidos más rápidamente que cualquier otro almacenamiento
disponible.

Ejercicio

3.1. Identifique, utilizando el recurso i) y mipsx los diferentes registros de MIPS de propósito general.
Explique para que se utilizan los registros $t0..$t7, $pc, $sp, $zero

3.2. Escriba un programa que inicialice memoria de datos con siete valores de tipo byte, cargue esos
valores en los registros $t0 a $t6, y luego realice una sumatoria utilizando el registro $t7 como registro
para guardar valores intermedios y final.

3.3 Coloque en el segmento de datos de un programa el valor -1 (menos uno). Cargue el valor en un
registro utilizando la instrucción cargar byte (lb). Observe el valor cargado en el registro y explique el por
qué de ese contenido.

4. Representación de instrucciones
Las instrucciones se almacenan codificadas y se decodifican al ser ejecutadas. El formato de instrucción
especifica la estructura de la codificación, la cual consiste de un código de operación y la codificación de
los operandos. Los operandos pueden ser: registros, literales (por ejemplo, el literal 5), y direcciones de
memoria. Los literales se codifican como valores inmediatos en la instrucción, es decir, la instrucción
misma contiene el dato, y no hay necesidad de acceder a los registros o la memoria.

4.1 Código de instrucción

Ejercicio

1. ¿Cuántos bits debe tener el código de una instrucción para una computadora de 53 instrucciones?

4.2 Direcciones de memoria

Ejercicios

1. ¿Qué tamaño tienen las direcciones de memoria en una computadora capaz de direccionar hasta
1.024 ubicaciones de memoria?

2. Indicar la cantidad de ubicaciones de memoria, y la primera y última dirección (en hexadecimal), para un
sistema con tamaño de dirección de:
(a) 16 bits
(b) 32 bits
(c) 64 bits

3. Indique la cantidad máxima de memoria física que pueden soportar las siguientes arquitecturas:

(a) byte-addressable 32-bit: direcciones de 32 bits, y cada dirección identifica a un único byte de
almacenamiento.
(b) byte-addressable 64-bit: direcciones de 64 bits, y cada dirección identifica a un único byte de
almacenamiento.

4.3 Formato de instrucción

Ejercicios

1. ¿Qué tamaño de instrucción tiene una computadora de 256 instrucciones, todas del tipo “dos
direcciones” (dos operandos), y que tiene 65.000 ubicaciones de memoria?

2. En la arquitectura MIPS:
(a) ¿Cuantos bits se utilizan para codificar una instrucción?
(b) ¿Cuántos bits tiene una dirección?
(c) ¿Puede una instrucción codificar una dirección absoluta? Si la respuesta es NO entonces explique cómo
es que se logra acceder a direcciones de memoria utilizando una máquina MIPS.

3. Dado el siguiente programa de MIPS, identifique las instrucciones en la memoria y muestre la


codificación en hexadecimal de las cinco primeras instrucciones. Ayuda: puede utilizar el panel de
“Programa Binario Decodificado” y el panel “Memoria”.

.text  
.globl main  
.globl __start 
__start: 
main:  
move $t1, $t2 
li $t2, 0xf010e010  
add $t2, $t2, 0x2  
 
 
# finaliza el programa 
move $a0, $0 
li $v0, 4001 
syscall 
 
 
 
4. Explique qué relación tienen estas primeras cinco instrucciones en memoria con las desarrolladas en el
programa fuente en lenguaje ensamblador.

5. Dado el siguiente vuelco de memoria de un programa en una arquitectura MIPS, donde la 1ra columna
especifica la dirección de memoria y la 2da columna su contenido, decodifique las instrucciones y escriba
el código en lenguaje ensamblador de MIPS. Utilice la documentación del conjunto de instrucciones de
MIPS32 iii)
[0x00400030] 0x24090001
[0x00400034] 0x01204820
[0x00400038] 0x240b0001
[0x0040003c] 0x012b4020

4.4. Instrucciones en lenguaje ensamblador MIPS

E​studie, intérprete y ejercite, en un programa escrito en mipsx, las siguientes instrucciones :

add, sub, la, lw, sw, and, or, li, bne, beq 

También podría gustarte