Cap3.2 Mips Como Estandar Isa
Cap3.2 Mips Como Estandar Isa
Cap3.2 Mips Como Estandar Isa
computadores
Depto. de Informática y Computación
Segundo semestre 2019
● Código C:
f = (g + h) - (i + j);
● Código MIPS compilado:
● Código C:
f = (g + h) - (i + j);
○ f, …, j in $s0, …, $s4
● Código MIPS compilado :
Ultimo byte
Primer byte Bytes
Endian (dirección más Notas
(dirección más baja) intermedio
alta)
Similar a como se
big más significativo ... menos significativo escriben números
en un papel
● Código C:
g = h + A[8];
○ g en $s1, h en $s2, dirección base de A en $s3
● Código MIPS compilado:
○ Índice 8 requiere offset de 32
■ 4 bytes por palabra
● Código :
A[12] = h + A[8];
○ h en $s2, dirección base de A en $s3
● Código MIPS compilado :
● El compilador debe utilizar los registros para las variables tanto como sea posible
○ No se puede escribir en él
● Útil para operaciones frecuentes
Rango: 0 a +2n – 1
Ejemplo:
0000 0000 0000 0000 0000 0000 0000 10112
● Complementar y agregar 1
○ Complementar significa 1 → 0, 0 → 1
• Ejemplo: negar +2
● Instrucciones de MIPS
○ Regularidad!
● Campos de la Instrucción
0 17 18 8 0 32
000000100011001001000000001000002 = 0232402016
Hexadecimal
● Base 16
○ Representación compacta de un conjunto de bits
○ 4 bits por dígito hexadecimal
0 0000 4 0100 8 1000 c 1100
1 0001 5 0101 9 1001 d 1101
2 0010 6 0110 a 1010 e 1110
3 0011 7 0111 b 1011 f 1111
• Ejemplo: eca8 6420
• 1110 1100 1010 1000 0110 0100 0010 0000
Instrucciones Formato I de MIPS
op rs rt constante o dirección
6 bits 5 bits 5 bits 16 bits
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
● Código C:
if (i==j) f = g+h;
else f = g-h;
○ f, g, … en $s0, $s1, …
● Código MIPS compilado:
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
El Assembler calcula las direcciones
Exit: …
Compilación de Declaración Loop
● Código C:
while (save[i] == k) i += 1;
○ i en $s3, k en $s5, dirección a guardar en $s6
● Código MIPS compilado:
Loop: sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit: …
Bloques Básicos
● Pasos requeridos
● Código C:
○ Resultado en $v0
Ejemplo Procedimiento “Leaf”
● Código MIPS:
leaf_example:
addi $sp, $sp, -4
sw $s0, 0($sp) Guarda $s0 en el stack
● Código C:
int fact (int n)
{
if (n < 1) return (1);
else return (n * fact(n - 1));
}
○ Argumento n en $a0
○ Resultado en $v0
Ejemplo Procedimientos “Non-Leaf”
● Código MIPS:
fact:
addi $sp, $sp, -8 # ajusta stack para 2 ítems
sw $ra, 4($sp) # guarda dirección de retorno
sw $a0, 0($sp) # guarda argumento
slti $t0, $a0, 1 # testea para n < 1
beq $t0, $zero, L1 # salta a L1 si n >= 1
addi $v0, $zero, 1 # si n < 1, resultado es 1
addi $sp, $sp, 8 # saca 2 ítems del stack
jr $ra # y retorna
L1: addi $a0, $a0, -1 # si n >= 1, decrementa n
jal fact # llamada recursiva para (n-1)
lw $a0, 0($sp) # recupera n original
lw $ra, 4($sp) # y dirección de retorno
addi $sp, $sp, 8 # saca 2 ítems del stack
mul $v0, $a0, $v0 # multiplica para obtener
# resultado
jr $ra # y retorna
Datos Locales en el Stack
● Código C (simple):
○ “String” terminado en “Null”
void strcpy (char x[], char y[])
{ int i;
i = 0;
while ((x[i]=y[i])!='\0')
i += 1;
}
○ Direcciones de x, y en $a0, $a1
○ i en $s0
Ejemplo Copia de “String”
● Código MIPS:
strcpy:
addi $sp, $sp, -4 # ajusta stack para 1 ítem
sw $s0, 0($sp) # guarda $s0
add $s0, $zero, $zero # i = 0
L1: add $t1, $s0, $a1 # dirección de y[i] en $t1
lbu $t2, 0($t1) # $t2 = y[i]
add $t3, $s0, $a0 # dirección de x[i] en $t3
sb $t2, 0($t3) # x[i] = y[i]
beq $t2, $zero, L2 # salir del loop si y[i] == 0
lhi $s0, 61 0000 0000 0011 1101 0000 0000 0000 0000
ori $s0, $s0, 2304 0000 0000 0011 1101 0000 1001 0000 0000
Direccionamiento Salto Condicional
op rs rt constante o dirección
6 bits 5 bits 5 bits 16 bits
• Direccionamiento relativo al PC
• Dirección objetivo = PC + offset × 4
• PC ya incrementado por 4
Direccionamiento Salto Incondicional
op dirección
6 bits 26 bits
● Si el salto condicional esta muy lejos para ser codificado con un offset de 16 bits, el
assembler rescribe el código
● Ejemplo:
beq $s0,$s1, L1
bne $s0,$s1, L2
j L1
L2: …
Resumen Modos de Direccionamiento
MARS 4.5
“Static linking”
Pseudo Instrucciones de Assembler
● La mayoría de las instrucciones de assembler representan una a una instrucciones de
máquina
● Pseudo instrucciones: ficción de la imaginación del assembler
Tabla direcciones
indirectas
Código Linker/loader
Código dinámicamente
mapeado
Ejecución de una Aplicación Java
Conjunto instrucciones
simples portables para
JVM
Compila
bytecodes de Interpreta
métodos “hot” bytecodes
en código nativo
para maquina
anfitriona
Ejemplo Sort en C
● Ilustra el uso de instrucciones de lenguaje assembly para una parte de la función sort
en C
● Procedimiento Swap (“leaf”)
void swap(int v[ ], int k)
{
int temp;
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
}
○ v en $a0, k en $a1, temp en $t0
El procedimiento Swap
ARM MIPS
Fecha anunciado 1985 1985
Tamano instrucciones 32 bits 32 bits
Espacio direcciones 32-bit flat 32-bit flat
Alineamiento de datos Alineado Alineado
Modos direccionamiento de datos 9 3
Registros 15 × 32-bit 31 × 32-bit
Entrada/salida Memory Memory
mapped mapped
Comparar y Saltos Condicionales en ARM
● Evolución adicional…
○ i486 (1989): pipelined, caches en el chip y FPU
■ Competidores compatibles: AMD, Cyrix, …
○ Pentium (1993): superscalar, datapath de 64-bit
■ Ultimas versiones agregaron instrucciones MMX (Multi-Media eXtension)
■ El famoso problema FDIV
○ Pentium Pro (1995), Pentium II (1997)
■ Nuevas micro arquitecturas (véase Colwell, The Pentium Chronicles)
○ Pentium III (1999)
■ Se agrega SSE (Streaming SIMD Extensions) y registros asociados
○ Pentium 4 (2001)
■ Nueva micro arquitectura
■ Se agregan instrucciones SSE2
El ISA x86 de Intel
● Y más aún…
○ AMD64 (2003): arquitectura extendida a 64 bits
○ EM64T – Tecnología 64 bits Memoria Extendida (2004)
■ AMD64 adoptado por Intel (con refinamientos)
■ Se agregan instrucciones SSE3
○ Núcleo (“Core”) Intel (2006)
■ Added SSE4 instructions, virtual machine support
○ AMD64 (anunciado el 2007): instrucciones SSE5
■ Intel declina seguirlo, en vez de eso…
○ Advanced Vector Extension (anunciado el 2008)
■ Registros SSE más largos, mas instrucciones
● Si Intel no se extendía con la compatibilidad, sus competidores lo harían!
○ Elegancia técnica ≠ éxito en el mercado
Flynn’s Taxonomy (1966)
Conjunto
instrucciones x86
Errores
● Principios de diseño
1. La simplicidad favorece la regularidad
2. El diseño pequeño es mas rápido
3. Hacer mas rápido el caso común
4. Buenos diseños demandan buenos compromisos
● Capas de software/hardware
○ Compilador, assembler, hardware
● MIPS: típico de los ISAs RISC
○ c.f. x86
Comentarios de Conclusión