ARQUITECTURA DE COMPUTADORES
Semestre A-2009Clase 12
AGENDA
• 2do Examen Parcial: Martes 30/06/2009
• Arquitectura MIPS de un solo ciclo
• El lenguaje ensamblador MIPS
• Ejercicios
Computador → Máquina de estado
• Un computador es sólo una gran máquina de estados.– Los registros, memoria cache, memoria RAM y discos duros
guardan el estado.– El procesador se mantiene leyendo y actualizando el estado, de
acuerdo a las instrucciones de algún programa.
Estado
CPU
Memorias
• Resulta más sencillo utilizar dos memorias rápidas para almacenar datos e instrucciones de forma separada. A esta forma de distribución de la memoria se le conoce como Arquitectura Harvard.
• Debido a que se manejarán palabras de 32 bits, se podrán direccionar 230 palabras.
• Las lineas azules representan señales de control. MemRead y MemWrite deben colocarse en 1 si se va a leer o si se va a escribir a memoria, respectivamente.
Readaddress
Instructionmemory
Instruction[31-0]
Readaddress
Writeaddress
Writedata
Datamemory
Readdata
MemWrite
MemRead
Búsqueda de instrucción(fetching)
• El procesador se encuentra siempre en un lazo infinito, buscando instrucciones en memoria y ejecutándolas.
• El registro contador de programa o registro PC almacena la dirección de la instrucción en ejecución.
• Las instrucciones MIPS son todas de 4 bytes de largo: 32 bits. Es por ello, que el PC debe ser incrementado de 4 en 4 (Para leer la siguiente instrucción, en secuencia)
Leerdirección
Memoria deInstrucciones
Instrucción[31-0]
PC
Add
4
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
op rs rt rd shamt func
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
000000 01001 01010 10100 00000 100000
Registros y ALUs• Las instrucciones de formato de
instrucción R, deben acceder a los registros y a la UAL.
• Nuestro Archivo de registros almacena 32 valores de 32 bits. – Cada indicador de registro tiene 5 bits.– Se puede leer de dos registros al mismo
tiempo.—RegWrite es 1 si se va a escribir en un
registro
ALU
ALUOp
Leerregistro 1
Leerregistro 2
Escribirregistro
Escribirdata
Leerdata 2
Leerdata 1
Registros
RegWrite
ALUOp Función
000 and
001 or
010 add
110 sub
111 slt
Ejecución en el formato de instrucción R
1. Se lee una instrucción desde la memoria de instrucciones.
2. Los registros fuente, indicados por los campos rs y rt, se leen desde el archivo de registros.
3. La UAL realiza la operación correspondiente.
4. El resultado es guardado en el registro de destino, el cual es especificado por el campo rd de la instrucción.
Leerdirección
Memoria deInstrucciones
Instrucción[31-0]
Leerregistro 1
Leerregistro 2
Escribirregister
Escribirdata
Leerdata 2
Leerdata 1
Registros
RegWrite
I [25 - 21]
I [20 - 16]
I [15 - 11]
Resultado
ZeroALU
ALUOp
op rs rt rd shamt func
31 26 25 21 20 16 15 11 10 6 5 0
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)
op rs rt dirección
6 bits 5 bits 5 bits 16 bits
100011 11101 01000 1111 1111 1111 1100
101011 11101 00100 0000 0000 0001 0000
Acceso a datos de memoria• Para una instrucción como lw $t0, –4($sp), el registro base $sp es
sumado a la constante de extensión de signo para obtener la dirección de memoria final.
• Esto significa que la UAL debe aceptar: o un operando de registro para una instrucción aritmética, o un operando inmediato con signo extendido para las instrucciones lw y sw.
• Agregaremos un multiplexor, controlado por ALUSrc, para seleccionar un operando de registro (0) o un operando constante (1).
Leerdirección
Escribiraddress
Escribirdata
Memoriade Datos
Leerdata
MemWrite
MemRead
1
Mux
0
MemToRegLeerdirección
Memoria deInstrucciones
Instrucción[31-0]
I [15 - 0]
I [25 - 21]
I [20 - 16]
I [15 - 11]
0
Mux
1
RegDst
Leerregistro 1
Leerregistro 2
Escribirregistro
Escribirdata
Leerdata 2
Leerdata 1
Registros
RegWrite
Signoextend
0
Mux
1
ALUSrc
Resultado
ZeroALU
ALUOp
De memoria a registro• La entrada “Escribir data” del archivo de registros, tiene un
problema similar. Debe ser capaz de guardar, ya sea la salida de la UAL, en una instrucción R; o el dato de memoria para una instrucción lw.
• Añadiremos un multiplexor, controlado por MemToReg, para escoger entre guardar el resultado de la UAL (0) o el dato de salida de memoria (1) para los registros.
Leerdirección
Escribirdirección
Escribirdata
Memoriade Datos
Leerdata
MemWrite
MemRead
1
Mux
0
MemToRegLeerdirección
Memoria deInstrucciones
Instrucción[31-0]
I [15 - 0]
I [25 - 21]
I [20 - 16]
I [15 - 11]
0
Mux
1
RegDst
Leerregistro 1
Leerregistro 2
Escribirregistro
Escribirdata
Leerdata 2
Leerdata 1
Registros
RegWrite
Signoextend
0
Mux
1
ALUSrc
Resultado
ZeroALU
ALUOp
RegDst• Una molestia final es el registro destino de lw, el cual se encuentra
en rt, en lugar de en rd.
• Añadiremos un multiplexor adicional, controlado por RegDst, para seleccionar el registro destino, desde el campo de instrucción rt (0) o desde el campo rd (1).
op rs rt dirección
lw $rt, dirección($rs)
Leerdirección
Escribirdirección
Escribirdata
Memoriade Datos
Leerdata
MemWrite
MemRead
1
Mux
0
MemToRegLeerdirección
Memoria deInstrucciones
Instrucción[31-0]
I [15 - 0]
I [25 - 21]
I [20 - 16]
I [15 - 11]
0
Mux
1
RegDst
Leerregistro 1
Leerregistro 2
Escribirregistro
Escribirdata
Leerdata 2
Leerdata 1
Registros
RegWrite
Signoextend
0
Mux
1
ALUSrc
Resultado
ZeroALU
ALUOp
• 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, Etiqadd $v1, $v0, $0add $v1, $v1, $v1j Etiq
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á 0000 0000 0000 0011 como campo de dirección.
• Las instrucciones tienen 4 bytes de largo, por lo que el desplazamiento real es de 12 bytes.
Saltos
000100 00001 00000 0000 0000 0000 0011
op rs rt address
Pasos al ejecutar beq
1. Buscar la instrucción (Fetch) en memoria, como por ejemplo: beq $at, $0, desplazamiento
2. Leer los registros fuente, $at y $0, desde el archivo de registros.
3. Comparar los valores, restándolos en la UAL.4. Si la resta es 0, Los operandos fuente eran
iguales y se debe cargar en el PC la dirección destino: PC + 4 + (desplazamiento x 4).
5. Si la resta no es 0, no se debe ejecutar el salto, y el PC sólo debe ser actualizado a PC + 4 para buscar la siguiente instrucción en secuencia.
Hardware para saltosNecesitamos un segundo sumador, ya que la UAL está ocupada haciendo la
resta para beq.
Multiplicación constante
por 4, para obtener el desplazamiento
PCSrc = 1 # salto a
PC+4+(offset4) PCSrc = 0 continúa a
PC+4.4
Shiftleft 2
PCAdd
Add
0
Mux
1
PCSrc
Leerdirección
Escribirdirección
Escribirdata
Memoriade Datos
Leerdata
MemWrite
MemRead
1
Mux
0
MemToRegLeerdirección
Memoria deInstrucciones
Instruction[31-0]
I [15 - 0]
I [25 - 21]
I [20 - 16]
I [15 - 11]
0
Mux
1
RegDst
Leerregistro 1
Leerregistro 2
Escribirregistro
Escribirdata
Leerdata 2
Leerdata 1
Registros
RegWrite
Signoextend
0
Mux
1
ALUSrc
Resultado
ZeroALU
ALUOp
El camino de datos final
4
Shiftleft 2
PCAdd
Add
0
Mux
1
PCSrc
Leerdirección
Escribirdirección
Escribirdata
Memoriade Datos
Leerdata
MemWrite
MemRead
1
Mux
0
MemToRegLeerdirección
Memoria deInstrucciones
Instrucción[31-0]
I [15 - 0]
I [25 - 21]
I [20 - 16]
I [15 - 11]
0
Mux
1
RegDst
Leerregistro 1
Leerregistro 2
Escribirregistro
Escribirdata
Leerdata 2
Leerdata 1
Registros
RegWrite
Signoextend
0
Mux
1
ALUSrc
Resultado
ZeroALU
ALUOp
Control
• La unidad de control es la responsable de darle valores a las señales de control para que cada instrucción se ejecute correctamente.– La entrada de la unidad de control son los 32 bits de
la instrucción.– Su salida son los valores para las señales de control
del camino de datos.
• La mayoría de las señales pueden ser generadas a partir, únicamente, del opcode, sin requerir el resto de bits de la instrucción.
Tabla de señales de control
• sw y beq son las únicas instrucciones que no escriben en registros.• lw y sw son las únicas instrucciones que utilizan un campo
constante. Ellas también dependen de la UAL para calcular la dirección de memoria efectiva.
• ALUOp para el formato R depende del campo de instrucciones func.
• La señal de control PCSrc (no listada) debe ser establecida si la instrucción es beq y la salida Zero de la UAL es 1.
Operacion RegDst RegWrite ALUSrc ALUOp MemWrite MemRead MemToReg
add 1 1 0 010 0 0 0
sub 1 1 0 110 0 0 0
and 1 1 0 000 0 0 0
or 1 1 0 001 0 0 0
slt 1 1 0 111 0 0 0
lw 0 1 1 010 0 1 1
sw X 0 1 010 1 0 X
beq X 0 0 110 0 0 X
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.
Leerdirección
Memoria deInstrucciones
Instrucción[31-0]
Control
I [31 - 26]
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 1
Programa en C:int f, g = 3, h = 1;
int i = 4, j = 4;
if (i==j)
f=g+h;
else
f=g-h;
Programa en ensamblador:addi $s1,$zero,3
addi $s2,$zero,1
addi $s3,$zero,4
addi $s4,$zero,4
bne $s3,$s4,Else
add $t0,$s1,$s2
j Fin
Else:sub $t0,$s1,$s2
Fin:
Ejemplo 2
Programa en C:int i = 0, j = 5;
while (vector[i]==j)
i+=1;
Programa en ensamblador:li $s1,0
li $s2,0
# vector en $s6=0x10010040
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.
Top Related