Logo Studenta

UC3M _ Doble Grado en Ingeniería Informática y ADE _ Estructura de computadores _ Estructura

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

EC Materiales/EC_practica1_2013-2014.pdf
 
ESTRUCTURA DE COMPUTADORES 
GRADO EN INGENIERÍA INFORMÁTICA 
 
 
 
UNIVERSIDAD CARLOS III DE MADRID 
 
 
 
Práctica 1 
Representación de la Información 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Septiembre 2013 
1 
 
Contenido 
 
 
 
OBJETIVOS DE LA PRÁCTICA ................................................................................. 2 
EJERCICIO 1. ................................................................................................................. 3 
EJERCICIO 2. ................................................................................................................. 4 
EJERCICIO 3. ................................................................................................................. 5 
EJERCICIO 4. ................................................................................................................. 6 
EJERCICIO 5. ................................................................................................................. 7 
PROCEDIMIENTO DE EVALUACIÓN DE LA PRÁCTICA .................................. 8 
PROCEDIMIENTO DE ENTREGA DE LA PRÁCTICA ......................................... 9 
NORMAS ....................................................................................................................... 10 
 
 
2 
 
Objetivos de la práctica 
El objetivo de la práctica consiste en entender el formato de representación de los 
números en el computador. Para ello se propone el desarrollo de una serie de programas 
en C que permiten trabajar con los detalles relacionados con los números enteros y los 
números en coma flotante representados en el estándar IEEE 754, que es el que se 
emplea en la mayoría de los lenguajes de programación. 
Para el desarrollo de la práctica es necesario que el alumno repase: 
 Los diferentes operadores que ofrece C para trabajar con bits. En el siguiente 
enlace se puede obtener información sobre los diferentes operadores de bit de C. 
http://en.wikipedia.org/wiki/Bitwise_operations_in_C 
 La representación de números en coma flotante según el estándar IEEE754 de 
precisión simple. 
La práctica consistirá en realizar los siguientes ejercicios 
 Ejercicio 1: analizar el ancho de los tipos de datos float, double, int y long. 
 Ejercicio 2: obtener el valor de un número binario en complemento a 2. 
 Ejercicio 3: obtener el valor de un número binario en coma flotante según el 
estándar IEEE754. 
 Ejercicio 4: Sumar dos números binarios en complemento a 2 y obtener el valor 
de la suma. 
 Ejercicio 5: obtener el siguiente número representable dado un número en coma 
flotante según el estándar IEEE754. 
http://en.wikipedia.org/wiki/Bitwise_operations_in_C
3 
 
Ejercicio 1. 
a. Escriba un programa en C que calcule la siguiente serie: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Para ello se deben utilizar números en coma flotante de precisión simple 
(variables de tipo float) y números en coma flotante de precisión doble 
(variables de tipo double). El objetivo del programa es calcular la serie e indicar 
el número de iteraciones a partir del cual el resultado que se obtiene para Sn+1 es 
igual que el obtenido para Sn. 
b. Agregue una función al anterior programa que calcule el tamaño de una variable 
de tipo entero (variable de tipo int) y una variable de tipo entero largo (variable 
de tipo long). Para ello, el alumno programará un bucle en el cual la variable 
tendrá un valor inicial de 0 e irá incrementándose. En el momento en que la 
variable se desborde y pase a tener un valor negativo, el alumno deberá imprimir 
su valor y analizarlo para obtener cuantos bits forman el ancho del tipo de datos. 
Documentación a entregar: 
 E1-Series.c. Contiene el código fuente del programa conteniendo ambas 
funciones. El programa debe contener documentación describiendo el 
funcionamiento, así como la versión y el autor o autores del mismo. Para la 
realización de esta parte se usará como base el código entregado, donde vienen 
especificados los nombres de los métodos y el retorno de los mismos. 
 Además, se responderá en un apartado específico de la memoria a las siguientes 
preguntas: 
o ¿Cuál es el valor máximo de iteraciones con precisión simple? 
o ¿Cuál es el valor máximo de iteraciones con precisión doble? 
o ¿Cuál es el tamaño en bits del tipo int? 
o ¿Cuál es el tamaño en bits del tipo long? 
o ¿Qué ocurre con la precisión si en lugar de utilizar una máquina de 32 
bits pasamos a una de 64 bits, o viceversa? Justifique su respuesta 
 
 
4 
 
Ejercicio 2. 
Escriba un programa en C denominado E2-CompToInt.c, utilizando como base el 
código fuente entregado, que dado un número binario en complemento a 2 de 8 bits 
muestre su valor decimal. Para ello se debe rellenar la función comp2ToInt que se 
encuentra dentro del código base. 
 int comp2ToInt(bit* num) 
Función que recibe como parámetro un array de bits que representan un número 
binario en complemento a dos y retorna su valor entero. 
 
Documentación a entregar: 
 E2-CompToInt.c. Programa que se entrega como código fuente con la función 
comp2ToInt implementada. Se pueden agregar al programa funciones 
adicionales si se considera oportuno. El código debe contener documentación 
describiendo su funcionamiento, así como el nombre del o de los autores. 
NOTAS: 
 Considere n=8 bits para hacer el complemento a 2. 
 Se deben respetar los nombres asignados, así como los retornos 
especificados en el programa E2-CompToInt.c que se entrega. 
 No se pueden emplear funciones del API de C. 
 
 
5 
 
Ejercicio 3. 
Escriba un programa en C denominado E3-IEEE754ToFloat.c, utilizando como plantilla 
el programa entregado junto con la documentación, que recibe un número binario que 
representa un número en coma flotante según el estándar IEEE 754 de 32 bits y retorne 
su valor. La cadena que recibe el programa puede tener separados por un espacio la 
representación del signo, la representación del exponente y la representación de la 
mantisa de la siguiente forma: 
$ ./E3-IEEE754ToFloat 1 10100001 10101110100111111000000 
También puede introducirse el número en un solo argumento: 
$ ./E3-IEEE754ToFloat 11010000110101110100111111000000 
Para ello se debe rellenar la función IEEE754ToFloat que se encuentra dentro del 
código base. 
 float IEEE754Tofloat (bit* numero) 
Función que recibe como parámetro un array de bits que representan un número 
en coma flotante según el estándar IEEE754 de precisión simple y devuelve su 
valor decimal 
Ejemplo: 
Array de bits IEEE754 Valor 
0 10000011 10011001100110011001101 +25.6 
1 10000100 10101010000000000000000 -53.25 
Además se responderá en un apartado específico de la memoria a la siguiente pregunta: 
a) Calcular el número de números representables que hay entre 8 y 9, y entre 15 y 
16. ¿Dónde hay un número mayor de números representables? Justifique su 
respuesta. 
Documentación a entregar: 
 E3-IEEE754ToFloat.c: Programa que se entrega como código fuente con la 
función IEEE754Tofloat implementada. Se pueden agregar al programa 
funciones adicionales si se considera oportuno. El código debe contener 
documentación describiendo su funcionamiento, así como el nombre del o de los 
autores. 
NOTAS: 
 Se deben respetar los nombres asignados, así como los retornos 
especificados en el programa E3-IEEE754ToFloat.c que se entrega. 
 No se pueden funciones del API de C salvo la función pow que calcula la 
potencia de un número x elevado a un número y. Ver man pow para más 
información. 
 Se deben tener en cuenta los casos particulares del estándar: NaN, ±∞ y 
números no normalizados. 
 
6 
 
Ejercicio 4. 
Escriba un programa
en C denominado E4-Add.c, utilizando como plantilla el programa 
entregado junto con la documentación, que reciba dos números binarios en 
complemento a 2 de 8 bits, realice la suma bit a bit, y una vez obtenido el resultado en 
binario, obtenga su valor decimal de la misma manera que en el ejercicio 2. Para ello se 
debe rellenar la función add que se encuentra dentro del código base. 
 int add(bit* num1, bit* num2) 
Función que recibe como parámetro dos array de bits que representan dos 
números binarios en complemento a dos y retorna el valor entero de la suma de 
ambos. 
 
Documentación a entregar: 
 E4-Add.c: Programa que se entrega como código fuente con la función add 
implementada. Se pueden agregar al programa funciones adicionales si se 
considera oportuno. El código debe contener documentación describiendo su 
funcionamiento, así como el nombre del o de los autores. 
NOTAS: 
 Si se desea emplear código o funciones desarrollados en el Ejercicio 2, estos 
deben ser copiados al programa E4-Add.c 
 Se deben respetar los nombres asignados, así como los retornos 
especificados en el programa E4-Add.c que se entrega. 
 No se pueden funciones del API de C. 
 Se deberá realizar en primer lugar la suma bit a bit de los números 
binarios, y a partir del número resultante, obtener el valor decimal en un 
segundo paso. 
 En caso de desbordamiento el bit de acarreo será descartado. 
 
 
7 
 
Ejercicio 5. 
Escriba un programa en C denominado E5-NextUp.c, utilizando como plantilla el 
programa entregado junto con la documentación, que reciba un número binario que 
representa un número en coma flotante según el estándar IEEE 754 de 32 bits. devuelva 
el siguiente número representable. En caso de que el número sea 0, el método debe 
devolver el primer número no normalizado. En caso de que el número sea el mayor 
número normalizado, el programa debe devolver Infinity. Se deberá imprimir el valor 
decimal tanto del número como de su siguiente (puede utilizar para ello las funciones 
desarrolladas en el ejercicio 3). Se debe rellenar la función nextup que se encuentra 
dentro del código base. 
 void nextup(bit* num, bit* nextnum) 
Función que recibe dos parámetros. El primero es un array de bits que contiene 
el número a partir del cual se va a calcular el siguiente representable. El segundo 
es un array donde se va a almacenar el siguiente representable calculado. 
 
Documentación a entregar: 
 E5-NextUp.c: Programa que se entrega como código fuente con la función 
nextup implementada. Se pueden agregar al programa funciones adicionales si 
se considera oportuno. El código debe contener documentación describiendo su 
funcionamiento, así como el nombre del o de los autores. 
NOTAS: 
 Se deben respetar los nombres asignados, así como los retornos 
especificados en el programa E5-NextUp.c que se entrega. 
 No se pueden funciones del API de C salvo la función pow que calcula la 
potencia de un número x elevado a un número y. Ver man pow para más 
información. 
 Se deben tener en cuenta los casos particulares del estándar: NaN, ±∞ y 
números no normalizados. 
 Si se desea emplear código o funciones desarrollados en el Ejercicio 3, estos 
deben ser copiados al programa E5-NextUp.c 
 
 
8 
 
Procedimiento de evaluación de la práctica 
 
La evaluación de la práctica se va a dividir en dos partes. 
 Código (8 puntos) 
o Ejercicio 1 (1 puntos) 
o Ejercicio 2 (1.5 puntos) 
o Ejercicio 3 (1.5 puntos) 
o Ejercicio 4 (2 puntos) 
o Ejercicio 5 (2 puntos) 
 Memoria (2 puntos) 
Los ejercicios 1, 2, 3, 4 y la memoria son obligatorios. Deben entregarse para poder 
seguir la evaluación continua. 
 
9 
 
Procedimiento de entrega de la práctica 
La entrega de la práctica 1 se realizará de la siguiente manera: se habilitarán dos 
entregadores distintos, uno para los ejercicios de este cuaderno y otro para la memoria 
completa. La fecha límite de entrega es el día 25 de Octubre de 2013 a las 23:55 
horas. 
Entregador 1: Se deberá entregar un único archivo comprimido en formato zip con el 
nombre ec_p1_AAAAAAAAA_BBBBBBBBB.zip donde A…A y B…B son los NIAs 
de los integrantes del grupo. 
El archivo zip debe contener: 
 Bit-Library.c 
 Bit-Library.h 
 E1-Series.c 
 E2-CompToInt.c 
 E3-IEEE754ToFloat.c 
 E4-Add.c 
 E5-NextUp.c 
 Makefile 
Entregador 2: Se deberá entregar la memoria en un único archivo en formato pdf con 
el nombre ec_p1_AAAAAAAAA_BBBBBBBBB.pdf donde A…A y B…B son los 
NIAs de los integrantes del grupo. La memoria tendrá que contener al menos los 
siguientes apartados: 
o Portada donde figuren los autores (incluyendo nombre completo, NIA y 
dirección de correo electrónico). 
o Índice de contenidos. 
o Descripción de todos los programas C solicitados en este cuaderno de 
prácticas detallando las principales funciones implementadas. La memoria 
debe describir el comportamiento de los programas, así como las principales 
decisiones de diseño (adicionalmente se pueden incluir diagramas de flujo, 
algoritmos, etc.). 
o Las respuestas a las preguntas planteadas en los ejercicios debidamente 
justificadas. 
o Batería de pruebas utilizadas y resultados obtenidos. Se dará mayor 
puntuación a pruebas avanzadas, casos extremos, y en general a aquellas 
pruebas que garanticen el correcto funcionamiento de la práctica en todos los 
casos. Hay que tener en cuenta: 
o Que un programa compile correctamente y sin advertencias 
(warnings) no es garantía de que funcione correctamente. 
o Evite pruebas duplicadas que evalúan los mismos flujos de programa. 
La puntuación de este apartado no se mide en función del número de 
10 
 
pruebas, sino del grado de cobertura de las mismas. Es mejor pocas 
pruebas que evalúan diferentes casos a muchas pruebas que evalúan 
siempre el mismo caso. 
o Conclusiones y problemas encontrados. 
NOTA: NO DESCUIDE LA CALIDAD DE LA MEMORIA DE SU PRÁCTICA. 
Aprobar la memoria es tan imprescindible para aprobar la práctica, como el correcto 
funcionamiento de la misma. Si al evaluarse la memoria de su práctica, se considera que 
no alcanza el mínimo admisible, su práctica estará suspensa. 
La longitud de la memoria no deberá superar las 10 páginas (portada e índice 
incluidos) 
 La entrega de las prácticas ha de realizarse de forma electrónica. En AULA 
GLOBAL se habilitarán unos enlaces a través de los cuales podrá realizar la 
entrega de las prácticas. 
 
 La única versión registrada de su práctica es la última entregada. La valoración 
de esta es la única válida y definitiva. 
 
 
Normas 
1) Las prácticas que no compilen o que no se ajusten a la funcionalidad y requisitos 
planteados, obtendrán una calificación de 0. 
2) Un programa no comentado, obtendrá una calificación de 0. 
3) La entrega de la práctica se realizará a través de los entregadores habilitados. No se 
permite la entrega a través de correo electrónico sin autorización previa. 
4) Se prestará especial atención a detectar funcionalidades copiadas entre dos prácticas. 
En caso de encontrar implementaciones comunes en dos prácticas, ambas obtendrán 
una calificación de 0. 
 
EC Materiales/Examen-2A-grupo81_2014_sol (1).pdf
UNIVERSIDAD CARLOS III DE MADRID 
DEPARTAMENTO DE INFORMÁTICA 
GRADO EN INGENIERÍA INFORMÁTICA. ESTRUCTURA DE COMPUTADORES 
 18 de octubre de 2013. Grupo 81. Examen 2 
 
Para la realización del presente examen se dispondrá de 15 minutos. 
NO se podrán utilizar libros, apuntes ni calculadoras de ningún tipo. 
Responda en el espacio reservado. 
 
Grupo: Alumno:
. 
 
 
Ejercicio 1. Represente correctamente en hexadecimal usando el formato IEEE754 de 32 bits el valor 
(en decimal) -0,75. Indique brevemente los pasos de la conversión. 
 
Solución: 
 
-0,7510 = -0,112 x 2
0
 = -1,12 x 2
-1
 
 
Signo = 1 (negativo) 
Exponente = 01111110 (-1 exceso 127 = 126) 
Mantisa= 100… (con bit implícito) 
 
1 01111110 10000000000000000000000 => 1011 1111 0100 0000 0000 0000 0000 0000 
 0x B F 4 0 0 0 0 0 
 
 
 
Ejercicio 2. Considere un computador de 16 bits con las siguientes características: todas las 
instrucciones caben en una palabra, el banco de registros tiene 8 registros y el computador dispone de un 
juego de 15 instrucciones. Conteste correctamente a las siguientes cuestiones: 
 
a) Indique un posible formato para las siguientes instrucciones. 
 lw $t1, 80($t2) 
 addi $t1, $t2, 80 
 jal dirección 
b) En la última instrucción, ¿cuál será el espacio direccionable de memoria? 
 
Solución: 
 
a) lw $t1, 80($t2) 
 
CO (4 bits) Registro 1 (3 bits) Registro 2 (3 bits) Desplazamiento (6 bits) 
 
 addi $t1, $t2, 80 
 
CO (4 bits) Registro 1 (3 bits) Registro 2 (3 bits) Valor inmediato (6 bits) 
 
jal direccion 
 
CO (4 bits) Direccion (12 bits) 
 
b) Podremos direccionar desde la posición 0 de memoria hasta la posición 212-1 
 
 
 
Ejercicio 3. Considere el siguiente fragmento: 
 
.data 
 .align 2 
 v1: .word 1, 2, 1, 3, 2, 1, 2, 3, 0 
 
a) ¿Para qué sirve align? ¿Es necesario en la definición anterior? 
 
b) Codifique correctamente en ensamblador una subrutina denominada cuenta1 que cuente el 
número de números en el vector pasado por parámetro en $a0. Dicho vector está compuesto por 
una secuencia de números que terminan con el valor 0 (cero). 
Si es necesario, añada el código necesario para el uso de pila, si no lo es justifique por qué. 
 
c) Codifique correctamente una subrutina main que llame a la subrutina anterior usando el vector de 
enteros v1 con n elementos, tal y como está definido anteriormente. 
 
Solución: 
 
a) La instrucción align sirve para indicar la alineación de los elementos dentro de memoria, en este caso 
al poner align 2 estamos indicando que el siguiente elemento estará alineado a 2
2
, es decir, cualquier 
acceso a un elemento de memoria, se hará sobre una dirección alineada en memoria (múltiplos de 4). 
Es necesario puesto que la siguiente variable es un entero. 
 
b) y c) Una posible solución sería: 
 
.text 
.globl main 
 
cuenta1: li $v0 0 
 move $t0 $a0 
 bucle: lw $t1 ($t0) 
 beqz $t1 fin 
 add $v0 $v0 1 
 add $t0 $t0 4 
 b bucle 
 fin: jr $ra 
 
 main: # cuenta1(v1,n) 
 la $a0 v1 
 jal cuenta1 
 # exit 
 li $v0 10 
 syscall 
 
 No es necesario marco de pila puesto que cuenta1 es rutina terminal y solo modifica los $t.. y $v.. 
 En main no se utiliza los $t.. por lo que no es necesario salvaguardarlos. 
EC Materiales/InstruccionesFormato.pdf
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
Ej. El formato de instrucción de un procesador de una dirección tiene 6 bits para el código de operación y 
10 para la dirección del operando. Suponiendo que una instrucción de bifurcación, con direccionamiento 
relativo al contador de programa, almacenada en la posición 530 (en decimal), origina un salto a la 
posición 620 (en decimal). Si el código de operación de la instrucción de salto es 110011, ¿cuál es la 
codificación en binario de dicha instrucción? 
 
 Procesador de una dirección. 
 6 bits para el código de operación. 
 10 bits para la dirección de un operando. 
 Instrucción de bifurcación, con direccionamiento relativo al contador del programa, almacenada 
en la dirección DIR10=530 origina un salto a la posición DIR10=620. 
 El código de operación de la instrucción es 110011 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION : 
De acuerdo con el enunciado se tiene el siguiente formato de instrucción: 
COP 6 bits OPERANDO 10bits 
 
Una instrucción de bifurcación con direccionamiento relativo al contador de programa CP, se puede 
expresar de la siguiente forma: 
COP 6 bits DESPLAZAMIENTO 10bits 
 
Donde la dirección del operando se obtiene a partir de: 
Direccion final= PC + desplazamiento 
Sustituyendo los datos del enunciado se tiene: 
620 = 530 + desplazamiento 
 luego el desplazamiento es 90 
Si se pasa a binario el desplazamiento se tiene: 
Desplazamiento=90=64+16+8+2=2
6
+2
4
+2
3
+2 
Desplazamiento2=1011010 
En el enunciado nos dan el código de operación de la instrucción 110011 y acabamos de calcular el 
desplazamiento, que expresado sobre un tamaño de 10 bits toma la forma: 0001011010. Luego la 
instrucción pedida es: 
COP Operando 
110011 0001011010 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
Ej. Dado un procesador de 16 bits conectado a una memoria direccionada por bytes. El tamaño de la 
memoria principal viene determinado por el conjunto de posiciones direccionables en una palabra. El 
banco de registros incluye los registros de propósito general visibles al usuario (R0-R15).El juego de 
instrucciones esta formado por 180 instrucciones de máquina. 
Las direcciones y valores inmediatos son enteros de 16 bits 
Indique un formato posible de instrucciones 
a) LOAD R, inm carga en el registro R el valor inmediato inm 
b) STORE R,dir almacena el contenido de R en la dirección de memoria dir 
c) ADDI R1, R2, inm suma el contenido de R2 con el valor inm y deja el resultado en R1 
 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
a) LOAD R,inm 
 
Juego de instrucción 180 => necesarios 8 bits para su codificación 
16 registros de propósito general => 4 bits 
Dirección de memoria 16 bits (posiciones direccionables en una palabra y esta es de 16 bits) 
Valor inmediato => 16 bits 
 
No es suficiente una única palabra para representar la instrucción 
Palabra 1 
COP 8 bits R1 4 bits Sin uso 4 bits 
 
Palabra 2 
Inm 16 bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
b) STORE R1, dir 
Palabra 1 
COP 8 bits R1 4 bits Sin uso 4 bits 
 
Palabra 2 
Inm 16 bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
c) ADDI R1,R2,inm 
Palabra 1 
COP 8 bits R1 4 bits R2 4 bits 
 
Palabra 2 
inm 16 bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
 
Ej Partiendo de un procesador de 16 bits con un juego de 60 instrucciones máquina, se dispone de 
memoria direccionada a byte con un tamaño de 64KB.El banco de registros consta de 8 registros de 
propósito general. Diseñe el formato de la una instrucción que permita sumar dos registros y 
almacenar su resultado en una dirección de memoria. 
ADD R1 R2 MEM 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
 Al tener un juego de 60 instrucciones necesitamos al menos 6 bits para codificar su código de 
operación, en este caso ADD 
 Se disponen de 8 registros, luego serán necesarios tres bits para identificar cada uno de estos. En 
la instrucción aparecen dos registros de ahí que necesites 6 bits para su codificación. 
 La memoria permite direccionar hasta 64kb, lo que equivale a 16 bits 
 La palabra tiene un tamaño de 16 bits, por lo que la instrucción ocupará dos palabras, en la 
primera se codifica la operación y los 2 registros , quedan 4 bits sin utilizar y en la segunda la 
dirección con un tamaño de 16 bits con todos los bits utilizados 
 
ESTRUCTURA
DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
Ej. Partiendo de un computador con las siguientes características 
 Banco de registros de 32 registros de uso general de 32 bits 
 Operador con 40 operaciones aritméticas y lógicas 
 Bus de datos de 32 bits 
 Bus de dirección de 32 bits 
 Memoria con ancho de palabra de 32 bits y direccionamiento a nivel de byte 
 Juego de 1100 instrucciones 
El computador dispone de la siguiente instrucción 
POP despl($reg) 
Dicha instrucción saca de la pila el dato que se encuentra en la cima y lo almacena en la dirección de 
memoria indicada por su operando.Se utiliza un direccionamiento relativo al registro base. EL 
desplazamiento debe poder expresar saltos positivos y negativos de hasta 1 MB. 
Indicar el formato de la instrucción POP 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
A) El computador posee un juego de 1100 instrucciones, de ahí que sean necesarios 11 bits para la 
identificación del código de operación 
B) El numero de registros de uso general son 32 , empleando para ello 5 bits para la identificación 
de cada operando 
C) El desplazamiento de 1MB requiere 20bits (ver tabla correspondencia KB, MB,GB etc…), 
destacar que al ser posible realizar desplazamiento positivos y negativos es necesario indicar este 
hecho con un bit adicional que señalara el signo positivo o negativo del desplazamiento 
D) El tamaño de palabra es de 32 bits, al sumar los bits necesarios en los operandos y código de 
operación vemos necesario el uso de 2 palabras 
 
Palabra 1 
COP 11 bits R1 5bits sin uso 16 bits 
 
Palabra 2 
Desplazamiento 21 bits Sin uso 11 bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
Ej. Una arquitectura con tamaño de 20 bits , tanto palabra como registro, con 8 registros y un juego 
de 120 instrucciones. Todas las instrucciones presentan el siguiente formato y orden en caso de estar 
presentes todos los operadores 
COP DIR DESTINO DIR ORIGEN DESPLZ VALOR INMEDIATO 
 
En el caso de existir desplazamiento o valor inmediato en la instrucción será necesario 
maximizar su tamaño evitando bits sin asignar. En el caso de existir bits sin asignar se utilizaran 
los menos significativos (a la derecha) 
Asigne el formato adecuado para las siguientes instrucciones. 
a)ADDI Sumar de un valor inmediato sobre registro 
b) ADDR Suma en operación registro a registro 
c) ADDM Suma con direccionamiento absoluto en operaciones registro-memoria 
d)ADDRB suma con direccionamiento relativo a registro base 
e)ADDPC suma con direccionamiento relativo a contador de programa 
f)¿Cual es la dirección máxima direccionable? 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
 
a)ADDI Sumar de un valor inmediato sobre registro 
 
Siendo 120 el juego de instrucción utilizaremos al menos 7 bits para identificar cada operación 
El juego de registros es de 8, siendo por lo tanto necesarios 3 bits para identificar cada operador 
El resto de bits serán asignados al valor inmediato 
 
COP 7 bits DIR DESTINO 3 bits VALOR INMEDIATO 10bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
 
b) ADDR Suma en operación registro a registro 
AL igual que el caso anterior utilizaremos 7 bits para el código de operación , y 3 para cada uno 
de los 2 operadores que utilizaremos. El resto de bits 7, quedaran sin uso 
COP 7 bits DIR DESTINO 3 bits DIR ORIGEN 3 
bits 
0000000 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
 
c) ADDM Suma con direccionamiento absoluto en operaciones registro-memoria 
COP 7 bits DIR DESTINO 3 bits DIRECCION ABSOLUTA 10 bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
 
d)ADDRB suma con direccionamiento relativo a registro base 
COP 7 bits DIR DESTINO 3 bits REG DIR BASE 3 bits DESPL 7 bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
 
e)ADDPC suma con direccionamiento relativo a contador de programa 
COP 7 bits DIR DESTINO 3 bits DESPL 10 bits 
No es necesario conocer el valor del PC al ser implícito a la propia instrucción 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
 
f) ¿Cual es la dirección máxima direccionable? 
Son 10 bits luego 1024 posiciones 
 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
Ej. Dado un procesador de 16 bits que dispone de un banco de 6 registros y un espacio de 
direccionamiento de 64KB. La memoria se direcciona por bytes y requiere tres ciclos para las 
operaciones de lectura y escritura. La unidad ALU es capaz de realizar 20 operaciones 
aritméticas-lógicas . Asumiendo un código de operación fijo, diseñar el formato de instrucción 
que permita construir un juego de instrucciones con : 
a) 40 instrucciones aritmético-lógicas 
b) 5 direcciones de direccionamiento absoluto 
c) 5 direcciones de direccionamiento relativo a registro base con un desplazamiento 
máximo de 128 bytes 
d) 2 instrucciones de direccionamiento indirecto 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
Existen 52 instrucciones diferentes con lo que serán necesarios al menos 6 bits para codificar 
los diferentes códigos de operación 
Además existen 6 registros siendo necesarios a su vez 3 bits para su codificación 
El conjunto de direcciones de memoria puede ser representado mediante 16 bits (espacio 
direccionamiento 64Kb) 
Las operaciones que impliquen direccionamiento relativo a registro base requieren 7 bits, 
siendo 128 el desplazamiento máximo 
a) Operaciones aritmético-lógicas 
COP 6 bits R1 3 bits R2 3 bits R3 3 bits Sin uso 1 bit 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
Existen 52 instrucciones diferentes con lo que serán necesarios al menos 6 bits para codificar 
los diferentes códigos de operación 
Además existen 6 registros siendo necesarios a su vez 3 bits para su codificación 
El conjunto de direcciones de memoria puede ser representado mediante 16 bits (espacio 
direccionamiento 64Kb) 
Las operaciones que impliquen direccionamiento relativo a registro base requieren 7 bits, 
siendo 128 el desplazamiento máximo 
 
b) Direccionamiento absoluto 
COP 6 bits Sin uso 10 bits 
 
Dirección absoluto 16 bits 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
Existen 52 instrucciones diferentes con lo que serán necesarios al menos 6 bits para codificar 
los diferentes códigos de operación 
Además existen 6 registros siendo necesarios a su vez 3 bits para su codificación 
El conjunto de direcciones de memoria puede ser representado mediante 16 bits (espacio 
direccionamiento 64Kb) 
Las operaciones que impliquen direccionamiento relativo a registro base requieren 7 bits, 
siendo 128 el desplazamiento máximo 
 
c) Direccionamiento relativo 
COP 6 bits R1 3 bits Desplazamiento 7 bits 
 
 
 
ESTRUCTURA DE COMPUTADORES COLMENAREJO 
2013-2014 Ejercicios Viernes 
 
SOLUCION 
Existen 52 instrucciones diferentes con lo que serán necesarios al menos 6 bits para codificar 
los diferentes códigos de operación 
Además existen 6 registros siendo necesarios a su vez 3 bits para su codificación 
El conjunto de direcciones de memoria puede ser representado mediante 16 bits (espacio 
direccionamiento 64Kb) 
Las operaciones que impliquen direccionamiento relativo a registro base requieren 7 bits, 
siendo 128 el desplazamiento máximo 
 
d) Direccionamiento indirecto 
Similar al direccionamiento
absoluto 
COP 6 bits Sin uso 10 bits 
 
Dirección indirecta 16 bits 
 
EC Materiales/EC_practica3_2013-2014.pdf
 
 
 
ESTRUCTURA DE COMPUTADORES 
GRADO EN INGENIERÍA INFORMÁTICA 
 
 
 
UNIVERSIDAD CARLOS III DE MADRID 
 
 
 
Práctica 3 
Ensamblador de MIPS: Paso de 
parámetros entre subrutinas 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Noviembre 2013 
 
 
 
1. Objetivos de la práctica 
El objetivo de esta práctica es que el alumno se familiarice con la programación en 
ensamblador y el convenio de paso de parámetros a subrutinas en el ensamblador del 
MIPS32. 
Para alcanzar este objetivo el estudiante realizará la codificación en lenguaje 
ensamblador de una serie de funciones de las que se proporciona su código fuente en 
lenguaje C. 
Otro objetivo de la práctica es el trabajo en grupo, para ello, los alumnos deben 
repartirse las tareas y las funciones a desarrollar y posteriormente describir este reparto 
en el Ejercicio 4 
 
NOTA: Las subrutinas pedidas deben seguir OBLIGATORIAMENTE 
el nombre indicado en las siguientes secciones. Se ha de tener en cuenta 
que un nombre con mayúsculas es diferente de otro con minúsculas. 
Por ejemplo, los siguientes nombres corresponden a subrutinas 
diferentes: 
imprimir_entero, Imprimir_Entero, imprimir_ENTERO, etc. 
Observe que los nombres de función que se piden en esta práctica 
tienen todas sus letras en MINÚSCULAS. 
 
 
 
 
2. Convenio de paso de parámetros entre rutinas 
Operaciones básicas: apilar y desapilar 
Apilar 
sub $sp, $sp, 4 
sw $REG, ($sp) 
 
 
Desapilar 
lw $REG, ($sp) 
add $sp, $sp, 4 
 
 
La pila crece hacia direcciones de memoria más bajas. 
$p apunta al último dato en la pila. (OJO con esto: al último dato, NO al primer hueco 
libre). 
Convenio de uso de registros 
 Parámetros no flotantes: $a0, $a1, $a2, $a3, ---- si hay más de 4, el resto en la 
pila ---- 
 Parámetros flotantes: $f12, $f13, $f14, $f15, ---- si hay más de 4, el resto en la 
pila ---- 
 Parámetros flotantes doble precisión: $f12, $f14, ---- si hay más de 2, el resto 
en la pila ---- 
 Resultados no flotantes: $v0, $v1, ---- si hay más de 2, el resto en la pila ---- 
 Resultados flotantes: $f0, ---- si hay más de 1, el resto en la pila ---- 
Siempre que se pueda se deben usar registros, ya que es más rápido que usar la pila. 
Paso de parámetros con tipos de datos no básicos 
 Cadenas de caracteres: se pasa la dirección de comienzo de la cadena. 
 Arrays unidimensionales: se pasa la dirección de comienzo del array y el 
número de elementos 
 Arrays bidimensionales (solo en la práctica): se pasa la dirección de comienzo 
del array, el número de filas, y el número de columnas. 
Rutina A que llama a rutina B (B, terminal) 
Rutina A  Antes de llamar a B 
nueva cima 
 
 
cima 
nuevo $sp $sp 
cima 
 
 
REG 
(nueva cima) 
$sp nuevo $sp 
 
 
 
o Apilar $a que vaya a 
utilizar 
o Apilar $t que quiera 
conservar 
o Apilar $ra 
o Pasar parámetros en $a 
o Apilar (si no caben en 
regs) resto de parámetros 
de B 
 Llamar a B 
o jal B <Pasa a ejecutarse 
B> 
 Después de llamar a B 
o Desapilar parámetros de 
B (si hay) 
o Desapilar $ra 
o Desapilar $t (si se 
apilaron) 
o Desapilar $a 
 
 
 
 
 
 
 
 
 
 
 
 
Rutina B 
 Apilar registros (diferentes de $t 
y $v) que se vayan a modificar 
(p.ej. $s) 
 Acceder a los parámetros de la 
pila (sin desapilar) 
 <Ejecutar su código> 
 Desapilar registros que se hayan 
utilizado al principio (p. ej $s) 
 Retornar (jr $ra) 
 
 
 
 
 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 5 
 
Rutina A que llama a rutina C que a su vez llama a rutina B 
A y B igual que antes, pero A invocando a C en lugar de a B (A  C  B) 
C debe realizar los pasos del convenio de A y de B. 
Rutina C 
 Apilar registros (diferentes de $t y $v) que se vayan a modificar (p.ej. $s) 
 Acceder a los parámetros de la pila (sin desapilar) 
 <Ejecutar su código> 
 Apilar $a que vaya a utilizar 
 Apilar $t que quiera conservar 
 Apilar $ra 
 Pasar parámetros en $a 
 Apilar (si no caben en regs) resto de parámetros de B 
 Llamar a B (jal B) 
 Desapilar parámetros de B (si hay) 
 Desapilar $ra 
 Desapilar $t 
 Desapilar $a 
 <Seguir ejecutando su código> 
 Desapilar registros que se hayan utilizado al principio (p. ej $s) 
 Retornar a A (jr $ra) 
 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 6 
 
3. Ejercicios a desarrollar 
Recuerde que las rutinas implementadas tienen que seguir el convenio 
de paso de parámetros que se ha indicado anteriormente. En caso 
contrario, la práctica tendrá la calificación de 0. 
 
Ejercicio 1 
Implementar un programa matrix.s que contenga las siguientes subrutinas. En el 
material de apoyo de la práctica 3, que puede descargar en Aula Global 2, se dispone del 
fichero matrix.s, del que debe partir el alumno. 
 
El código que se muestra presenta dos operaciones de acceso a una matriz, get y set. En 
el caso de la función set, se devolverá un 0 si el cambio ha podido realizarse y un -1 en 
caso contrario. La función get devolverá dos enteros. El primero es el valor al que se 
quería acceder, y el segundo un código de finalización. Si la ejecución es correcta, se 
devolverá el valor solicitado y un 0. Si la ejecución es incorrecta, se devolverá un 0 y un 
-1 para indicar que el resultado no es válido. 
NOTA: el programa debe funcionar independientemente de los datos 
declarados en la zona de .data. 
 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 7 
 
Ejercicio 2 
Implementar un programa operations.s que contenga las siguientes subrutinas. En el 
material de apoyo de la práctica 3 se dispone del fichero operations.s, del que debe 
partir el alumno. 
 
 
Las subrutinas a desarrollar son sumar y multiplicar, que deberán realizar la suma y 
multiplicación de dos matrices respectivamente, dadas sus dimensiones. Los parámetros 
y valores de retorno deben seguir el orden que se muestra en la imagen anterior. 
Para desarrollar este programa deberá utilizar reserva dinámica de memoria, que se 
corresponde con la llamada al sistema 9. El resultado equivalente en ensamblador 
deberá ser la dirección de comienzo de la matriz resultado. 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 8 
 
También deberá emplear las subrutinas get y set del ejercicio anterior en el acceso a las 
matrices. 
NOTA: el programa debe funcionar independientemente de los datos 
declarados en la zona de .data. 
 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 9 
 
Ejercicio 3 
Implementar un programa axpy.s que contenga la subrutina descrita a continuación. En 
el material de apoyo de la práctica 3 se dispone del fichero axpy.s, del que debe partir el 
alumno. 
Se desea desarrollar una subrutina que realice la operación , donde A, X e Y 
son matrices. Se deberán utilizar las funciones desarrolladas previamente para la 
realización del ejercicio. Un ejemplo de código es el siguiente: 
 
La salida en este caso será: 
 
11 11 11 11 
22 22 22 22 
33 33 33 33 
44 44 44 44 
 
NOTA: el programa debe funcionar independientemente de los datos 
declarados en la zona de .data. 
 
 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 10 
 
Ejercicio 4 
En este ejercicio se solicita la
creación de un plan de trabajo detallado. Los alumnos 
deberán detallar como mínimo los siguientes puntos: 
 Reparto de tareas entre los miembros del grupo, tanto si se ha realizado a nivel 
de ejercicio o por funciones. 
 Planificación del tiempo de trabajo. 
 Comunicación entre los miembros del grupo (reuniones semanales, trabajo en 
mismo lugar…) 
 Herramientas utilizadas para la comunicación entre los miembros y envío del 
trabajo. 
 Método de unión de trabajo. 
 Plan de pruebas. 
 Evaluación del resultado de la planificación. 
NOTA: es obligatorio la realización de este ejercicio para aprobar la 
práctica, será evaluado como APTO o NO APTO. 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 11 
 
Ejercicio 5 
Implementar un programa axpy_flat.s que desarrolle un comportamiento equivalente al 
de axpy.s (con todas las subrutinas) SIN utilizar la pila para guardar ningún dato. Puede 
reservar espacio en la zona de datos o en memoria dinámica. En el material de apoyo de 
la práctica 3 se dispone del fichero axpy_flat.s, del que debe partir el alumno. 
Adicionalmente, deberá incluir en la memoria una comparación entre ambas versiones, 
detallando el número de registros utilizados, el número de líneas totales de la aplicación 
y el tamaño total utilizado en la zona de datos (si la cantidad varía en función del 
tamaño de las matrices, indíquelo de forma genérica). 
 
NOTA: el programa debe funcionar independientemente de los datos 
declarados en la zona de .data. 
 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 12 
 
Procedimiento de evaluación de la práctica 
La evaluación de la práctica se va a dividir en tres partes. 
 Parte Obligatoria (8 puntos) 
En esta parte se incluyen los ejercicios 2 y 3 de la práctica, así como la memoria 
de la misma. El reparto de puntuación dentro de la entrega obligatoria será el 
siguiente: 
o Ejercicio 1 (2 puntos) 
o Ejercicio 2 (3 puntos) 
o Ejercicio 3 (2 puntos) 
o Ejercicio 4 (APTO o NO APTO) 
No descuide la calidad de este ejercicio, un NO APTO en él supone un 
suspenso en la práctica 
o Memoria (1 punto) 
 Parte Opcional (2 puntos) 
El ejercicio 5 es de realización opcional. El reparto de puntuación dentro de esta 
entrega opcional será el siguiente: 
o Ejercicio 5 (1.5 puntos) 
o Memoria (0.5 puntos) 
Procedimiento de entrega 
La entrega de la práctica 3 se realizará de la siguiente manera: 
 La fecha de entrega de estos ejercicios podrá consultarse en Aula Global, en los 
entregadores habilitados a los efectos. 
 Entregador 1: Se deberá entregar un único archivo comprimido en formato zip 
con el nombre: 
ec_p3_AAAAAAAAA_BBBBBBBBB.zip 
donde A…A y B…B son los NIAs de los integrantes del grupo. El archivo zip 
debe contener: 
 matrix.s 
 operations.s 
 axpi.s 
 axpi_flat.s 
 
 
Grado de Ingeniería en Informática Estructura de Computadores (2013-2014) 
Universidad Carlos III de Madrid 13 
 
 Entregador 2: Se deberá entregar un único archivo pdf con el nombre: 
ec_p3_AAAAAAAAA_BBBBBBBBB.pdf 
donde A…A y B…B son los NIAs de los integrantes del grupo. La memoria 
debe contener al menos los siguientes apartados: 
 
o Portada donde figuren los autores (incluyendo nombre completo, NIA y 
dirección de correo electrónico) 
o Índice de contenidos. 
o Descripción de los programas solicitados. 
o Respuesta al ejercicio 4. 
o Batería de pruebas utilizadas y resultados obtenidos. 
o Conclusiones y problemas encontrados. 
 
NOTA: NO DESCUIDE LA CALIDAD DE LA MEMORIA DE SU PRÁCTICA. 
Aprobar la memoria es tan imprescindible para aprobar la práctica, como el correcto 
funcionamiento de la misma. Si al evaluarse la memoria de su práctica, se considera que 
no alcanza el mínimo admisible, su práctica estará suspensa. 
La longitud de la memoria no deberá superar las 20 páginas (portada e índice 
incluidos). 
 La entrega de las prácticas ha de realizarse de forma electrónica. En AULA 
GLOBAL se habilitarán unos enlaces a través de los cuales podrá realizar la 
entrega de las prácticas. 
 La única versión registrada de su práctica es la última entregada. La valoración 
de esta es la única válida y definitiva. 
 
 
Normas 
1. Las prácticas que no compilen o que no se ajusten a la funcionalidad y requisitos 
planteados, obtendrán una calificación de 0. 
2. Un programa no comentado, obtendrá una calificación de 0. 
3. La entrega de la práctica se realizará a través de los entregadores habilitados. No 
se permite la entrega a través de correo electrónico sin autorización previa. 
4. Se prestará especial atención a detectar funcionalidades copiadas entre dos 
prácticas. En caso de encontrar implementaciones comunes en dos prácticas, 
ambas obtendrán una calificación de 0. 
 
 
EC Materiales/EC_practica2_2013-2014.pdf
http://spimsimulator.sourceforge.net/
EC Materiales/Enunciado-2.pdf
Ejercicio 1 Sumar dos números 7 y 5 y mostrar por pantalla 
 .data 
 msg: .asciiz "Suma de dos numeros" 
 resultado: .asciiz "Resultado es : " 
 retorno: .asciiz "\n" 
 
 .text 
 .globl main 
 main: li $v0, 4 # syscall 4 (print_str) 
 la $a0, msg # argument: cadena string 
 syscall # llamada al sistema 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: cadena string 
 syscall # llamada al sistema 
 
 li $t1, 5 #carga de la constante 5 en el registro 
 li $t2, 7 #carga de la constante 7 en el registro 
 add $t1 ,$t1, $t2 #suma de los valores de los registros 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, resultado # argument: string 
 syscall # llamada al sistema 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 move $a0, $t1 # copiamos el registro en $a0 
 syscall # print the string 
 
 jr $ra # devolucion llamada punto siguiente invocacion 
 
 
Ejercicio2. Solicite uno de los dos números y súmelos. Mostrar por pantalla el resultado 
 .data 
 msg: .asciiz "Sumar a 7 el numero:" 
 resultado: .asciiz "Resultado es : " 
 retorno: .asciiz "\n" 
 
 .text 
 .globl main 
 main: li $v0, 4 # syscall 4 (print_str) 
 la $a0, msg # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 #Tomar por pantalla un valor entero 
 li $v0,5 #syscall 5 (read_int) 
 syscall 
 move $t1, $v0 
 
 li $t2, 7 
 add $t1 ,$t1, $t2 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, resultado # argument: string 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 move $a0, $t1 # Copiamos valor en el registro esperado 
 syscall # print the string 
 
 jr $ra # Devolucion llamada 
 
Ejercicio 3 . Crear un programa que permita listar los elementos de un array. 
.data 
 msg: .asciiz "Listado array" 
 resultado: .asciiz "Valores almacenados son : " 
 retorno: .asciiz "\n" 
 arr: .word 100,200,300,400 
 indice: .word 1 
 .text 
 .globl main 
 main: li $v0, 4 # syscall 4 (print_str) 
 la $a0, msg # argument: string 
 syscall # print
the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 li $v0, 1 # syscall 4 (print_int) 
 lw $t3,arr($zero) 
 move $a0,$t3 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 li $v0, 1 # syscall 4 (print_int) 
 li $t2, 1 # argument: 1 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 #Copiar registro 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 li $v0, 1 # syscall 4 (print_int) 
 li $t2, 2 # argument: 2 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 li $v0, 1 # syscall 4 (print_int) 
 li $t2, 3 # argument: 3 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 
 li $t2, 4 # argument: 4 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 
 syscall # print the string 
 jr $ra # Devolucion llamada a punto invocacion 
 
Ejercicio 4 . Multiplicar dos números positivos recogidos por pantalla.Si uno de los 
números es negativo no hacer nada y mostrar mensaje por pantalla. 
Multiplicamos los dos valores leidos desde el terminal del teclado 
 
 .data 
 msg: .asciiz "Multiplicacion 2 numeros por teclado" 
 valor1: .asciiz "Leer valor 1" 
 valor2: .asciiz "Leer valor 2" 
 resultado: .asciiz "Resultado es : " 
 retorno: .asciiz "\n" 
 
 .text 
 .globl main 
 main: li $v0, 4 # syscall 4 (print_str) 
 la $a0, msg # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, valor1 # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 #tomar por pantalla un valor entero 
 li $v0,5 #syscall 5 (read_int) 
 syscall 
 move $t1, $v0 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, valor2 # argument: string 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 
 #tomar por pantalla segundo entero 
 li $v0,5 #syscall 5 (read_int) 
 syscall 
 move $t2, $v0 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, resultado # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 mul $t2,$t1,$t2 #multiplicamos dos enteros 
 li $v0, 1 # syscall 4 (print_int) 
 
 move $a0,$t2 
 syscall # print the string 
 
 jr $ra # Devolucion llamada 
 
Añadimos al código las comprobaciones oportunas sobre los valores recogidos y verificamos 
que sean mayores que cero. 
 .data 
 msg: .asciiz "Multiplicacion 2 numeros por teclado" 
 valor1: .asciiz "Leer valor 1" 
 valor2: .asciiz "Leer valor 2" 
 resultado: .asciiz "Resultado es : " 
 serror: .asciiz "Valor incorrecto !! " 
 retorno: .asciiz "\n" 
 
 .text 
 .globl main 
 main: li $v0, 4 # syscall 4 (print_str) 
 la $a0, msg # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, valor1 # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 #tomar por pantalla un valor entero 
 li $v0,5 #syscall 5 (read_int) 
 syscall 
 move $t1, $v0 
 bltz $t1,error 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, valor2 # argument: string 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 
 #tomar por pantalla segundo entero 
 li $v0,5 #syscall 5 (read_int) 
 syscall 
 move $t2, $v0 
 bltz $t2,error 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, resultado # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 mul $t2,$t1,$t2 #multiplicamos dos enteros 
 li $v0, 1 # syscall 4 (print_int) 
 
 move $a0,$t2 
 syscall # print the string 
 b final 
 
 error: 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, serror # argument: string 
 syscall # print the string 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 final: 
 jr $ra # Devolucion llamada 
 
Ejercicio 5 En un determinado array de valores, identifique el mayor valor y muéstrelo 
por pantalla. 
 
 .data 
 msg: .asciiz "Listado array" 
 resultado: .asciiz "Valores almacenados son : " 
 maximo: .asciiz "Valor maximo es : " 
 retorno: .asciiz "\n" 
 arr: .word 10,200,30,40 
 indice: .word 1 
 .text 
 .globl main 
 main: li $v0, 4 # syscall 4 (print_str) 
 la $a0, msg # argument: string 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 
 lw $t3,arr($zero) 
 move $t0,$t3 
 move $a0,$t3 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 
 li $t2, 1 # argument: 1 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 
 syscall # print the string 
 
 bgt $t3,$t0,update1 
 b after1 
 update1: 
 move $t0,$t3 
 after1: 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 
 li $t2, 2 # argument: 2 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 
 syscall # print the string 
 
 bgt $t3,$t0,update2 
 b after2 
 update2: 
 move $t0,$t3 
 after2:
li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 
 li $t2, 3 # argument: 3 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 
 syscall # print the string 
 
 bgt $t3,$t0,update3 
 b after3 
 update3: 
 move $t0,$t3 
 after3: 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 
 li $t2, 4 # argument: 4 
 mul $t2,$t2,4 
 lw $t3,arr($t2) 
 move $a0,$t3 
 syscall # print the string 
 
 bgt $t3,$t0,update4 
 b fin 
 update4: 
 move $t0,$t3 
 fin: 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, retorno # argument: string 
 syscall # print the string 
 
 li $v0, 4 # syscall 4 (print_str) 
 la $a0, maximo # argument: string 
 syscall # print the string 
 
 li $v0, 1 # syscall 4 (print_int) 
 
 move $a0,$t0 
 syscall # print the string 
 
 jr $ra 
 
Optimizar el código mostrado mediante el uso de un número menor de saltos y etiquetas 
 
 
 
 
 
Ejercicio 6 Crear un sistema de selección de butacas. El usuario podrá escoger el tipo de 
butaca a partir de una lista de posibles opciones 
 
# Ejercicio Seleccion 
.data 
 # Incluimos el salto de linea en la propia cadena 
 # a diferencia ejemplos anteriores que era independiente 
 opciones: .asciiz "Leer opcion 1-Fumador 2-No Fumador 3-VIP -Resto \n" 
 fumador: .asciiz "Asiento Fumador\n" 
 Nofumador: .asciiz "Asiento no fumador\n" 
 vip: .asciiz "Acceso VIP\n" 
 otros: .asciiz "Otros\n" 
 
.text 
.globl main 
main: 
 li $v0, 4 
 la $a0,opciones 
 syscall 
 
 #tomar por pantalla un valor entero 
 li $v0,5 #syscall 5 (read_character) 
 syscall 
 move $t1, $v0 
 
opcionUno: bne $t1, 1, opcionDos 
 la $a0, fumador 
 b fin 
opcionDos: bne $t1, 2, opcionTres 
 la $a0, Nofumador 
 b fin 
opcionTres: bne $t1, 3, opcionResto 
 la $a0, vip 
 b fin 
opcionResto: la $a0, otros 
 
 fin: li $v0, 4 
 syscall 
 li $v0, 10 #terminar ejecucion del programa 
 syscall 
EC Materiales/EC_practica4_2013-2014.pdf
ESTRUCTURA DE COMPUTADORES
GRADO EN INGENIERÍA INFORMÁTICA
UNIVERSIDAD CARLOS III DE MADRID
Práctica 4
Noviembre 2013
Contenido
 OBJETIVOS DE LA PRÁCTICA.............................................................................3
 DESCRIPCIÓN...........................................................................................................3
 EJERCICIO 1 .............................................................................................................4
 EJERCICIO 2..............................................................................................................5
 PROCEDIMIENTO DE EVALUACIÓN DE LA PRÁCTICA..............................6
 PROCEDIMIENTO DE ENTREGA........................................................................7
Objetivos de la práctica
El propósito de esta práctica es que el estudiante entienda el efecto de la memoria
caché en el rendimiento de un ordenador. Para ello, analizará cómo funciona una
memoria caché y cuáles son sus valores característicos.
Descripción
El alumno deberá analizar cuáles son los valores específicos de diferentes parámetros
para la caché del ordenador en el que se realiza la práctica. Para ello, se usará
programa calibrator disponible en Aula Global. Para obtener información adicional
del programa, consultar:
http://homepages.cwi.nl/~manegold/Calibrator/
Este programa permite extraer información del siguiente tipo:
- El número de niveles de caché.
- El tamaño de cada nivel de caché.
- El tamaño de cada línea.
Para ejecutar el programa, una vez descargado, se debe ejecutar el siguiente comando:
./calibrator MHz size filename
donde:
- MHz
o especifica la frecuencia de reloj en MHz
- size
o especifica el tamaño de la memoria usada en el análisis. Debe ser un
valor inferior al tamaño de la memoria principal, y superior que el
tamaño máximo esperado de la caché. El valor de size se expresa en
bytes, y se pueden usar los siguientes sufijos:
 k  kilo = 1024 bytes (Ej: 100k)
 M  Mega = 10242 bytes (Ej: 10M)
 G  Giga = 10243 bytes (Ej: 1G)
- filename
o es el nombre del fichero donde se almacenan los resultados del análisis
http://homepages.cwi.nl/~manegold/Calibrator/
Ejercicio 1 
La práctica se realizará en un computador con sistema operativo Windows. Para poder
ejecutar el programa anterior, el alumno deberá determinar y encontrar en primer
lugar la frecuencia de reloj del procesador y el tamaño de la memoria principal
instalada.
Para ejecutar el programa calibrator, el estudiante debe averiguar previamente la
frecuencia del reloj y el tamaño de la memoria principal.
A continuación se deben responder a las siguientes 6 preguntas:
1. ¿Cuál es la frecuencia de reloj en Mhz de la máquina en la que se realiza la
práctica? ¿Cómo lo ha obtenido?
2. ¿Cuál es el tamaño en GB de la memoria principal de la máquina en la que se
realiza la práctica? ¿Cómo lo ha obtenido?
3. ¿Cuántos niveles de caché tiene la máquina?
4. Para cada nivel de caché, indicar su tamaño en KB o MB.
5. Especificar cuál es el tamaño de línea de cada nivel.
6. Indicar el número de líneas de cada nivel de caché. Justifique su respuesta.
Ejercicio 2
El objetivo de esta segunda parte es que el alumno aprenda a determinar la tasa de
fallos que se produce en la ejecución de un programa. 
Considere el siguiente código:
int array [4194304];
int stride = 4;
for ( j = 0; j <= stride; j++)
{
for (i = j; i < array.length ; i = i + stride)
{
array[i] = 28;
}
}
Dadas las siguientes configuraciones de cache de datos:
[1] L1 de 32KB con un tamaño de línea de 64B
L2 de 256KB con un tamaño de línea de 64B
[2] L1 de 32KB con un tamaño de línea de 64B
L2 de 256KB con un tamaño de línea de 128B
[3] L1 de 32KB con un tamaño de línea de 64B
L2 de 256KB con un tamaño de línea de 64B
L3 de 4MB con un tamaño de línea de 64B
Tenga en cuenta que todas las caches son asociativas por conjuntos, con 8 vías en
L1 y L2, y 16 vías en L3. La política de reemplazo es LRU.
Usando estas configuraciones conteste a las siguientes preguntas de forma justificada:
1. El número de accesos a memoria debidos a la lectura/escritura del array
que se realizan.
2. Se deberá indicar de forma razonada el número de fallos de caché que se
produce en cada nivel, así como los pasos seguidos para calcularlos. De
nuevo, considere solamente los fallos producidos por el acceso al array.
Procedimiento de evaluación de la práctica
La evaluación de la práctica se va a realizar de la siguiente forma:
• Ejercicio 1 (3 puntos)
o Ejercicio 1.1 (0.5 puntos)
o Ejercicio 1.2 (0.5 puntos)
o Ejercicio 1.3 (0.5 puntos)
o Ejercicio 1.4 (0.5 puntos)
o Ejercicio 1.5 (0.5 puntos)
o Ejercicio 1.6 (0.5 puntos)
• Ejercicio 2 (6 puntos)
o Ejercicio 2.1 (3 puntos)
o Ejercicio 2.2 (3 puntos)
• Memoria (1 punto)
 
Procedimiento de entrega
La entrega de la práctica 4 se realizará de la siguiente manera: los ejercicios de este
cuaderno y la memoria completa podrá entregarse hasta el día 13 de Diciembre de
2013 a las 23:55 horas.
Entregador: Se deberá entregar la memoria en un único archivo en formato pdf con el
nombre ec_p4_AAAAAAAAA_BBBBBBBBB.pdf donde A…A y B…B son los NIAs
de los integrantes del grupo. La memoria tendrá que contener al menos los siguientes
apartados: 
o Portada donde figuren los autores (incluyendo nombre completo, NIA y
dirección de correo electrónico)
o Índice de contenidos.
o Respuestas a las preguntas planteadas en los ejercicios debidamente
justificadas.
o Conclusiones y problemas encontrados. 
NOTA: NO DESCUIDE LA CALIDAD DE LA MEMORIA DE SU PRÁCTICA.
Aprobar la memoria es tan imprescindible para aprobar la práctica, como el correcto
funcionamiento de la misma. Si al evaluarse la memoria de su práctica, se considera
que no alcanza el mínimo admisible, su práctica estará suspensa.
La longitud de la memoria no deberá superar las 15 páginas (portada e índice
incluidos)
 La entrega de las prácticas ha de realizarse de forma electrónica. En AULA
GLOBAL se habilitarán unos enlaces a través de los cuales podrá realizar la
entrega de las prácticas.
 La única versión registrada de su práctica es la última entregada. La
valoración de esta es la única válida y definitiva.
Normas
1) La entrega de la práctica se realizará a través de los entregadores habilitados. No
se permite la entrega a través de correo electrónico sin autorización previa.
2) Se prestará especial atención a detectar funcionalidades copiadas entre dos
prácticas. En caso de encontrar implementaciones comunes en dos prácticas,
ambas obtendrán una calificación de 0.
		Objetivos de la práctica
		Descripción
		Ejercicio 1
		Ejercicio 2
		Procedimiento de evaluación de la práctica
		Procedimiento de entrega
EC Materiales/Ejercicios clase2 practicas.pdf
Coma Flotante 
Prácticas 
Estructura de Computadores 2013/14 
• Ejercicio 1. Represente en el estándar IEEE 
754 de simple precisión los números 14 y 3.5 
 
Estructura de Computadores 2013/14 
• Número 14 
• 14 en binario=1110 
• Normalizado 1,110 x 23 
• Exponente = 3 +127=130 en binario 10000010 
 
 
S Exponente Mantisa 
0 10000010 11000000000000000000000 
Estructura de Computadores 2013/14 
• Número 3.5 
• 3.5 en binario =11,1 
• Normalizado 1,11 x 21 
• Exponente =1 + 127=128 
 
 S Exponente Mantisa 
0 10000000 11000000000000000000000 
Estructura de Computadores 2013/14 
• Ejercicio 2. Realice la suma de los números 
anteriores, 14 y 3.5, representados en el 
estándar IEEE 754 
 
Estructura de Computadores 2013/14 
• Analizar exponentes de ambos numeros y alinear en caso necesario 
– 130 frente a 128 es decir una diferencia de -2 
• Alineamos la mantisa del segundo número 3.5 desplazando la coma 
dos posiciones 
• 1,11000000000000000000000 desplazamos dos posiciones y 
obtenemos 0,0111 
• Sumamos 
 1,11 + 
 0,0111 
10,0011 
• Normalizamos 1,00011 x 21 y obtenemos un nuevo exponente el 
cual sumaremos al exponente 130.Finalmente obtenemos un 
exponente de 131 
 
 
S Exponente Mantisa 
0 10000011 00011000000000000000000 
Estructura de Computadores 2013/14 
• Ejercicio 3. Realice el producto de los números 
anteriores, 14 y 3.5, representados en el 
estándar IEEE754 
Estructura de Computadores 2013/14 
• 14 normalizado 1,110 x 23 
• 3.5 normalizado 1,11 x 21 
 
 1,110 
X 1,11 
 111 
 111 
 111 
1,10001 
 
Sumamos los exponentes 2 (3+1) y obtenemos 
1,10001 x 24 
 
 
 
S Exponente Mantisa 
0 10000100 10001000000000000000000 
Estructura de Computadores 2013/14 
• Ejercicio 4. Represente los números 14 y 3,5 
utilizando la representación en coma flotante 
de 16 bits 
 
 S 1 bit Exponente 5 bits Mantisa 10 bits 
Estructura de Computadores 2013/14 
• Exceso 15 = 2n-1-1= 25-1-1 
• 1410=1110 
• 1,110 x 23 Exponente 15+3=18 
 
 
0 10010 1100000000 
Estructura de Computadores 2013/14 
• 3.510=11,1 
• 1,11 x 21 Exponente 15+1=16 
 
 
0 10000 1100000000 
Estructura de Computadores 2013/14 
• Ejercicio 5. Indicar el valor decimal de los 
siguientes números hexadecimales que siguen 
el formato de coma flotante IEEE 754 
 0xFF800000 
 
Estructura de Computadores 2013/14 
• Ejercicio 5. Indicar el valor decimal de los 
siguientes números hexadecimales que siguen 
el formato de coma flotante IEEE 754 
 0xFF800000 
1 11111111 00000000000000000000000 
Infinito (Consultar casos especiales y tener en cuenta 
el signo) 
 
Estructura de Computadores 2013/14 
• Ejercicio 5. Indicar el valor decimal de los 
siguientes números hexadecimales que siguen 
el formato de coma flotante IEEE 754 
 0x7F804000 
 
Estructura de Computadores 2013/14 
• Ejercicio 5. Indicar el valor decimal de los 
siguientes números hexadecimales que siguen 
el formato de coma flotante IEEE 754 
0x7F804000 
0 11111111 00000000100000000000000 
NaN Non is a Number (ver casos especiales) 
 
Estructura de Computadores 2013/14 
• Ejercicio 5. Indicar el valor decimal de los 
siguientes números hexadecimales que siguen 
el formato de coma flotante IEEE 754 
 0xC7B00000 
 
Estructura de Computadores 2013/14 
• Ejercicio 5. Indicar el valor decimal de los 
siguientes números hexadecimales que siguen 
el formato de coma flotante IEEE 754 
0xC7B00000 
1 10001111 01100000000000000000000 
 
Estructura de Computadores 2013/14 
• Ejercicio 6 Representar el numero 
A = 0,11010001 * 210100 según el IEEE-754 de 
simple precisión. Traslade el resultado 
obtenido a una representación hexadecimal. 
 
Estructura de Computadores 2013/14 
• A = 0,11010001 * 210100 = 1,1010001 * 210011 
• El exponente más el sesgo(127) vale: 
 00010011 (19) 
+ 01111111 (127) 
 10010010 (146) 
 
 
 
Valor hexadecimal 0x49510000 
 
0 10010010 10100010000000000000000 
Estructura de Computadores 2013/14 
• Ejercicio 6. Realice la siguiente suma 
4C740000 y 49840017 
• A=4C740000 y B=49840017 
 
 
Estructura de Computadores 2013/14 
• A → 0 10011000 11101000000000000000000 
Mantisa A = 1’11101000000000000000000 
Exponente A = 10011000 = 152 
• B → 0 10010011 00001000000000000010111 
Mantisa B= 1’00001000000000000010111 
Exponente B = 10010011 = 147 
 
Estructura de Computadores 2013/14 
• Alinear mantisas: Expa- Expb = 5 → desplazar 
Mantisa de B 5 lugares a la derecha 
• Mantisa B= 
0’0000100001000000000000010111 
Estructura de Computadores 2013/14 
• Sumar las mantisas 
M = Mantisa A + Mantisa B = 
1’1111000001000000000000010111 
 
Se normaliza en caso de ser necesario 
Estructura de Computadores 2013/14 
• Resultado 
 0 10011000 11110000010000000000001 
 
Estructura de Computadores 2013/14 
• Ejercicio 7 Realice la siguiente operación de 
resta entre los siguientes números en coma 
flotante 
Numero A 
 
Numero B 
 
0 01111110 10101000000000000000000 
0 10001001 10000111110010000000000 
Estructura de Computadores 2013/14 
• Comparar exponentes y alinear en caso de ser 
distintos 
Exponente A = 126 
Exponente B = 137 
Desplazamos el numero B en 11 posiciones hasta alinear 
con el exponente del número B 
 
 
Mantisa=1, 10101000000000000000000 
Mantisa desplazada 11 posiciones obtenemos= 
0,0000000000110101000000 
 
0 01111110 10101000000000000000000 
Estructura de Computadores 2013/14 
• Una aplicación del complemento a 2 es 
facilitar la operación de resta, 
complementando a 2 el sustraendo 
C2 de 1000111110010000000000 = C1 + 1 
C1 es = 011100000110111111111111 
 
 C1 
+ 1 
1110000011100000000000 
 
Estructura de Computadores 2013/14 
• Sumamos estos números 
Signo Mantisa 
0 00000000000110101000000 
1 01110000011100000000000 
 
Donde vemos que el resultado es un número 
negativo

Continuar navegando