La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Docente: Carlos Orlando Claros Vásquez UNSACA - HUACHO FACULTAD DE INGENIERIA Módulo: Generación de Código No Optimizado.

Presentaciones similares


Presentación del tema: "Docente: Carlos Orlando Claros Vásquez UNSACA - HUACHO FACULTAD DE INGENIERIA Módulo: Generación de Código No Optimizado."— Transcripción de la presentación:

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


Descargar ppt "Docente: Carlos Orlando Claros Vásquez UNSACA - HUACHO FACULTAD DE INGENIERIA Módulo: Generación de Código No Optimizado."

Presentaciones similares


Anuncios Google