Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porChicky Pilar Modificado hace 10 años
1
Compiladores Generación de Código No Optimizado De la Representación Intermedia a Código de Máquina
2
Oscar Bonilla 2Universidad Galileo Resumen Introducción Overview de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
3
Oscar Bonilla 3Universidad Galileo Anatomía de un Compilador Optimizador de Código Intermedio Generador de Código Representación Intermedia OptimizadaCódigo en Assembler Generador de Código Intermedio Representación Intermedia Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream)
4
Oscar Bonilla 4Universidad Galileo Anatomía de un Compilador Generador de Código Representación Intermedia Código en Assembler High-level IR Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream) Low-level IR Generador de Código Intermedio
5
Oscar Bonilla 5Universidad Galileo Representación en Formato Intermedio while (i < v.length && v[i] != 0) { i = i+1; } entry ldl ilen < cbr stl i exit ldf v lda 0 != cbr ldf vldl i 0 +
6
Oscar Bonilla 6Universidad Galileo El Generador de Código debe... Traducir todas las instrucciones en la representación intermedia a lenguaje ensamblador Asignar espacio para variables, arreglos, etc. Adherirse a las convenciones de llamado Crear la información simbólica necesaria
7
Oscar Bonilla 7Universidad Galileo Resumen Introducción Resumen de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
8
Oscar Bonilla 8Universidad Galileo Resumen de un Procesador Moderno ALU Control Memoria Registros Memory RegistersALU Control
9
Oscar Bonilla 9Universidad Galileo Arithmetic and Logic Unit Hace la mayoría de operaciones Con forma: OP R dest, R src1, R src2 Operaciones son: –Operaciones aritméticas (add, sub, mul) –Operaciones lógicas (and, sll) –Operaciones de comparación (seq, sge, slt) Memory Registers Control ALU
10
Oscar Bonilla 10Universidad Galileo Arithmetic and Logic Unit Muchas operaciones aritméticas pueden causar una excepción –overflow y underflow Puede operar en distintos tipos de datos –8, 16, 32 bits –Aritmética con y sin signo –Operaciones de punto flotante (ALU separada) –Instrucciones para convertir entre formatos (cvt.s.d) Memory Registers Control ALU
11
Oscar Bonilla 11Universidad Galileo Control Maneja la secuencia de Instrucciones Ejecución de Instrucciones –Todas las instrucciones están en memoria –Fetch de la instrucción a la que apunta el PC y ejecutarla –Para instrucciones generales, incrementar el PC para que apunte a la siguiente posición de memoria Memory RegistersALU Control
12
Oscar Bonilla 12Universidad Galileo Control Saltos no condicionales –Fetch de la siguiente instrucción de una localidad diferente –Salto incondicional a una dirección dada j label –Salto incondicional a una dirección en un registro jr r src –Para manejar llamadas a procedimientos, se hace un salto incondicional, pero se guarda la siguiente dirección en la secuencia actual en un registro jal label jalr r src Memory RegistersALU Control
13
Oscar Bonilla 13Universidad Galileo Control Saltos Condicionales –Ejectuamos un test, si es éxitoso, fetch de instrucciones de una nueva dirección, de otra forma fetch de la siguiente instrucción –Las instrucciones son de la forma: brelop R src1, R src2, label –relop es de la forma: eq, ne, gt, ge, lt, le Memory RegistersALU Control
14
Oscar Bonilla 14Universidad Galileo Control Transferencia de control en casos especiales (raros) –traps y excepciones –Mecanismo Guardar la posición de la siguiente instrucción (o la actual) Encontrar la dirección a la que hay que saltar (de un vector de excepciones) Saltar a esa posición Memory RegistersALU Control
15
Oscar Bonilla 15Universidad Galileo Memory Espacio de Direcciones plano –Compuesto de words –Direccionable por bytes Necesitamos guardar –Programa –Variables locales –Stack –Heap Memory RegistersALU Control
16
Oscar Bonilla 16Universidad Galileo Memory RegistersALU Control Stack Código Generado Heap Objetos Arrays locales (parámetros)
17
Oscar Bonilla 17Universidad Galileo Registers Arquitectura load/store –Todas las operaciones se ejecutan en registros –Necesitamos mover datos de/a memoria a/de registros Importante para rendimiento –Limitados en número ALU Control Memory Registers
18
Oscar Bonilla 18Universidad Galileo Otras Interacciones Otras operaciones –Input/Output –Operaciones Privilegiadas / seguras –Manejo de hardware especial TLBs, Caches etc. La mayoría via system calls –Codificadas a mano en assembler –El compilador las puede tratar como una llamada normal a una función ALU Control Memory Registers
19
Oscar Bonilla 19Universidad Galileo Resumen Introducción Resumen de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
20
Oscar Bonilla 20Universidad Galileo Las máquinas entienden... location data 0x4009b0:3c1c0fc0 0x4009b4:279c7640 0x4009b8:0399e021 0x4009bc:8f998044 0x4009c0:27bdffe0 0x4009c4:afbf001c 0x4009c8:afbc0018 0x4009cc:0320f809 0x4009d0:2404000a 0x4009d4:8fbf001c 0x4009d8:8fbc0018 0x4009dc:27bd0020 0x4009e0:03e00008 0x4009e4:00001025
21
Oscar Bonilla 21Universidad Galileo Las máquinas entienden... location dataassembly instruction main: [test.c: 3] 0x4009b0:3c1c0fc0luigp,0xfc0 [test.c: 3] 0x4009b4:279c7640addiugp,gp,30272 [test.c: 3] 0x4009b8:0399e021addugp,gp,t9 [test.c: 3] 0x4009bc:8f998044lwt9,-32700(gp) [test.c: 3] 0x4009c0:27bdffe0addiusp,sp,-32 [test.c: 3] 0x4009c4:afbf001cswra,28(sp) [test.c: 3] 0x4009c8:afbc0018swgp,24(sp) [test.c: 3] 0x4009cc:0320f809jalrra,t9 [test.c: 3] 0x4009d0:2404000alia0,10 [test.c: 3] 0x4009d4:8fbf001clwra,28(sp) [test.c: 3] 0x4009d8:8fbc0018lwgp,24(sp) [test.c: 3] 0x4009dc:27bd0020addiusp,sp,32 [test.c: 3] 0x4009e0:03e00008jrra [test.c: 3] 0x4009e4:00001025movev0,zero
22
Oscar Bonilla 22Universidad Galileo Representación Intermedia Programa (character stream) Generador de Código Código en Assembler High-level IR Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Low-level IR Generador de Código Intermedio
23
Oscar Bonilla 23Universidad Galileo Representación Intermedia Programa (character stream) Generador de Código Código en Assembler High-level IR Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Low-level IR Generador de Código Intermedio Assembler & linker Binario Ejecutable Procesador
24
Oscar Bonilla 24Universidad Galileo Lenguaje Ensamblador Ventajas –Simplifica la generación de código debido al uso de instrucciones simbólicas y nombres simbólicos –Capa de abstracción lógica –Las arquitecturas pueden ser descritas por un lenguaje ensamblador podemos modificar la implementación Instrucciones de macro assembler Desventajas –Proceso adicional de ensamblaje y linking
25
Oscar Bonilla 25Universidad Galileo Lenguaje Ensamblador Lenguaje de Máquina Reposicionable (object modules) –Todas las posiciones (direcciones) representadas por símbolos –Mapeadas a direcciones de memoria en tiempo de linking y loading –Flexibilidad de compilación separada Lenguaje de Máquina Absoluto –Direcciones hard-coded –Implementación simple y directa –Inflexible – difícil de recargar el código generado
26
Oscar Bonilla 26Universidad Galileo Ejemplo de Assembler item:.word1.text fib: subu$sp, 40 sw$31, 28($sp) sw$4, 40($sp) sw$16, 20($sp).frame$sp, 40, $31 # 7 if(n == 0) return 0; lw$14, 40($sp) bne$14, 0, $32 move$2, $0 blab2 lab1: lw$15, 40($sp) bne$15, 1, $33 li$2, 1 blab1
27
Oscar Bonilla 27Universidad Galileo Resumen Introducción Resumen de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
28
Oscar Bonilla 28Universidad Galileo Compatibilidad Necesitamos Manejar –Procedimientos múltiples –Llamadas a librerías –Código compilado por otros compiladores, escrito en lenguajes distintos, assembler escrito a mano Convenciones de llamado –Layout de memoria –Registros –Stack
29
Oscar Bonilla 29Universidad Galileo Layout de Memoria Inicio del Stack Manejo del Heap –free lists Posición de inicio en el segmento de texto Stack Text segment Heap Objects Arrays locals (parameters) 0x7fffffff 0x400000 Reserved
30
Oscar Bonilla 30Universidad Galileo Disciplinas de paso de parámetros Muchos métodos distintos –Llamada por referencia –Llamada por valor –Llamada por valor-resultado ¿Cómo pasamos los parámetros? –Por el stack –Por los registros –O una combinación
31
Oscar Bonilla 31Universidad Galileo Registros No es un registro, hard-wired a la constante 0 20
32
Oscar Bonilla 32Universidad Galileo Registros Return Address de una llamada (call) –Implicitamente copiada por jal y jalr
33
Oscar Bonilla 33Universidad Galileo Registros Frame pointer Stack pointer Pointer to global area
34
Oscar Bonilla 34Universidad Galileo Registros Reservado para uso del ensamblador –Se necesita almacenamiento para manejar instrucciones de assembler compuestas
35
Oscar Bonilla 35Universidad Galileo Registros Retornan los resultados –Copiar el resultado cuando estamos listos para retornar –Usados para evaluar expresiones (si quieren)
36
Oscar Bonilla 36Universidad Galileo Registros Primeros cuatro argumentos de una llamada –Se pueden usar para otra cosa si los argumentos no importan –Si hay más argumentos se pasan por el stack
37
Oscar Bonilla 37Universidad Galileo Registros El resto son temporales
38
Oscar Bonilla 38Universidad Galileo Registros En una llamada a procedimiento los temporales: –Son guardados por el caller –Son guardados por el callee –Alguna combinación de ambos
39
Oscar Bonilla 39Universidad Galileo Pregunta: ¿Cuáles son las ventajas/desventajas de que: –El callee guarde los registros? –El caller guarde los registros? ¿Qué registros deben ser usados por el caller y callee si la mitad es guardada por el caller y la otra mitad es guardada por el callee? –Caller-saved t0 - t9 –Calliee-saved s0-s7 21
40
Oscar Bonilla 40Universidad Galileo Registros En una llamada a procedimiento los temporales: –Son guardados por el caller –Son guardados por el callee –Alguna combinación de ambos
41
Oscar Bonilla 41Universidad Galileo Stack Guarda los parámetros y las variables locales –Cada invocación obtiene una nueva copia Caller tiene que guardar –Cualquier registro caller-saved que tiene un valor –Cualesquiera parámetros pasados –Return address (de cuando se hizo el branch) Callee tiene que guardar –Dirección anterior del stack pointer –Cualquier registro callee-saved que use 23
42
Oscar Bonilla 42Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp Dirección del n-ésimo argumento es -(n-4)*4*$fp Variables locales son constantes positivas de $fp
43
Oscar Bonilla 43Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp Al llamar un nuevo procedimiento 24
44
Oscar Bonilla 44Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp Al llamar un nuevo procedimiento, el caller:
45
Oscar Bonilla 45Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers fp sp Al llamar un nuevo procedimiento, el caller: –push de cualquier t0-t9 que tenga un valor importante al stack
46
Oscar Bonilla 46Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp Al llamar un nuevo procedimiento, el caller: –push de cualquier t0-t9 que tenga un valor importante al stack –poner argumentos 1-4 en registros a0-a3 –push del resto de los argumentos al stack
47
Oscar Bonilla 47Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp Al llamar un nuevo procedimiento, el caller: –push de cualquier t0-t9 que tenga un valor importante al stack –poner argumentos 1-4 en registros a0-a3 –push del resto de los argumentos al stack –hacer un jal o jalr
48
Oscar Bonilla 48Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp En el procedimiento, el calliee al principio: 25
49
Oscar Bonilla 49Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp En el procedimiento, el calliee al principio : –copiar $sp a $fp sp
50
Oscar Bonilla 50Universidad Galileo old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack
51
Oscar Bonilla 51Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack
52
Oscar Bonilla 52Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Calliee saved registers Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack
53
Oscar Bonilla 53Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack
54
Oscar Bonilla 54Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee...
55
Oscar Bonilla 55Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area En el procedimiento, el calliee al final : fp sp 26
56
Oscar Bonilla 56Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 fp sp
57
Oscar Bonilla 57Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Calliee saved registers Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... fp sp
58
Oscar Bonilla 58Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack fp sp Calliee saved registers
59
Oscar Bonilla 59Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack fp sp
60
Oscar Bonilla 60Universidad Galileo old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack fp sp
61
Oscar Bonilla 61Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack –ejecutar jr ra para regresar al caller fp sp
62
Oscar Bonilla 62Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp 27
63
Oscar Bonilla 63Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: –actualizar $sp para ignorar argumentos return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers fp sp
64
Oscar Bonilla 64Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: –actualizar $sp para ignorar argumentos –pop de los registros caller saved return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers fp sp
65
Oscar Bonilla 65Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: –actualizar $sp para ignorar argumentos –pop de los registros caller saved –continuar... return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp
66
Oscar Bonilla 66Universidad Galileo Pregunta: ¿es necesario el $fp? ¿cuáles son las ventajas y desventajas de tener $fp? 30
67
Oscar Bonilla 67Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; }
68
Oscar Bonilla 68Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; … auxmath am; am.sum3d(px, py, pz, 0, 0, 0);
69
Oscar Bonilla 69Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; px = 10; py = 20; pz = 30; auxmath am; am.sum3d(px, py, pz, 0, 1, -1); Dynamic area Caller saved registers Argument 7: bz (-1) fp Argument 6: by (1) Argument 5: bx (0)
70
Oscar Bonilla 70Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; px = 10; py = 20; pz = 30; auxmath am; am.sum3d(px, py, pz, 0, 1, -1); return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0)
71
Oscar Bonilla 71Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; px = 10; py = 20; pz = 30; auxmath am; am.sum3d(px, py, pz, 0, 1, -1); return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??)
72
Oscar Bonilla 72Universidad Galileo Resumen Introducción Resumen de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
73
Oscar Bonilla 73Universidad Galileo Creación de Expresiones Algoritmo ingenuo de generación de código x = y op z –Seleccionar un registro R src1 (digamos $t0) para cargar el valor y –Generar instrucción para copiar, si y está: En otro registro (digamos $t7) add $t0, $t7, zero Es constante (digamos 1024) li $t0, 1024 En memoria (digamos que $t7 apunta a y) lw $t0, $t7 En una dirección simbólica (digamos lab1) la $t0, lab1 –Seleccionar registro R src2 (digamos $t1) y cargar el valor z –Seleccionar registro R dest (digamos $t2) para guardar x –Hacer la operación (digamos and) and $t2, $t1, $t0
74
Oscar Bonilla 74Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; sp return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??)
75
Oscar Bonilla 75Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; sp return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) add $t0, $a1, zero lw$t1, 0($fp) sub$t2, $t0, $t1 sw$t2, -12($fp) address src1 src2 dest
76
Oscar Bonilla 76Universidad Galileo Cuidado Los temporales son limitados –Cuándo el árbol es grande, 18 registros temporales pueden ser insuficientes asignar espacio en el stack No hay instrucción de máquina –Puede ser que haya que expandir la operación intermedia a múltiples operaciones de máquina Muy ineficiente –Muchas copias, sumas con cero, etc. –No se preocupen, vamos a arreglarlas en la optimización –Mantengan el generador de código muy muy simple
77
Oscar Bonilla 77Universidad Galileo Resumen Introducción Resumen de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
78
Oscar Bonilla 78Universidad Galileo Generación de control de flujo Aplanar la estructura del control –Usar un template Poner etiquetas únicas para puntos donde el control se une (join points) Ahora generamos el código apropiado
79
Oscar Bonilla 79Universidad Galileo Template para condicionales if (test) true_body else false_body boper …, lab_true jlab_end lab_true: lab_end: 38
80
Oscar Bonilla 80Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest boper...,..., lab0 jlab1 lab0: lab1:
81
Oscar Bonilla 81Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest add$t0, $a1, zero lw$t1, 0($fp) bgt$t0, $t1, lab0 jlab1 lab0: lab1:
82
Oscar Bonilla 82Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest add$t0, $a1, zero lw$t1, 0($fp) bgt$t0, $t1, lab0 lw$t0, 0($fp) add$t1, $a1, zero sub$t2, $t0, $t1 sw$t2, -12($fp) jlab1 lab0: lab1:
83
Oscar Bonilla 83Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest add$t0, $a1, zero lw$t1, 0($fp) bgt$t0, $t1, lab0 lw$t0, 0($fp) add$t1, $a1, zero sub$t2, $t0, $t1 sw$t2, -12($fp) jlab1 lab0:add$t0, $a1, zero lw$t1, 0($fp) sub$t2, $t0, $t1 sw$t2, -12($fp) lab1:
84
Oscar Bonilla 84Universidad Galileo Template para ciclos while while (test) body
85
Oscar Bonilla 85Universidad Galileo Template para ciclos while while (test) body lab_cont: boper …, lab_body jlab_end lab_body: jlab_cont lab_end:
86
Oscar Bonilla 86Universidad Galileo Template para ciclos while while (test) body lab_cont: boper …, lab_body jlab_end lab_body: jlab_cont lab_end: Una template optimizada 43 lab_cont: boper …, lab_end jlab_cont lab_end:
87
Oscar Bonilla 87Universidad Galileo Pregunta: ¿Cuál es la template para? do body while (test)
88
Oscar Bonilla 88Universidad Galileo Question: ¿Cuál es la template para? do body while (test) lab_begin: boper …, lab_begin 44
89
Oscar Bonilla 89Universidad Galileo Resumen Introducción Resumen de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
90
Oscar Bonilla 90Universidad Galileo return address old frame pointer Procedure Call Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee...
91
Oscar Bonilla 91Universidad Galileo Procedure Call En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee... 46
92
Oscar Bonilla 92Universidad Galileo Procedure Call En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee... proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp) 48
93
Oscar Bonilla 93Universidad Galileo Procedure Call Ejecutar el cuerpo del procedimiento callee –Acceso a variables locales y parámetros como offsets del $fp proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp)...
94
Oscar Bonilla 94Universidad Galileo Procedure Call proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp)... En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack –ejecutar jr ra para regresar al caller
95
Oscar Bonilla 95Universidad Galileo Procedure Call proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp)... En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack –ejecutar jr ra para regresar al caller add$v0, $t2 lw$sp, -8($fp) addi$sp, $sp, -8 lw$ra, ($sp) addi$sp, $sp, 4 lw$fp, ($sp) addi $sp, $sp, 4 jr$ra 51
96
Oscar Bonilla 96Universidad Galileo Resumen Introducción Resumen de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking
97
Oscar Bonilla 97Universidad Galileo Símbolos Ejecutable es una colección –Compilaciones separadas –Librerías linkeadas estática y dinámicamente Por lo tanto, no podemos crear una imagen de memoria en tiempo de compilación Fase adicional del linker para juntarlo todo y crear la imagen final de memoria
98
Oscar Bonilla 98Universidad Galileo Salida del compilador Crear código objeto con direcciones simbólicas que pueden ser reposicionadas Direcciones simbólicas de todos los datos y principios de procedimientos que otros necesitan accesar son exportados Exportar los nombres de símbolos de referencias externas
99
Oscar Bonilla 99Universidad Galileo Símbolos exportados por el compilador Symbols from test.o: [Index] Value Class Type Section Name [0]| 0| File |ref=6 |Text | test.c [1]| 0| Proc |end=3 int |Text | main [2]| 56| Proc |end=5 int |Text | fib [3]| 0| Global | |Bss | internal_var [4]| 0| Proc |ref=1 |Text | main [5]| 56| Proc |ref=3 |Text | fib [6]| 0| Global | |Undefined| external_var [7]| 0| Proc | |Undefined| foo [8]| 0| Global | |Undefined| _gp_disp
100
Oscar Bonilla 100Universidad Galileo Linker Ver todos los object files para encontrar símbolos no resueltos Hacer match de los símbolos y encontrar las partes necesarias en las librerías Layout en una sola imagen de memoria Resolver todos los nombres simbólicos a las direcciones correctas de memoria y offsets adecuados
101
Oscar Bonilla 101Universidad Galileo Lecturas Ballena –Capítulo 7 Dragón (opcional) –Capítulo 9, 10.1, 10.2, 10.3, 10.4
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.