Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porHernando Cordoba Modificado hace 9 años
1
Docente: Carlos Orlando Claros Vásquez UNSACA - HUACHO FACULTAD DE INGENIERIA Módulo: Generación de Código No Optimizado
2
Carlos Claros Vásquez Pag. Nº 2 UNSACA 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
Carlos Claros Vásquez Pag. Nº 3 UNSACA 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
Carlos Claros Vásquez Pag. Nº 4 UNSACA 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
Carlos Claros Vásquez Pag. Nº 5 UNSACA 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
Carlos Claros Vásquez Pag. Nº 6 UNSACA 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
Carlos Claros Vásquez Pag. Nº 7 UNSACA 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
Carlos Claros Vásquez Pag. Nº 8 UNSACA Resumen de un Procesador Moderno ALU Control Memoria Registros Memory RegistersALU Control
9
Carlos Claros Vásquez Pag. Nº 9 UNSACA 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
Carlos Claros Vásquez Pag. Nº 10 UNSACA 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
Carlos Claros Vásquez Pag. Nº 11 UNSACA 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
Carlos Claros Vásquez Pag. Nº 12 UNSACA 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
Carlos Claros Vásquez Pag. Nº 13 UNSACA 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
Carlos Claros Vásquez Pag. Nº 14 UNSACA 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
Carlos Claros Vásquez Pag. Nº 15 UNSACA Memory Espacio de Direcciones plano –Compuesto de words –Direccionable por bytes Necesitamos guardar –Programa –Variables locales –Stack –Heap Memory RegistersALU Control
16
Carlos Claros Vásquez Pag. Nº 16 UNSACA Memory RegistersALU Control Stack Código Generado Heap Objetos Arrays locales (parámetros)
17
Carlos Claros Vásquez Pag. Nº 17 UNSACA 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
Carlos Claros Vásquez Pag. Nº 18 UNSACA 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
Carlos Claros Vásquez Pag. Nº 19 UNSACA 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
Carlos Claros Vásquez Pag. Nº 20 UNSACA 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
Carlos Claros Vásquez Pag. Nº 21 UNSACA 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
Carlos Claros Vásquez Pag. Nº 22 UNSACA 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
Carlos Claros Vásquez Pag. Nº 23 UNSACA 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
Carlos Claros Vásquez Pag. Nº 24 UNSACA 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
Carlos Claros Vásquez Pag. Nº 25 UNSACA 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
Carlos Claros Vásquez Pag. Nº 26 UNSACA 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
Carlos Claros Vásquez Pag. Nº 27 UNSACA 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
Carlos Claros Vásquez Pag. Nº 28 UNSACA 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
Carlos Claros Vásquez Pag. Nº 29 UNSACA 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
Carlos Claros Vásquez Pag. Nº 30 UNSACA 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
Carlos Claros Vásquez Pag. Nº 31 UNSACA Registros No es un registro, hard-wired a la constante 0 20
32
Carlos Claros Vásquez Pag. Nº 32 UNSACA Registros Return Address de una llamada (call) –Implicitamente copiada por jal y jalr
33
Carlos Claros Vásquez Pag. Nº 33 UNSACA Registros Frame pointer Stack pointer Pointer to global area
34
Carlos Claros Vásquez Pag. Nº 34 UNSACA Registros Reservado para uso del ensamblador –Se necesita almacenamiento para manejar instrucciones de assembler compuestas
35
Carlos Claros Vásquez Pag. Nº 35 UNSACA Registros Retornan los resultados –Copiar el resultado cuando estamos listos para retornar –Usados para evaluar expresiones (si quieren)
36
Carlos Claros Vásquez Pag. Nº 36 UNSACA 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
Carlos Claros Vásquez Pag. Nº 37 UNSACA Registros El resto son temporales
38
Carlos Claros Vásquez Pag. Nº 38 UNSACA Registros En una llamada a procedimiento los temporales: –Son guardados por el caller –Son guardados por el callee –Alguna combinación de ambos
39
Carlos Claros Vásquez Pag. Nº 39 UNSACA 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
Carlos Claros Vásquez Pag. Nº 40 UNSACA Registros En una llamada a procedimiento los temporales: –Son guardados por el caller –Son guardados por el callee –Alguna combinación de ambos
41
Carlos Claros Vásquez Pag. Nº 41 UNSACA 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
Carlos Claros Vásquez Pag. Nº 42 UNSACA 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
Carlos Claros Vásquez Pag. Nº 43 UNSACA 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
Carlos Claros Vásquez Pag. Nº 44 UNSACA 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
Carlos Claros Vásquez Pag. Nº 45 UNSACA 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
Carlos Claros Vásquez Pag. Nº 46 UNSACA 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
Carlos Claros Vásquez Pag. Nº 47 UNSACA 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
Carlos Claros Vásquez Pag. Nº 48 UNSACA 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
Carlos Claros Vásquez Pag. Nº 49 UNSACA 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
Carlos Claros Vásquez Pag. Nº 50 UNSACA 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
Carlos Claros Vásquez Pag. Nº 51 UNSACA 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
Carlos Claros Vásquez Pag. Nº 52 UNSACA 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
Carlos Claros Vásquez Pag. Nº 53 UNSACA 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
Carlos Claros Vásquez Pag. Nº 54 UNSACA 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
Carlos Claros Vásquez Pag. Nº 55 UNSACA 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
Carlos Claros Vásquez Pag. Nº 56 UNSACA 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
Carlos Claros Vásquez Pag. Nº 57 UNSACA 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
Carlos Claros Vásquez Pag. Nº 58 UNSACA 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
Carlos Claros Vásquez Pag. Nº 59 UNSACA 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
Carlos Claros Vásquez Pag. Nº 60 UNSACA 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
Carlos Claros Vásquez Pag. Nº 61 UNSACA 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
Carlos Claros Vásquez Pag. Nº 62 UNSACA 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
Carlos Claros Vásquez Pag. Nº 63 UNSACA 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
Carlos Claros Vásquez Pag. Nº 64 UNSACA 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
Carlos Claros Vásquez Pag. Nº 65 UNSACA 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
Carlos Claros Vásquez Pag. Nº 66 UNSACA Pregunta: ¿es necesario el $fp? ¿cuáles son las ventajas y desventajas de tener $fp? 30
67
Carlos Claros Vásquez Pag. Nº 67 UNSACA 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
Carlos Claros Vásquez Pag. Nº 68 UNSACA 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
Carlos Claros Vásquez Pag. Nº 69 UNSACA 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
Carlos Claros Vásquez Pag. Nº 70 UNSACA 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
Carlos Claros Vásquez Pag. Nº 71 UNSACA 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
Carlos Claros Vásquez Pag. Nº 72 UNSACA 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
Carlos Claros Vásquez Pag. Nº 73 UNSACA 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
Carlos Claros Vásquez Pag. Nº 74 UNSACA 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
Carlos Claros Vásquez Pag. Nº 75 UNSACA 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
Carlos Claros Vásquez Pag. Nº 76 UNSACA 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
Carlos Claros Vásquez Pag. Nº 77 UNSACA 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
Carlos Claros Vásquez Pag. Nº 78 UNSACA 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
Carlos Claros Vásquez Pag. Nº 79 UNSACA Template para condicionales if (test) true_body else false_body boper …, lab_true jlab_end lab_true: lab_end: 38
80
Carlos Claros Vásquez Pag. Nº 80 UNSACA 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
Carlos Claros Vásquez Pag. Nº 81 UNSACA 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
Carlos Claros Vásquez Pag. Nº 82 UNSACA 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
Carlos Claros Vásquez Pag. Nº 83 UNSACA 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
Carlos Claros Vásquez Pag. Nº 84 UNSACA Template para ciclos while while (test) body
85
Carlos Claros Vásquez Pag. Nº 85 UNSACA Template para ciclos while while (test) body lab_cont: boper …, lab_body jlab_end lab_body: jlab_cont lab_end:
86
Carlos Claros Vásquez Pag. Nº 86 UNSACA 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
Carlos Claros Vásquez Pag. Nº 87 UNSACA Pregunta: ¿Cuál es la template para? do body while (test)
88
Carlos Claros Vásquez Pag. Nº 88 UNSACA Question: ¿Cuál es la template para? do body while (test) lab_begin: boper …, lab_begin 44
89
Carlos Claros Vásquez Pag. Nº 89 UNSACA 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
Carlos Claros Vásquez Pag. Nº 90 UNSACA 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
Carlos Claros Vásquez Pag. Nº 91 UNSACA 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
Carlos Claros Vásquez Pag. Nº 92 UNSACA 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
Carlos Claros Vásquez Pag. Nº 93 UNSACA 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
Carlos Claros Vásquez Pag. Nº 94 UNSACA 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
Carlos Claros Vásquez Pag. Nº 95 UNSACA 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
Carlos Claros Vásquez Pag. Nº 96 UNSACA 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
Carlos Claros Vásquez Pag. Nº 97 UNSACA 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
Carlos Claros Vásquez Pag. Nº 98 UNSACA 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
Carlos Claros Vásquez Pag. Nº 99 UNSACA 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
Carlos Claros Vásquez Pag. Nº 100 UNSACA 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
Carlos Claros Vásquez Pag. Nº 101 UNSACA Lecturas Ballena –Capítulo 7 Dragón (opcional) –Capítulo 9, 10.1, 10.2, 10.3, 10.4
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.