Instrucciones Arquitectuar
Instrucciones Arquitectuar
Instrucciones Arquitectuar
para computadora
Instrucciones: Lenguaje de la
computadora
Revisado y ampliado de las diapositivas
originales proporcionadas por MKP
Jeraquía de Lenguajes
Arquitectura
Las computadoras
modernas utilizan
la arquitectura Von
Neumann (también
llamada concepto
de programa
almacenado)
Fue derivado por
Von Neumann
(obviamente), John
Mauchly y Presper
Eckert.
3
La realidad ARM
Introducción
Jerarquía de lenguajes de computadoras:
1. Aplicación con Lenguaje específico
(compilador Matlab)
2. Lenguaje de programación de alto nivel
(C ++, Java)
3. Lenguaje ensamblador (depende de la máquina)
4. Lenguaje de máquina (depende de la máquina)
5
Introducción (Cont.)
menor costo
Ejemplo aritmético
Código C:
f = (g + h) - (i + j);
Rango: 0 a +2n – 1
Ejemplo
Números de registro
$t0 – $t7 son reg’s 8 – 15
$t8 – $t9 son reg’s 24 – 25
$s0 – $s7 son reg’s 16 – 23
Instrucciones de formato MIPS R
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
Campos de instrucción
op: código de operación (código de operación)
rs: número de registro de la primera fuente
operación)
Ejemplo de formato R
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
0 17 18 8 0 32
000000100011001001000000001000002 = 0232402016
Hexadecimal
Base 16
Representación compacta de cadenas de bits
4 bits por dígito hexadecimal
L1
Compilación de declaración if
Código C:
if (i==j) f = g+h;
else f = g-h;
f, g, … in $s0, $s1, …
Código MIPS compilado:
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: … Ensamblador calcula direcciones
Compilación de declaración de bucle
Código C:
while (save[i] == k) i += 1;
i en $s3, k en $s5, dirección se guarda 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
Un bloque básico es una secuencia de
instrucciones con
Sin bifurcaciones incrustadas (excepto al final)
Sin objetivos de destino (excepto al principio)
variable
Operaciones Byte / Halfword
Podría usar operaciones bit a bit
Byte / Halfword MIPS carga / almacenamiento
i en $s0
Ejemplo de copia de cadena
Código MIPS
strcpy:
addi $sp, $sp, -4 # ajustar la pila para 1 item
sw $s0, 0($sp) # salvar $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 # sale del bucle si y[i] == 0
addi $s0, $s0, 1 # i = i + 1
j L1 # siguiente iteración del bucle
L2: lw $s0, 0($sp) # Restaurar guardado $s0
addi $sp, $sp, 4 # sacar 1 artículo de la pila
jr $ra # y volver
Constantes de 32 bits
La mayoría de las constantes son pequeñas
16 bits es suficiente inmediata
Para la constante ocasional de 32 bits
lui rt, constante
Copia constante de 16 bits a 16 bits izquierdos de rt
Borra los 16 bits de la derecha de rt a 0
lhi $s0, 61 0000 0000 0111 1101 0000 0000 0000 0000
ori $s0, $s0, 2304 0000 0000 0111 1101 0000 1001 0000 0000
Direccionamiento de rama
Las instrucciones de rama especifican
Código de operación, dos registros, dirección de destino
La mayoría de los objetivos de las ramificaciones son ramas cerca
Hacia adelante o hacia atrás
op rs rt constante o dirección
6 bits 5 bits 5 bits 16 bits
Direccionamiento relativo a PC
Dirección de destino = PC + desplazamiento × 4
PC ya incrementado en 4 en este momento
Direccionamiento de salto
Los destinos Jump (j y jal) pueden estar en
cualquier parte del segmento de texto
Codificar la dirección completa en la instrucción
op dirección
6 bits 26 bits
beq $s0,$s1, L1
↓
bne $s0,$s1, L2
j L1
L2: …
Resumen del modo de direccionamiento
Sincronización
Dos procesadores que comparten un área de memoria
P1 escribe, luego P2 lee
Carrera de datos si P1 y P2 no se sincronizan
El resultado depende del orden de los accesos
Se requiere soporte de hardware
Operación de memoria atómica de lectura / escritura
No se permite ningún otro acceso a la ubicación entre
lectura y escritura
Podría ser una sola instrucción
Por ejemplo, intercambio atómico de registro ↔ memoria
O un par atómico de instrucciones
Sincronización en MIPS
Carga vinculada: ll rt, offset(rs)
Guardado condicional: sc rt, offset(rs)
Tiene éxito si la ubicación no ha cambiado desde el ll
Devuelve 1 en rt
Falla si se cambia la ubicación
Devuelve 0 en rt
Enlace estático
Pseudoinstrucciones de ensamblador
La mayoría de las instrucciones del ensamblador
representan instrucciones de la máquina uno a uno
biblioteca
Enlace perezoso
Mesa de Indirección
Stub: carga el ID de la
rutina, salta al
enlazador / cargador
Código mapeado
dinámicamente
Inicio de aplicaciones Java
Conjunto de
instrucciones portátil
simple para la JVM
Compila códigos
Interprete
de bytecodes
"calientes" en
bytecodes
código nativo para
la máquina host
Ejemplo de ordenación en C
Ilustra el uso de instrucciones de montaje
para una función de clasificación de burbujas C
Procedimiento de intercambio (hoja)
Registro Registro
Registro Immediato
Registro Memoria
Memoria Registro
Memoria Immediato
modifican la operación
Longitud del operando,
repetición, bloqueo, …
Implementación de IA-32
El conjunto de instrucciones complejas
dificulta la implementación
El hardware traduce las instrucciones en
económicamente viable
Rendimiento comparable al RISC
Los compiladores evitan instrucciones
complejas
Falacias
Instrucción poderosa ⇒ mayor rendimiento
Se requieren menos instrucciones
Pero las instrucciones complejas son difíciles de implementar
Puede ralentizar todas las instrucciones, incluidas las sencillas
Los compiladores son buenos para hacer código rápido a partir
de instrucciones simples
Utilice código de ensamblaje para un alto rendimiento
Pero los compiladores modernos son mejores para tratar con
procesadores modernos
Más líneas de código ⇒ más errores y menos
productividad
Falacias
Compatibilidad con versiones anteriores ⇒ el
conjunto de instrucciones no cambia
Pero acumulan más instrucciones
conjunto de instrucciones
x86
Trampas
Las palabras secuenciales no están en
direcciones secuenciales
¡Incrementar en 4, no en 1!
Mantener un puntero a una variable
automática después de que regrese el
procedimiento
por ejemplo, devolviendo el puntero a través de un
argumento
El puntero se vuelve inválido cuando se abre la
pila
Observaciones finales
Criterios de diseño
1. La sencillez favorece la regularidad
2. Cuanto más pequeño es más rápido
3. Acelere el caso común
4. Un buen diseño exige buenos compromisos
Capas de software / hardware
Compilador, ensamblador, hardware
MIPS: típico de RISC ISA
c.f. x86
Observaciones finales
Medir las ejecuciones de instrucciones MIPS
en programas de referencia
Considere hacer que el caso común sea rápido
Considere compromisos