Documentos de Académico
Documentos de Profesional
Documentos de Cultura
426
1
Arquitectura de conjunto de instrucciones
❖ Instruction Set Architecture (ISA)!
❖ Comúnmente conocido como “lenguaje de
máquina”!
❖ Define la interfaz entre el hardware y el
software!
❖ Compatibilidad binaria!
❖ No son solamente las instrucciones del
lenguaje!
❖ Registros internos! ISA soporta el software!
❖ Organización de la memoria!
!
Hardware soporta ISA durante muchas
❖ Tipo y formato de datos! generaciones de la arquitectura!
!
❖ Codificación de instrucciones! Ej. Intel IA32 (x86), ARM, MIPS.
❖ Excepciones
Universidad de Concepción, Departamento de Ingeniería Eléctrica 2 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Arquitectura de conjunto de instrucciones
❖ Definición de la arquitectura fuertemente afectada por la tecnología!
❖ ¿Cuántos registros internos puede alojar el procesador? ¿Cuánta memoria puede
direccionar un programa? ¿Qué capacidad tienen los compiladores de generar código
eficiente?!
❖ “Brecha semántica”!
❖ Diferencia entre nivel de abstracción de lenguaje de alto nivel y del lenguaje de
máquina. Arquitecturas antiguas favorecían cerrar la brecha con un lenguaje de máquina
con instrucciones “poderosas”!
❖ Ej. VAX: instrucciones para multiplicar polinomios!
❖ Arquitectura Intel (IA32) definida en los ‘70 posee pocos registros internos, operandos en
memoria, códigos de instrucción compactos!
❖ Filosofía Reduced Instruction Set Computer (RISC) en los ’80 favorece más registros,
instrucciones sencillas y pocas, operandos en registro e instrucciones load/store
Universidad de Concepción, Departamento de Ingeniería Eléctrica 3 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Compilando un programa
Programa
en C
compilador
Assembly
ensamblador
Objeto Biblioteca
linker
linker
Ejecutable
loader
Memoria
Universidad de Concepción, Departamento de Ingeniería Eléctrica 4 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejecutando el programa
Programa en memoria
Universidad de Concepción, Departamento de Ingeniería Eléctrica 5 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejecutando el programa
Universidad de Concepción, Departamento de Ingeniería Eléctrica 6 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejecutando el programa
Universidad de Concepción, Departamento de Ingeniería Eléctrica 7 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejecutando el programa
Universidad de Concepción, Departamento de Ingeniería Eléctrica 8 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Arquitectura MIPS
❖ Buen ejemplo de arquitectura RISC,
creada comercialmente en los ’80 a
partir de proyecto de investigación
en Stanford!
❖ No se usa mucho en computadores
hoy, pero común en procesadores
embebidos!
❖ Más limpia y fácil de entender que
Intel x86!
❖ Muchas arquitecturas modernas en
uso son similares!
❖ Ej. IBM POWER, PowerPC, ARM
Universidad de Concepción, Departamento de Ingeniería Eléctrica 9 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Arquitectura MIPS de 32 bits
❖ Registros de propósito general!
❖ 32 registros enteros de 32 bits (1 palabra).
Almacenan datos y direcciones!
❖ Registros específicos! MIPS
CPU Coprocesador 1
❖ PC: contador de programa. HI, LO: $0 $f0
resultados de multiplicación y división! $1 $f1
. .
ALU Aritmética
❖ Dos coprocesadores! .
.
. FP
.
$31
❖ Coprocesador 0: Excepciones y memoria $f31
instrucciones! BadVAddress
EPC
❖ Qué significa que MIPS32 sea una arquitectura
de “32 bits”?!
Memoria
❖ Instrucciones tienen un largo de 32 bits!
❖ Instrucciones operan sobre datos de 32 bits!
❖ Direcciones de memoria son de 32 bits
Universidad de Concepción, Departamento de Ingeniería Eléctrica 10 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Mapa de memoria
❖ En modo usuario: programas regulares!
❖ Texto: Código del programa! 0xFFFF FFFF
Reservado S. O.
❖ Datos: Variables globales y memoria 0x7FFF FFFF
Segmento stack
dinámica!
❖ Stack: Datos de funciones o
procedimientos activos!
Segmento datos
❖ En modo supervisor: sistema operativo! 0x1000 0000
Segmento
de texto
❖ Primeros 256KB, últimos 2GB!
0x0040 0000
❖ Datos y código del sistema Reservado S. O.
operativo!
0x0000 0000
❖ Interfaz a dispositivos de entrada/
salida
Universidad de Concepción, Departamento de Ingeniería Eléctrica 11 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Almacenamiento de datos en memoria
❖ Registros de dirección indican posiciones de bytes!
❖ Normalmente acceso a datos es alineado!
❖ Datos e instrucciones de 32 bits almacenados a partir de direcciones múltiplos de 4!
❖ Datos de 16 bits almacenados a partir de direcciones múltiplos de 2!
❖ Puede ser configurado en modo “big endian” (lo normal) o “little endian”
Universidad de Concepción, Departamento de Ingeniería Eléctrica 12 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Convención de uso de registros MIPS
$0 zero constante cero $16 s0 variables locales
Deben almacenarse antes de
$1 at reservado para ensamblador
sobreescribir y restaurarse antes
retornar
$2 v0 evaluación de expresiones y $23 s7
$3 v1 resultados de funciones
$24 t8 temporales (adicionales)
$25 t9
$4 a0 argumentos a funciones
$5 a1
$6 a2 $26 k0 reservados para sistema operativo
$7 a3 $27 k1
$8 t0 variables temporales
Pueden sobreescribirse $28 gp puntero a variables globales
$29 sp puntero a tope del stack
$30 fp puntero a base del stack
$15 t7
Universidad de Concepción, Departamento de Ingeniería Eléctrica 13 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
¿Por qué usar registros y no sólo memoria?
❖ Ventajas de usar registros!
❖ Velocidad de acceso: banco de registros es pequeño, rápido en VLSI!
❖ Versatilidad de acceso: como banco de registros es pequeño, acceso es más poderoso!
❖ Múltiples puertas de lectura y escritura. Puede al menos leerse dos registros y
escribir un tercero simultáneamente!
❖ Compilador puede realizar optimizaciones más agresivas con datos en registros!
❖ Desventajas!
❖ Son pocos registros, programa necesita acceso a más almacenamiento!
❖ Necesario transferir datos entre registros y memoria!
❖ Compilador debe planificar cuidadosamente uso de registros para minimizar
accesos a memoria
Universidad de Concepción, Departamento de Ingeniería Eléctrica 14 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones assembly
❖ Instrucciones assembly ejecutan un conjunto reducido de operaciones simples usado un
conjunto limitado de operados!
❖ En MIPS, operandos son siempre registros o constantes de 16 bits. Ejemplos:!
❖ add $s0, $s5, $s2 #suma contenido de $s5 y $s2 y almacena en $s0!
❖ addi $s0, $s5, 25 #suma $s5 y la constante 25 y almacena en $s0!
❖ Excepción: instrucciones load y store transfieren datos de memoria a registro y
viceversa!
❖ Sintaxis de instrucciones es rígida. !
❖ Ejemplos: 3 operandos: registro destino y dos registros fuente; o registro destino,
registro fuente y constante. Regularidad simplifica el hardware y el compilador!
❖ Imprimir resumen de ISA MIPS (MIPS_Green_Sheet.pdf). Detalles en manuales MIPS
también en InfoDA
Universidad de Concepción, Departamento de Ingeniería Eléctrica 15 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Suma y resta de enteros
Suma de variables en assembly: add! comentario
!
Ejemplo:! ! add $s0, $s1, $s2! ! # en MIPS!
Equivalente a:! a = b + c; ! ! ! // en C!
!
Compilador asoció registros $s0, $s1 y $s2 a variables a, b y c
Universidad de Concepción, Departamento de Ingeniería Eléctrica 16 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Suma y resta de enteros
Suma de una variable y una constante en assembly: addi!
Constante es “operando inmediato” porque su valor está incluido en la instrucción!
Por lo mismo, tamaño de la constante restringido a 16 bits. Se extiende a 32 bits
repitiendo el bit de signo hacia la izquierda!
!
Ejemplo:! ! addi $s0, $s1, 25! ! # en MIPS!
Equivalente a:! a = b + 25; ! ! ! // en C!
!
Compilador asoció registros $s0 y $s1 a variables a y b
Resta de una variable y una constante en assembly: no existe!!!!
Por qué? Innecesario, puede usarse suma con valor inverso de la constante. Simplificar
la ISA simplifica el hardware y el trabajo del compilador!
!
Ejemplo:! ! addi $s3, $s4, -120! ! # en MIPS!
Equivalente a:! f = g - 120; ! ! ! // en C!
!
Compilador asoció registros $s3 y $s4 a variables f y g
Universidad de Concepción, Departamento de Ingeniería Eléctrica 17 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Suma con/sin signo
¿Cuánto es 120+120 en aritmética de 8 bits?
En aritmética sin signo:!
120 —> 0b01111000!
0b01111000 + 0b01111000 = 0b11110000!
0b11110000 —> 240 OK!!!
excede el código.!
❖ addu y addiu hacen exactamente la misma operación, pero no generan excepción!
Universidad de Concepción, Departamento de Ingeniería Eléctrica 18 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Suma y resta de enteros
Cómo traducimos expresiones más complejas?!
Si expresión tiene más de dos operados origen, usar temporales!
!
Ejemplo:! ! a = b - c + d - 87;! ! // en C!
Universidad de Concepción, Departamento de Ingeniería Eléctrica 19 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
El registro $zero
❖ La ISA define que el registro $zero siempre contiene el valor “cero”!
❖ Cualquier asignación a $zero no tiene efecto!
❖ Útil para sintetizar algunas instrucciones a partir de instrucciones aritméticas
existentes!
❖ Ejemplos
a = b;! ! ! ! ! // En C!
add $s0, $s1, $zero! ! # En MIPS, a y b asignadas a $s0 y $s1
a = 25;! ! ! ! ! // En C!
addi $s0, $zero, 25! ! # En MIPS, a asignada a $s0
;! ! ! ! ! ! // En C!
add $zero, $zero, $zero! # En MIPS. Esta instrucción se llama “nop” en otras ISA
Universidad de Concepción, Departamento de Ingeniería Eléctrica 20 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Multiplicación y división
❖ Resultado de multiplicación y división entera es de 64 bits!!!
❖ El producto de dos números de 32 bits usa 64 bits!
❖ La división de dos números de 32 bits genera un cuociente y un resto, ambos de 32 bits!
❖ Resultados se almacenan en registros HI y LO. Instrucciones mfhi, mflo, mthi, mtlo
transfieren datos entre registros generales y registros HI y LO
a * b;! ! ! ! // En C!
mult $s0, $s1! ! ! # mitad más significativa en HI, menos significativa en LO
c = a/b;! ! ! ! // En C!
d = a%b!
div $s0, $s1! ! ! # cuociente en LO, resto en HI!
mflo $s2!
mfhi $s3
c = a*b;! ! ! ! // En C!
mul $s2, $s0, $s1! ! # mitad menos significativa en LO, más significativa se pierde
También existe multu y divu (no es lo mismo que mult y div). No existe multi ni divi
Universidad de Concepción, Departamento de Ingeniería Eléctrica 21 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo
❖ Generar código assembly para la siguiente expresión en C. Asuma que
todas las variables son de tipo “int”
a = (a + 4) * (b + 3) - (c - 8)/126;
Universidad de Concepción, Departamento de Ingeniería Eléctrica 22 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones lógicas
❖ Tratan a contenido de registros como vector de bits en vez de números!
❖ Usadas para!
❖ Manipular bits individuales (máscaras)!
❖ Interacción con variables lógicas externas en microcontroladores!
❖ Imágenes y códigos!
❖ Compresión de datos!
❖ Simplificar operaciones aritméticas!
❖ Ej. Multiplicar por potencia de dos es equivalente a desplazar
operando a la izquierda
Universidad de Concepción, Departamento de Ingeniería Eléctrica 23 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones lógicas
and $t1, $t2, $t3 00110110 $t2 or $t1, $t2, $t3 00110110 $t2
xor $t1, $t2, $t3 00110110 $t2 andi $t1, $t2, 10 00110110 $t2
Universidad de Concepción, Departamento de Ingeniería Eléctrica 24 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Desplazamientos de bits
sll $t1, $t2, 3 00000111 $t2 (7) srl $t1, $t2, 3 10111101 $t2 (189) (-67)
sra $t1, $t2, 3 10111101 $t2 (-67) sra $t1, $t2, 3 00111101 $t2 (61)
!n "
“Equivalente” a división entera con signo. !# 2m "$
Universidad de Concepción, Departamento de Ingeniería Eléctrica 25 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejercicios
Universidad de Concepción, Departamento de Ingeniería Eléctrica 26 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones de transferencia de datos
❖ Instrucciones aritméticas y lógicas operan con datos en registros!
❖ ¿Pero cómo hacemos llegar los datos a un registro?!
❖ Instrucción de transferencia de datos permite copiar un dato a un registro. Necesita
especificar registro (ej. $t0), y dato!
❖ Modo de direccionamiento indica cómo se especifica el dato. Algunos ya los hemos visto:!
❖ Inmediato: valor del dato en instrucción!
❖ ori $t0, $zero, 125 # (li $t0, 125)!
❖ Registro directo: valor del dato en un registro indicado en instrucción!
❖ ori $t0, $zero, $t8 # (move $t0, $t8)!
❖ En los otros modos de direccionamiento, el dato está en memoria. Cómo especificar en
qué dirección?
Universidad de Concepción, Departamento de Ingeniería Eléctrica 27 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones de acceso a memoria en MIPS
❖ Load: Transfiere dato de memoria a registro.!
❖ lw copia una palabra de 32b de memoria a registro.!
❖ Store: Transfiere dato de registro a memoria.!
❖ sw copia una palabra de 32b de registro a memoria!
❖ Modo de direccionamiento único: Base más desplazamiento!
❖ Dirección de memoria se especifica como contenido de un registro sumado a
un desplazamiento constante con signo de 16 bits.!
❖ Desplazamiento ≠ 0 usado para accesar arreglos o estructuras
lw $t0, 0($s2) # $t0 <— M[$s2 + 0]
lw $t1, 0($t0)
lw $t2, 4($t0)
Universidad de Concepción, Departamento de Ingeniería Eléctrica 29 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
sw: escritura en memoria
Memoria
1000
1004
$t0 1008 1008 245
100
+4 1012 1208
25
$t1 245 1016
1020
$t2 1208 1024
sw $t1, 0($t0)
sw $t2, 4($t0)
Universidad de Concepción, Departamento de Ingeniería Eléctrica 30 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Otras instrucciones load y store
sw $t3, 500($t2) # Mem[500+$t2] ← $t3. Almacena 32b
sh $t3, 500($t2) # Mem[500+$t2] ← $t3. Almacena 16b
sb $t3, 500($t2) # Mem[500+$t2] ← $t3. Almacena 8b
!
lw $t3, 500($t2) # $t3 ← Mem[500+$t2]. Carga 32b
lh $t3, 500($t2) # $t3 ← Mem[500+$t2]. Carga 16b
lhu $t3, 500($t2) # $t3 ← Mem[500+$t2]. Carga 16b sin signo
lb $t3, 500($t2) # $t3 ← Mem[500+$t2]. Carga 8b
lbu $t3, 500($t2) # $t3 ← Mem[500+$t2]. Carga 8b sin signo
lui $t3, 4097 # $t331…16 ← 409716b. Carga constante de 16b en
# mitad más significativa de registro, escribe ceros en
# mitad menos significativa
Universidad de Concepción, Departamento de Ingeniería Eléctrica 31 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Pseudoinstrucciones
❖ Algunas instrucciones comunes en otros ISA pueden implementarse a partir de
instrucciones existentes en el ISA de MIPS!
❖ Algunos de estos casos son tan comunes que el ensamblador permite escribirlas
como si fueran instrucciones, y las traduce a instrucciones del ISA (usando a veces el
registro $at)!
❖ “Pseudoinstrucciones”, porque pueden usarse en assembly, pero no existen en el
lenguaje de máquina (binario)
move $t4, $t5 # $t4 ← $t5
# or $t4, $zero, $t5
!
li $t4, 100 # $t4 ← 100
# ori $t4, $zero, 100
!
la $t4, LABEL # $t4 ← LABEL LABEL: Texto que representa una constante en el
# lui $t4, LABEL16bsuperiores programa. Puede ser un número o una dirección
# ori $t4, $t4, LABEL16binferiores de memoria.
!
mul $t4, $t5, 10 # $t4 ← $t5 x 10
# ori $at, $zero, 10
# mul $t4, $t5, $at
Universidad de Concepción, Departamento de Ingeniería Eléctrica 32 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo # Dirección de memoria de ‘a’ en rótulo DIR_A
# Dirección de memoria de ‘b’ en rótulo DIR_B
# Dirección de memoria ‘acum’ en rótulo DIR_ACUM
!
la $t6, DIR_A # cargar dirección de a
la $t7, DIR_B # cargar dirección de b
!
lw $t0, 0($t6) # leer a
lw $t1, 0($t7) # leer b
!
mult $t2, $t0, $t1 # t2 = a * b
int a, b, acum; !
… la $t8, DIR_ACUM # cargar dirección de acum
lw $t3, 0($t8) # leer acum
acum = acum + a * b; !
add $t3, $t3, $t2 # $t3 = acum + a * b
sw $t3, 0($t8) # guardar acum
a
Memoria
1000 10 DIR_A
1004
b $t6 1000 $t0 10 $t3 70
50
1008
1012 2 DIR_B
$t7 1012 $t1 2
1016
1020
$t8 1024 $t2 20
1024 70
50 DIR_ACUM
acum
Universidad de Concepción, Departamento de Ingeniería Eléctrica 33 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo
# Dirección de memoria de ‘c1’ en rótulo DIR_C1
# Dirección de memoria de ‘c2’ en rótulo DIR_C2
typedef struct { # Dirección de memoria de ‘dist’ en rótulo DIR_DIST
int x; !
int y; la $t6, DIR_C1 # cargar dirección de c1
la $t7, DIR_C2 # cargar dirección de c2
} coord; !
! lw $t0, 0($t6) # leer c1.x
coord c1, c2; lw $t1, 0($t7) # leer c2.x
sub $t2, $t1, $t0 # t2 = c2.x – c1.x
… abs $t3, $t2 # t3 = abs(c2.x – c1.x)
int dist; !
dist = abs(c2.x – c1.x) + lw $t0, 4($t6) # leer c1.y
lw $t1, 4($t7) # leer c2.y
abs(c2.y – c1.y); sub $t2, $t1, $t0 # t2 = c2.y – c1.y
abs $t4, $t2 # t4 = abs(c2.y – c1.y)
!
Memoria add $t3, $t3, $t4 # t3 = abs(c2.x – c1.x) +
DIR_C1 c1.x # abs(c2.y – c1.y)
!
DIR_C1 + 4 c1.y la $t6, DIR_DIST # cargar dirección de dist
Direcciones de sw $t3, 0($t6) # dist = abs(c2.x – c1.x) +
DIR_C2 c2.x memoria # abs(c2.y – c1.y)
DIR_C2 + 4 c2.y
DIR_DIST dist
Universidad de Concepción, Departamento de Ingeniería Eléctrica 34 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
En general: modos de direccionamiento
❖ Disponibles en otras ISA como VAX, Intel, ARM!
❖ Registro directo: R3!
❖ Inmediato: 25!
❖ Base + desplazamiento: M[R3 + 10000]!
❖ Memoria directo (absoluto): M[10000]!
❖ Registro indirecto: M[R3]!
❖ Base + índice: M[R3 + R4]!
❖ Índice escalado: M[R3 + R4*d + 10000]!
❖ Autoincremento: M[R3++]!
❖ Autodecremento: M[R3--]!
❖ Memoria indirecto: M[ M[R3] ]
Universidad de Concepción, Departamento de Ingeniería Eléctrica 35 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Limitaciones de MIPS
❖ Modos de direccionamiento menos generales que otras ISA!
❖ Menos modos de direccionamiento disponibles !
❖ Operandos inmediatos (desplazamiento) limitados a 16b!
❖ Mediciones en uso de VAX en los años ’80 mostraron que:!
❖ Modos registro directo, inmediato, directo, registro indirecto y base +
desplazamiento constituyen el 88% de todos los usos!
❖ Inmediato de 16b suficiente 75%-80% del tiempo!
❖ Desplazamiento de 16b suficiente 99% del tiempo!
❖ Estas estadísticas fueron decisivas en el diseño del ISA de MIPS y otros
procesadores RISC de la época
Universidad de Concepción, Departamento de Ingeniería Eléctrica 36 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Modos de direccionamiento en ARM
Name! ! ! Alternative Name! ARM Examples!
------------------------------------------------------------------------!
Register to register Register direct! ! MOV R0, R1!
------------------------------------------------------------------------!
Absolute! ! Direct! ! ! LDR R0, MEM!
------------------------------------------------------------------------!
Literal! ! ! Immediate! ! MOV R0, #15!
! ! ! ! ! ! ADD R1, R2, #12!
------------------------------------------------------------------------!
Indexed, base! ! Register indirect ! LDR R0, [R1]!
------------------------------------------------------------------------!
Pre-indexed,! ! Register indirect ! LDR R0, [R1, #4]!
base with displacement with offset!
------------------------------------------------------------------------!
Pre-indexed,! ! Register indirect! LDR R0, [R1, #4]!!
autoindexing! ! pre-incrementing!
------------------------------------------------------------------------!
Post-indexing,!! Register indirect! LDR R0, [R1], #4!
autoindexed! ! post-increment!
------------------------------------------------------------------------!
Double Reg indirect! Register indirect! LDR R0, [R1, R2]!
! ! ! Register indexed!
------------------------------------------------------------------------!
Double Reg indirect! Register indirect! LDR R0, [R1, r2, LSL #2]!
with scaling! ! indexed with scaling!
------------------------------------------------------------------------!
Program counter relative! ! ! LDR R0, [PC, #offset]!
------------------------------------------------------------------------!
Universidad de Concepción, Departamento de Ingeniería Eléctrica 37 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Modos de direccionamiento en Intel x86
Ejemplos:!
add
eax,
4
add
ebx,
[eax]
add
ebx,
LABEL[eax]
add
ebx,
LABEL[eax*4]
add
ecx,
[eax+ebx]
add
ecx,
[eax+ebx*4]
Universidad de Concepción, Departamento de Ingeniería Eléctrica 38 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Control de flujo
❖ Recordar: registro PC almacena dirección de siguiente
instrucción a ejecutar!
❖ Después de cada instrucción aritmético/lógica o
load/store, PC <— PC + 4!
❖ Instrucciones de control de flujo permiten cambiar el
flujo del programa!
❖ Salto asigna un nuevo valor a PC
Universidad de Concepción, Departamento de Ingeniería Eléctrica 39 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Tipos de salto
❖ Condicionalidad!
❖ Saltos incondicionales saltan cada vez que se ejecutan!
❖ Equivalente a instrucción goto en C!
❖ Saltos condicionales saltan sólo si se cumple una condición, si no, PC <— PC + 4!
❖ Usados para implementar if-else, while, for, switch!
❖ Ejemplo de condición: contenido de registro igual a cero!
❖ Dirección destino!
❖ Saltos absolutos especifican dirección destino como una constante!
❖ Saltos relativos especifican un desplazamiento respecto de dirección actual!
❖ Instrucciones de salto más comunes!
❖ jump: absoluto e incodicional!
❖ branch: relativo y condicional
Universidad de Concepción, Departamento de Ingeniería Eléctrica 40 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Saltos en MIPS
❖ Saltos incondicionales (jump)!
❖ Instrucción usa rótulo, ensamblador calcula dirección destino!
! ! j DESTINO # PC = DESTINO
Universidad de Concepción, Departamento de Ingeniería Eléctrica 41 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Saltos en MIPS
❖ Saltos condicionales (branch)!
❖ Assembly especifica dirección destino como un rótulo (label)!
❖ Ensamblador calcula desplazamiento y lo reemplaza en el branch
Universidad de Concepción, Departamento de Ingeniería Eléctrica 42 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
¿Cómo especificar más condiciones?
❖ Instrucciones branch de MIPS especifican pocas condiciones!
❖ Instrucciones de comparación modifican registro en base a condición!
❖ Otras ISA (ej. Intel, ARM) usan códigos de condición
Universidad de Concepción, Departamento de Ingeniería Eléctrica 43 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: if-else
!
Código assembly para el siguiente código C:
! li $s0, 10 # a = 10
int a = 10, b = 5; li $s1, 5 #b=5
int c;
… sle $t3, $s0, $s1 # a <= b ?
if (a > b) bne $t3, $zero, ELSE # if a <= b goto ELSE
c = a – b;
else sub $s2, $s0, $s1 #c=a-b
c = b – a; b FIN_IF # goto FIN_IF
c = c + 10; ELSE: sub $s2, $s1, $s0 #c=b-a
FIN_IF: addi $s2, $s2, 10 # c = c + 10
Versión con goto:
int a = 10, b = 5;
if (a <= b) goto ELSE;
c = a – b;
goto FIN_IF;
ELSE: c = b – a;
FIN_IF: c = c + 10;
Universidad de Concepción, Departamento de Ingeniería Eléctrica 44 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: do-while
Código assembly para el
siguiente código C: li $t0, 0 # i = 0;
! li $t1, 0 # sum = 0
i = 0; la $t2, SUM # $t2 = dirección de sum
sum = 0; sw $t1, 0($t2) # sum = 0
do { LOOP: la $t3, A # $t3 = dirección a[0]
sum = sum + a[i] * b[i]; la $t4, B # $t4 = dirección b[0]
i++;
} while (i < 100) sll $t5, $t0, 2 # $t5 = i*4
add $t6, $t3, $t5 # $t6 = dirección a[i]
lw $t7, 0($t6) # $t7 = a[i]
Versión con goto: add $t6, $t4, $t5 # $t6 = dirección b[i]
! lw $t8, 0($t6) # $t8 = b[i]
int i = 0;
mul $t8, $t7, $t8 # $t8 = a[i]*b[i]
int sum = 0
add $t1, $t1, $t8 # $t1 = sum + a[i]*b[i]
LOOP: sum = sum + a[i] * b[i];
i++; la $t2, SUM
if (i < 100) goto LOOP; sw $t1, 0($t2) # sum = sum + a[i] * b[i]
Variable i asignada a registro $t0; tmp y otros temporales asignados a registros $t3 - $t7.
Vectores a y b almacenados en memoria a partir de direcciones indicadas por rótulos A y B
Universidad de Concepción, Departamento de Ingeniería Eléctrica 47 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Llamado a función
la $a0, A # $a0 = &(a[0])
la $a1, B # $a1 = &(b[0])
int a[100], b[100]
li $a2, 100 # $a2 = 100
…
jal PUNTO # resultado en $v0
res = punto(a, b, 100);
la $t0, RES
…
sw $v0, 0($t0)
!
int punto(int v1[], int v2[], int n)
…
{
int i = 0; PUNTO: li $t0, 0 #i=0
int suma = 0; li $v0, 0 # suma = 0
do { WHILE: sll $t1, $t0, 2 # $t1 = i*4
suma = suma + v1[i] * v2[i]; add $t2, $a0, $t1 # $t2 = &(v1[i])
i++; lw $t3, 0($t2) # $t3 = v1[i]
} while (i < n) add $t2, $a1, $t1 # $t2 = &(v2[i])
return suma; lw $t4, 0($t2) # $t4 = v2[i]
} mult $t3, $t3, $t4 # $t3 = v1[i] * v2[i]
add $v0, $v0, $t3 # suma = suma +…
Recordar convención estándar de uso de registros MIPS:
addi $t0, $t0, 1 #i=i+1
Argumentos en $a0-$a3
Valor de retorno en $v0 slt $t3, $t0, $a2 # i < n?
No es necesario salvar valor de $t0-$t8 antes de usarlos bne $t3, $zero, WHILE
jr $ra
Universidad de Concepción, Departamento de Ingeniería Eléctrica 48 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: strlen
int strlen(char *str) STRLEN: li $v0, 0 # len = 0
{
int len = 0; WHILE: lb $t0, 0($a0) # $t0 = *str
! beq $t0, $zero, FIN_W # if (*str == 0) goto FIN_W
while (*str != 0) { addi $a0, $a0, 1 # str = str + 1
str = str + 1; addi $v0, $v0, 1 # len = len + 1
len = len + 1;
} b WHILE # goto WHILE
!
return len; FIN_W: jr $ra # return len
}
Universidad de Concepción, Departamento de Ingeniería Eléctrica 49 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: strcpy
char *strcpy(char *dest, char *src) STRCPY: move $v0, $a0 # orig_dest = dest
{
char *orig_dest = dest; WHILE: lb $t0, 0($a1) # $t0 = *src
! beq $t0, $zero, FIN_W # if (*src == 0) goto FIN_W
while (*src != 0) {
*dest = *src; sb $t0, 0($a0) # *dest = *src
dest = dest + 1; addi $a0, $a0, 1 # dest = dest + 1
src = src + 1; addi $a1, $a1, 1 # src = src + 1
}
*dest = 0; b WHILE
!
return orig_dest; FIN_W: sb $zero, 0($a0) # *dest = 0
}
jr $ra
Universidad de Concepción, Departamento de Ingeniería Eléctrica 50 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejercicio en clases
int streq(char *s1, char *s2)
{
char tmp;
do {
tmp = *s1;
if (tmp != *s2)
return 0;
s1++;
s2++;
} while (tmp != 0);
return 1;
}
Universidad de Concepción, Departamento de Ingeniería Eléctrica 51 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Otras instrucciones
❖ Llamados al sistema operativo (syscall)!
❖ Generación de excepciones (trap, break)!
❖ Retorno de excepciones (eret)!
❖ No-operación (nop) (pseudoinstrucción)!
❖ Instrucciones al TLB para manejo de memoria virtual!
❖ Acceso no alineado a memoria
Universidad de Concepción, Departamento de Ingeniería Eléctrica 52 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Códigos de condición en Intel x86
❖ Almacenados en registro PSW!
❖ ZF: cero!
❖ CF: carry!
❖ SF: negativo!
❖ OF: overflow!
❖ PF: paridad!
❖ Afectados por instrucciones artimético/lógicas o de comparación!
❖ Utilizados en instrucciones de salto (JUMP) y en instrucciones load/store (MOV)
Universidad de Concepción, Departamento de Ingeniería Eléctrica 53 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Universidad de Concepción, Departamento de Ingeniería Eléctrica 54 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones condicionales en ARM
❖ Basados en bits de condición en registro CPSR!
❖ N: Resultado de última operación fue negativo!
❖ Z: Resultado de última operación fue cero.!
❖ C: Carry o borrow de última suma o resta (overflow sin signo)!
❖ V: Overflow (con signo)!
❖ Modificados como resultado de operaciones aritméticas y lógicas!
❖ Instrucciones de comparación pueden modificar bits de condición sin
generar resultados!
❖ Ej. CMP R4, #0
Universidad de Concepción, Departamento de Ingeniería Eléctrica 55 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones condicionales en ARM
❖ Varias condiciones posibles
Universidad de Concepción, Departamento de Ingeniería Eléctrica 56 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Instrucciones condicionales en ARM
❖ Saltos condicionales saltan basados en bits de condición!
❖ beq LABEL!
❖ bne LABEL!
❖ bge LABEL!
❖ blt LABEL!
❖ etc.!
❖ Pero casi todas las instrucciones también se pueden ejecutar en forma condicional!
❖ subgt R4, R1, R10!
❖ sublt R1, R2, R3!
❖ addhi R4, R10, E2!
❖ moveq R4, #10!
❖ Ejecución condicional (o predicada) es poderosa cuando se realiza especulación por software
o hardware, y está presente en otras ISA
Universidad de Concepción, Departamento de Ingeniería Eléctrica 57 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Registros son recurso limitado
❖ Dirección de retorno en $ra!
❖ Qué hacer si se va a llamar a otro procedimiento? !
❖ Paso de argumentos a función en $a0 - $a3!
❖ Qué pasa cuando hay más argumentos?!
❖ Valor de retorno en $v0 - $v1!
❖ Qué pasa cuando se retorna una estructura de más de dos palabras?!
❖ Registros para variables locales $s0 - $s7!
❖ Qué hacer cuando se quiere escribir sobre ellos?!
❖ Registros temporales $t0 - $t9!
❖ Qué hacer cuando se quiere preservar su valor antes de invocar a un procedimiento?
Universidad de Concepción, Departamento de Ingeniería Eléctrica 58 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Alternativa 1: Estática
Almacenar datos en área de
memoria asociada a procedimiento
Universidad de Concepción, Departamento de Ingeniería Eléctrica 59 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Alternativa 2: Stacks
❖ Definir un área de memoria asociada a cada activación del procedimiento!
❖ Llamado a procedimiento crea una nueva área de memoria sobre la anterior!
❖ Retorno de procedimiento retrocede al área anterior!
❖ Estructura de datos asimila una pila (stack), también llamada LIFO (last in, first out)
A:
call B A
B: A B
call C
C: A B C
ret
B:
A B
ret
A: A
Universidad de Concepción, Departamento de Ingeniería Eléctrica 60 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Soporte ISA para stacks
❖ Stack pointer (SP)!
FP
❖ Apunta al tope del stack!
❖ Utilizado para agregar y remover datos del stack!
Argumentos
❖ Operaciones PUSH y POP!
❖ Frame pointer (FP)!
❖ Apunta a base del bloque de activación (stack frame)!
❖ Usado para accesar variables locales y argumentos sin Registros salvados
removerlos del stack! por el llamado
❖ Algunos compiladores utilizan sólo un registro!
❖ Soporte ISA para stacks!
❖ En el lenguaje de máquina: VAX, Intel! Variables
locales
❖ Defineregistros específicos para SP y FP, e instrucciones
para mover datos entre stack y registros!
❖ Por convención de software: MIPS! Evaluación de
❖ Registros
expresiones
$fp y $sp! (dinámico)
❖ Soporte mínimo: jal, jr
SP
Universidad de Concepción, Departamento de Ingeniería Eléctrica 61 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Cadena de llamados
Estructura de código
Cadena de llamados
p1(…)
{
• p1
•
p2(); p2(…)
• { p2
• • • •
} p3();
• • • p3 p3
p3();
• • •
} p3(…) p3
{
•
• p3
p3();
•
Procedimiento p3 es recursivo •
}
Universidad de Concepción, Departamento de Ingeniería Eléctrica 62 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
Frame! •
Pointer!
Cadena de llamados $fp !
p1(…) p1
{ Stack!
• p1 Pointer!
• $sp
p2();
•
•
}
Universidad de Concepción, Departamento de Ingeniería Eléctrica 63 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p2(…) p1
{ Frame!
• • • p1 Pointer!
p3(); $fp !
• • • p2
p3(); p2 Stack!
• • • Pointer!
} $sp
Universidad de Concepción, Departamento de Ingeniería Eléctrica 64 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p3(…) p1
{
• p1
•
!
p2
p3(); Frame!
• p2
Pointer!
• $fp !
} p3 p3
Stack!
Pointer!
$sp
Universidad de Concepción, Departamento de Ingeniería Eléctrica 65 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p3(…) p1
{
• p1
•
!
p2
p3();
• p2
• !
} p3 p3
Frame!
Pointer!
p3 $fp !
p3
Stack!
Pointer!
$sp
Universidad de Concepción, Departamento de Ingeniería Eléctrica 66 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p3(…) p1
{
• p1
•
!
p2
p3();
p2
•
• !
} p3 p3
p3 !
p3
Frame!
p3 Pointer!
$fp !
p3
Stack!
Pointer!
$sp
Universidad de Concepción, Departamento de Ingeniería Eléctrica 67 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p3(…) p1
{
• p1
•
!
p2
p3();
p2
•
• !
} p3 p3
Frame!
Pointer!
p3 $fp !
p3
Stack!
p3 Pointer!
$sp
Universidad de Concepción, Departamento de Ingeniería Eléctrica 68 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p3(…) p1
{
• p1
•
!
p2
p3(); Frame!
p2
• Pointer!
• $fp !
} p3 p3
Stack!
Pointer!
p3 $sp
p3
Universidad de Concepción, Departamento de Ingeniería Eléctrica 69 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p2(…) p1
{ Frame!
• • • p1 Pointer!
p3(); $fp !
• • • p2
p3(); p2 Stack!
• • • Pointer!
} $sp
p3
p3
p3
Universidad de Concepción, Departamento de Ingeniería Eléctrica 70 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p3(…) p1
{
• p1
•
!
p2
• Frame!
p2
• Pointer!
} $fp !
p3 p3 p3
Stack!
Pointer!
p3 $sp
p3
Universidad de Concepción, Departamento de Ingeniería Eléctrica 71 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
•
Cadena de llamados !
p2(…) p1
{ Frame!
• • • p1 Pointer!
p2(); $fp !
• • • p2
p2(); p2 Stack!
• • • Pointer!
} $sp
p3 p3
p3
p3
Universidad de Concepción, Departamento de Ingeniería Eléctrica 72 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
•
•
Frame! •
Pointer!
Cadena de llamados $fp !
p1(…) p1
{ Stack!
• p1 Pointer!
• $sp
p2(); p2
•
•
} p3 p3
p3
p3
Universidad de Concepción, Departamento de Ingeniería Eléctrica 73 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Factorial recursivo
int factorial(int n)
{
if (n == 0)
return 1;
else
return n * factorial(n-1);
}
Universidad de Concepción, Departamento de Ingeniería Eléctrica 74 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Factorial recursivo
int factorial(int n) FACT: bne $a0, $0, L1 # saltar si n != 0
{ li $v0, 1 # retornar 1
jr $ra
if (n == 0)
return 1;
else
return n * factorial(n-1);
}
dir
$sp
$a0
$fp
$ra
$fp
Universidad de Concepción, Departamento de Ingeniería Eléctrica 75 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Factorial recursivo
int factorial(int n) FACT: bne $a0, $0, L1 # saltar si n != 0
{ li $v0, 1 # retornar 1
jr $ra
if (n == 0) !
return 1; L1: sw $fp, -4($sp) # salvar valor de $fp en stack
else addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
return n * factorial(n-1); sw $ra, -4($fp) # almacenar $ra en el stack
} sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
Universidad de Concepción, Departamento de Ingeniería Eléctrica 76 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Factorial recursivo
int factorial(int n) FACT: bne $a0, $0, L1 # saltar si n != 0
{ li $v0, 1 # retornar 1
jr $ra
if (n == 0) !
return 1; L1: sw $fp, -4($sp) # salvar valor de $fp en stack
else addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
return n * factorial(n-1); sw $ra, -4($fp) # almacenar $ra en el stack
} sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
Universidad de Concepción, Departamento de Ingeniería Eléctrica 77 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Factorial recursivo
int factorial(int n) FACT: bne $a0, $0, L1 # saltar si n != 0
{ li $v0, 1 # retornar 1
jr $ra
if (n == 0) !
return 1; L1: sw $fp, -4($sp) # salvar valor de $fp en stack
else addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
return n * factorial(n-1); sw $ra, -4($fp) # almacenar $ra en el stack
} sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
Universidad de Concepción, Departamento de Ingeniería Eléctrica 78 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Factorial recursivo
int factorial(int n) FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
{
jr $ra
if (n == 0) !
return 1; L1: sw $fp, -4($sp) # salvar valor de $fp en stack
else addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
return n * factorial(n-1); sw $ra, -4($fp) # almacenar $ra en el stack
} sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
Universidad de Concepción, Departamento de Ingeniería Eléctrica 79 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
$fp FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 80 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 81 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 82 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 83 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 84 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
$sp 1 SP_3
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack L2
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
$fp FP_2 FP_3
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 85 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
$sp 1 SP_3
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack L2
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
$fp FP_2 FP_3
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 86 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
1 SP_1
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack L2
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack FP_2 FP_1
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 87 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
1 SP_1
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack L2
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack
FP_2 FP_1
FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 88 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: FACT(3)
FACT: bne $a0, $0, L1 # saltar si n != 0
li $v0, 1 # retornar 1
jr $ra
!
L1: sw $fp, -4($sp) # salvar valor de $fp en stack
addi $fp, $sp, -4 # $fp apunta a base de nuevo frame
1 SP_1
sw $ra, -4($fp) # almacenar $ra en el stack
sw $a0, -8($fp) # almacenar n en el stack L2
addi $sp, $fp, -8 # $sp apunta a nuevo tope de stack FP_2 FP_1
$fp FP_ANT
Universidad de Concepción, Departamento de Ingeniería Eléctrica 89 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejercicio en clases
int fib(int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
return fib(n-1) + fib(n-2);
}
Universidad de Concepción, Departamento de Ingeniería Eléctrica 90 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Excepciones
Universidad de Concepción, Departamento de Ingeniería Eléctrica 91 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Atención de excepciones
❖ Típicamente!
❖ Almacenar estado del procesador (PC, registro de condición, máscara de interrupciones, etc.)!
❖ Transferir control al sistema operativo!
❖ Pasar a modo de ejecución supervisor!
❖ Sistema operativo atiende excepción, restaura el estado y retorna al programa de usuario!
❖ ¿Cómo transferir el control al sistema operativo dependiendo del tipo de excepción?!
❖ Registro de estado (MIPS)!
❖ Excepción provoca salto a posición fija de memoria!
❖ Registro de estado (Cause en MIPS) almacena código que indica causa de la excepción!
❖ Sistema operativo examina registro de estado y salta a rutina de excepción correspondiente!
❖ Excepciones vectorizadas (ARM)!
❖ Salto se produce a una dirección distinta para cada tipo de excepción!
❖ Código de sistema operativo en cada dirección atiende excepción!
❖ Típicamente poco espacio entre direcciones de atención, en la mayoría de los casos el código es un salto a
la rutina de atención!
❖ Excepciones autovectorizadas (Intel x86, más o menos)!
❖ Tabla con direcciones de rutinas de atención en memoria de sistema operativo!
❖ Ante una excepción, procesador lee dirección de atención para el tipo de excepción correspondiente y
salta a la rutina de atención
Universidad de Concepción, Departamento de Ingeniería Eléctrica 92 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Atención de excepciones en MIPS
Registros de estado en coprocesador 0: !
Cause: almacena la causa de una excepción y las que están pendientes.!
Status: máscara de interrupciones, modo supervisor y habilitar/deshabilitar interrupciones!
BadVAddress: dirección de memoria de datos que provocó excepción!
EPC: instrucción que se interrumpió
31 16 15 8 1
Interrupt Mask k e k e k e
Pending Code
BadVAddress
EPC
Universidad de Concepción, Departamento de Ingeniería Eléctrica 93 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Codificación de Instrucciones
❖ Lenguaje assembly!
❖ Representación simbólica de instrucciones del lenguaje de máquina!
❖ Conveniencias para programación (mnemónicos, labels, directivas, etc.)!
❖ Lenguaje de máquina!
❖ Instrucciones en memoria representadas en binario!
❖ Procesador las transforma en señales de control para ejecutar la instrucción!
❖ Campos de una instrucción!
❖ Código de operación (opcode)!
❖ Operandos inmediatos (constantes, desplazamientos)!
❖ Registros operando!
❖ Información adicional (ej. Opcode extendido, continuación de la instrucción, etc.)!
❖ Objetivos de la codificación de instrucciones!
❖ Simplicidad (más fácil de decodificar)!
❖ Regular (campos de la instrucción son fijos)!
❖ Compacto (reduce el tamaño en memoria de los programas)
Universidad de Concepción, Departamento de Ingeniería Eléctrica 94 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Codificación de instruciones MIPS
❖ Instrucciones tipo R:!
❖ Instrucciones con 3 registros!
6b 5b 5b 5b 5b 6b
Opcode Rs Rt Rd Shamt Function
Universidad de Concepción, Departamento de Ingeniería Eléctrica 95 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Codificación de instrucciones MIPS
❖ Instrucciones tipo I:!
❖ Instrucciones con operandos inmediatos!
6b 5b 5b 16b
Opcode Rs Rt Immediate (CLabel)
Universidad de Concepción, Departamento de Ingeniería Eléctrica 96 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Codificación de instrucciones MIPS
❖ Instrucciones tipo J:!
❖ Instrucciones de salto incondicional!
6b 26b
Opcode Label
Universidad de Concepción, Departamento de Ingeniería Eléctrica 97 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! 0x00001025!
0x00400004! 0x0005402A!
…! ! ! ! 0x11000003!
! ! ! ! 0x00441020!
! ! ! ! 0x20A5FFFF!
! ! ! ! 0x08100001!
! ! ! ! 0x03E00008
Universidad de Concepción, Departamento de Ingeniería Eléctrica 98 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! 0x00000000000000000001000000100101!
0x00400004! 0x00000000000001010100000000101010!
…! ! ! ! 0x00010001000000000000000000000011!
! ! ! ! 0x00000000010001000001000000100000!
! ! ! ! 0x00100000101001011111111111111111!
! ! ! ! 0x00001000000100000000000000000001!
! ! ! ! 0x00000011111000000000000000001000
Universidad de Concepción, Departamento de Ingeniería Eléctrica 99 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! R!0x00000000000000000001000000100101!
0x00400004! R!0x00000000000001010100000000101010!
…! ! ! ! I!0x00010001000000000000000000000011!
! ! ! ! R!0x00000000010001000001000000100000!
! ! ! ! I!0x00100000101001011111111111111111!
! ! ! ! J!0x00001000000100000000000000000001!
! ! ! ! R 0x00000011111000000000000000001000
Universidad de Concepción, Departamento de Ingeniería Eléctrica 100 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! R!0x00000000000000000001000000100101!
0x00400004! R!0x00000000000001010100000000101010!
…! ! ! ! I!0x00010001000000000000000000000011!
! ! ! ! R!0x00000000010001000001000000100000!
! ! ! ! I!0x00100000101001011111111111111111!
! ! ! ! J!0x00001000000100000000000000000001!
! ! ! ! R 0x00000011111000000000000000001000
Universidad de Concepción, Departamento de Ingeniería Eléctrica 101 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! R! 0 0 0 2 0 37!
0x00400004! R! 0 0 5 8 0 42!
…! ! ! ! I! 4 8 0 +3!
! ! ! ! R! 0 2 4 2 0 32!
! ! ! ! I! 8 5 5 -1!
! ! ! ! J! 2 0x0100001!
! ! ! !R 0 31 0 0 0 8
Universidad de Concepción, Departamento de Ingeniería Eléctrica 102 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! or! ! $2, $0, $0!
0x00400004! slt!! $8, $0, $5!
…! ! ! ! beq!! $8, $0, 3!
! ! ! ! add!! $2, $2, $4!
! ! ! ! addi! $5, $5, -1!
! ! ! ! j! ! 0x0100001!
! ! ! ! jr! ! $31
Universidad de Concepción, Departamento de Ingeniería Eléctrica 103 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! or! ! $v0, $zero, $zero!
0x00400004! slt!! $t0, $zero, $a1!
…! ! ! ! beq!! $t0, $zero, 3! # salto 4 instrucciones adelante!
! ! ! ! add!! $v0, $v0, $a0!
! ! ! ! addi! $a1, $a1, -1!
! ! ! ! j! ! 0x0100001!! ! # dirección: 0x0400004!
! ! ! ! jr! ! $ra
Universidad de Concepción, Departamento de Ingeniería Eléctrica 104 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! ! ! or! ! $v0, $zero, $zero!
0x00400004! Loop:! slt!! $t0, $zero, $a1!
…! ! ! ! ! ! beq!! $t0, $zero, Exit!
! ! ! ! ! ! add!! $v0, $v0, $a0!
! ! ! ! ! ! addi! $a1, $a1, -1!
! ! ! ! ! ! j! ! Loop!
! ! ! ! Exit:! jr! ! $ra
Universidad de Concepción, Departamento de Ingeniería Eléctrica 105 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
Dirección!! Instrucción!
!
0x00400000! ! ! or! ! $v0, $zero, $zero! # inicializar $v0 en 0!
0x00400004! Loop:! slt!! $t0, $zero, $a1!! # $t0 == 1 si $zero < $a
…! ! ! ! ! ! beq!! $t0, $zero, Exit! # salir si $a1 <= 0!
! ! ! ! ! ! add!! $v0, $v0, $a0! ! # $v0 += $a0!
! ! ! ! ! ! addi! $a1, $a1, -1!! ! # decrementar $a1!
! ! ! ! ! ! j! ! Loop! ! ! ! ! # iterar!
! ! ! ! Exit:! jr! ! $ra!! ! ! ! ! # retornar
Universidad de Concepción, Departamento de Ingeniería Eléctrica 106 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
/* a ! $v0, b ! $a0, c ! $a1 */!
a = 0;!
while (c > 0) {!
! a += b;!
! c—;!
}!
return a;
Universidad de Concepción, Departamento de Ingeniería Eléctrica 107 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014
Ejemplo: Desensamblar código de máquina
/* Multiplicación “carretera”: retorna m*n */!
int mult (int m, int n)!
{!
! int p = 0;!
! while (n > 0) {!
! ! p += m;!
! ! n—;!
! }!
! return p!
}
Universidad de Concepción, Departamento de Ingeniería Eléctrica 108 Arquitectura de Computadores - 543426 - Miguel Figueroa, 2014