ARQUITECTURA DE COMPUTADORES Semestre A-2009 Clase 13
AGENDA 2do Examen Parcial: Martes 30/06/2009 Repaso Ejercicios
Representación de números binarios con signo A los números positivos y al cero, los hemos representado con n dígitos binarios, pero ¿Cómo representamos los números negativos en binario? Existen tres representaciones de números enteros con signo en binario: –Signo - Magnitud –Signo - Complemento: Complemento a 1 Complemento a 2 La representación utilizada en la actualidad, es el complemento a 2
Representación Signo - Magnitud El bit más significativo indica el signo del número: → → -52 Algunos inconvenientes: –Existen dos ceros +0 : : –¿Cómo podríamos sumar dos dígitos en Signo - Magnitud? Comparar los signos: Iguales → Suma, Distintos → Resta anan a n-1 a n-2...…a0a0 a1a1 a2a2 …a -m Bit de signo n Bits: Parte enteram Bits: Parte decimal Sumar las magnitudes (Circuitería de suma) Colocarle el signo común Detectar el número mayor (Circuitería de detección de mayor) Restarle al número mayor el otro (Circuitería de resta) Asignarle al resultado el signo del mayor
Representación en Complemento a 1 El negativo de un número se obtiene al colocar todos los 1s como 0s y todos los 0s como 1s → → -22 Algunos inconvenientes: –Existen dos ceros +0 : : –¿Cómo podríamos sumar dígitos en Complemento a 1? Se realiza la suma (Circuitería de suma) Si hay un bit de acarreo, se suma (2da suma) Si los signos son distintos, se coloca el signo del mayor (Circuitería de detección del mayor) A = 2 n – a n-1 a n-2...a 1 a 0
Representación en Complemento a 2 El negativo de un número se obtiene al colocar el número en complemento a 1 y sumarle una unidad (1) → → -22 Una forma rápida de calcular el complemento a 2 es: –Recorriendo el número de derecha a izquierda, deje los 0s sin cambiar –Siguiendo el recorrido, deje al primer 1 sin modificar –A partir de allí, cambie los 0s por 1s y los 1s por 0s Características: –Existe un solo cero: –¿Cómo se sumarían dos dígitos en Complemento a 2? Se realiza la suma (Circuitería de suma) A = 2 n – a n-1 a n-2...a 1 a 0 + 1
c) → → → +30 Ejemplo de sumas en Complemento a 2 b) → → → -30 a) → → → +74 d) → → → -74
Arquitectura MIPS
Componentes de la arquitectura El Contador de Programa (PC) Unidad de Control Unidad Aritmético-Lógica Registros Memoria de Datos Memoria de Instrucciones
Programa almacenado John von Neumann introdujo, por primera vez, en 1945, la idea de almacenar el programa en memoria El programa es almacenado dentro de la máquina para luego ser procesado internamente Las instrucciones y los datos son guardados en memoria como números Varios usuarios pueden utilizar un mismo computador para diferentes conductas, resultando en diferentes aplicaciones y dándole un carácter universal, como herramienta, al computador
Conjuntos de instrucciones Para darle órdenes al hardware de un computador, debemos hablar su idioma Las palabras del idioma de los computadores se denominan instrucciones, y su vocabulario es llamado conjunto de instrucciones Una instrucción, en lenguaje de máquina, es un código formado por voltajes altos y bajos Un conjunto de instrucciones debería: –Facilitar (Simplicidad) la construcción del hardware y el compilador –Maximizar el rendimiento –Minimizar el costo y el consumo de energía
Almacenamiento de variables en hardware add $t1,$s6,$s7 A diferencia de los programas de alto nivel, en el hardware se cuenta con un número limitado de localidades de memoria para ubicar allí los operandos y resultados temporales de operaciones aritméticas La arquitectura MIPS cuenta con 32 de estas localidades de memoria, denominadas registros Cada registro en MIPS, tiene un tamaño o capacidad de 32 bits.
Almacenamiento de datos Los lenguajes de programación permiten tener estructuras que pueden contener muchos más datos o variables que los que se pueden guardar en 32 registros: ¿Cómo hace el computador para acceder y representar tal cantidad de datos? Los datos se mantienen en memoria Por lo tanto, se requieren instrucciones (Capacidades) para 1.Leer un dato desde memoria y guardarlo en un registro 2.Tomar un dato guardado en un registro y guardarlo en una localidad de memoria En MIPS, se pueden direccionar 2 30 palabras de memoria: Memory[0], Memory[4], Memory[8],..., Memory[ ]
Formato de instrucción R Las instrucciones aritméticas registro a registro, utilizan el formato de instrucción R. — op es el código de instrucción, y func especifica una operación aritmética particular. — rs, rt y rd son los dos registros fuentes y el registro destino Un ejemplo de una instrucción y su codificación es: add$s4, $t1, $t2 oprsrtrdshamtfunc 6 bits5 bits 6 bits
Formato de instrucción I Las instrucciones lw, sw y beq instructions utilizan el formato de instrucción I. — rt es el destino para lw, pero una fuente para beq y sw. — dirección es una constante, con signo, de 16 bits. Dos ejemplos: lw$t0, – 4($sp) sw$a0, 16($sp) oprsrtdirección 6 bits5 bits 16 bits
Para las instrucciones de salto, la constante no es una dirección, sino un desplazamiento de instrucción desde el contador de programa actual, hasta la dirección deseada. beq$at, $0, Etiq add$v1, $v0, $0 add$v1, $v1, $v1 jEtiq Etiq:add$v1, $v0, $v0 La dirección destino Etiq está tres instrucciones después de beq, por lo que la codificación de la instrucción de salto tendrá como campo de dirección. Las instrucciones tienen 4 bytes de largo, por lo que el desplazamiento real es de 12 bytes. Saltos oprsrtaddress
Arquitectura MIPS
El camino de datos final
Señales de control generales La unidad de control requiere 13 bits de entrada. –Seis bits del opcode de instrucción. –Seis bits del campo de instrucción func. –La salida Zero de la UAL. La unidad de control genera 10 bits de salida, correspondientes a las señales mencionadas en la lámina anterior. Leer dirección Memoria de Instrucciones Instrucción [31-0] Control I [ ] I [5 - 0] RegWrite ALUSrc ALUOp MemWrite MemRead MemToReg RegDst PCSrc Zero
Instrucciones aritméticas
Instrucciones lógicas
Instrucciones de transferencia de datos
Instrucciones de salto condicional
Instrucciones de salto incondicional
Ejemplo 2 Programa en C: int i = 0, j = 5; while (vector[i]==j) i+=1; Programa en ensamblador: li $s1,0 li $s2,5 # vector en $s6=0x While: sll $t1,$s1,2 add $t1,$t1,$s6 lw $t2,0($t1) bne $t2,$s2,Fin addi $s1,$s1,1 j While Fin:
Ejemplo 3 Programa en C: x = 0; for(int i=0;i<100;i++) { x = x+i; } Programa en ensamblador: li $s1,0 # i = 0 li $s2,0 # x = 0 For: slti $t0,$s1,100 beq $t0,$zero,Fin add $s2,$s2,$s1 addi $s1,$s1,1 j For Fin:
Tarea Realizar un programa en lenguaje ensamblador MIPS, que calcule el factorial de un número (De manera no recursiva). Realizar un programa en lenguaje ensamblador MIPS, que calcule la multiplicación de dos números a través de sumas sucesivas.
Ejemplo 4 Programa en C: int i, x = 8,f=1; for(i=2;i<=x;i++) { f = f * i; } Programa en ensamblador: li $s1,2 # i = 2 li $s2,8 # x = 8 li $t0,1 # f = 1 For: slt $t1,$s2,$s1 bne $t1,$zero,Fin mult $t0,$s1 mflo $t0 addi $s1,$s1,1 j For Fin:
Ejemplo 5 Programa en C: int a = 4, b = 5; int suma = a; for(int = 1; i<b; i++) { suma = suma + a; } Programa en ensamblador: li $s0,1 # i = 1 li $s1,4 # a = 4 li $s2,5 # b = 5 add $t0,$zero,$s1 For: slt $t1,$s0,$s2 bne $t1,$zero,Fin add $t0,$t0,$s1 addi $s0,$s0,1 j For Fin: