Generaci n de c digo no optimizado
This presentation is the property of its rightful owner.
Sponsored Links
1 / 101

Generación de Código No Optimizado PowerPoint PPT Presentation


  • 77 Views
  • Uploaded on
  • Presentation posted in: General

Generación de Código No Optimizado. De la Representación Intermedia a Código de Máquina. 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.

Download Presentation

Generación de Código No Optimizado

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Generaci n de c digo no optimizado

Generación de Código No Optimizado

De la Representación Intermedia a Código de Máquina


Resumen

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

Oscar Bonilla2Universidad Galileo


Anatom a de un compilador

Programa (character stream)

Token Stream

Representación Intermedia

Representación Intermedia Optimizada

Código en Assembler

Anatomía de un Compilador

Analizador Léxico (Scanner)

Analizador Sintáctico (Parser)

Arbol de Parseo

Generador de Código Intermedio

Optimizador de Código Intermedio

Generador de Código

Oscar Bonilla3Universidad Galileo


Anatom a de un compilador1

Programa (character stream)

Token Stream

Código en Assembler

Anatomía de un Compilador

Analizador Léxico (Scanner)

Analizador Sintáctico (Parser)

Arbol de Parseo

Generador de Código Intermedio

High-level IR

Low-level IR

Representación Intermedia

Generador de Código

Oscar Bonilla4Universidad Galileo


Representaci n en formato intermedio

Representación en Formato Intermedio

while (i < v.length && v[i] != 0) {

i = i+1;

}

entry

cbr

<

ldl i

len

cbr

ldf v

!=

stl i

0

lda

exit

+

ldf v

ldl i

ldl i

0

Oscar Bonilla5Universidad Galileo


El generador de c digo debe

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

Oscar Bonilla6Universidad Galileo


Resumen1

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

Oscar Bonilla7Universidad Galileo


Resumen de un procesador moderno

Resumen de un Procesador Moderno

Memory

  • ALU

  • Control

  • Memoria

  • Registros

Registers

ALU

Control

Oscar Bonilla8Universidad Galileo


Arithmetic and logic unit

Arithmetic and Logic Unit

Memory

  • Hace la mayoría de operaciones

  • Con forma:OP Rdest, Rsrc1, Rsrc2

  • Operaciones son:

    • Operaciones aritméticas (add, sub, mul)

    • Operaciones lógicas (and, sll)

    • Operaciones de comparación (seq, sge, slt)

Registers

ALU

Control

Oscar Bonilla9Universidad Galileo


Arithmetic and logic unit1

Arithmetic and Logic Unit

Memory

  • 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)

Registers

ALU

Control

Oscar Bonilla10Universidad Galileo


Control

Control

Memory

  • 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

Registers

ALU

Control

Oscar Bonilla11Universidad Galileo


Control1

Control

Memory

  • 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 rsrc

    • 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 labeljalr rsrc

Registers

ALU

Control

Oscar Bonilla12Universidad Galileo


Control2

Control

Memory

  • 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 Rsrc1, Rsrc2, label

    • relop es de la forma:eq, ne, gt, ge, lt, le

Registers

ALU

Control

Oscar Bonilla13Universidad Galileo


Control3

Control

Memory

  • 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

Registers

ALU

Control

Oscar Bonilla14Universidad Galileo


Memory

Memory

Memory

  • Espacio de Direcciones plano

    • Compuesto de words

    • Direccionable por bytes

  • Necesitamos guardar

    • Programa

    • Variables locales

    • Stack

    • Heap

Registers

ALU

Control

Oscar Bonilla15Universidad Galileo


Memory1

Memory

Memory

Stack

locales

(parámetros)

Registers

ALU

Objetos

Control

Heap

Arrays

Código Generado

Oscar Bonilla16Universidad Galileo


Registers

Registers

Memory

  • 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

Registers

ALU

Control

Oscar Bonilla17Universidad Galileo


Otras interacciones

Otras Interacciones

Memory

  • 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

Registers

ALU

Control

Oscar Bonilla18Universidad Galileo


Resumen2

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

Oscar Bonilla19Universidad Galileo


Las m quinas entienden

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

Oscar Bonilla20Universidad Galileo


Las m quinas entienden1

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

Oscar Bonilla21Universidad Galileo


Generaci n de c digo no optimizado

Programa (character stream)

Token Stream

Código en Assembler

Analizador Léxico (Scanner)

Analizador Sintáctico (Parser)

Arbol de Parseo

Generador de Código Intermedio

High-level IR

Low-level IR

Representación Intermedia

Generador de Código

Oscar Bonilla22Universidad Galileo


Generaci n de c digo no optimizado

Programa (character stream)

Token Stream

Código en Assembler

Analizador Léxico (Scanner)

Analizador Sintáctico (Parser)

Arbol de Parseo

Generador de Código Intermedio

High-level IR

Low-level IR

Representación Intermedia

Generador de Código

Assembler & linker

Binario Ejecutable

Procesador

Oscar Bonilla23Universidad Galileo


Lenguaje ensamblador

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

Oscar Bonilla24Universidad Galileo


Lenguaje ensamblador1

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

Oscar Bonilla25Universidad Galileo


Ejemplo de assembler

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

Oscar Bonilla26Universidad Galileo


Resumen3

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

Oscar Bonilla27Universidad Galileo


Compatibilidad

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

Oscar Bonilla28Universidad Galileo


Layout de memoria

Layout de Memoria

0x7fffffff

Stack

  • Inicio del Stack

  • Manejo del Heap

    • free lists

  • Posición de inicio en el segmento de texto

locals

(parameters)

Objects

Heap

Arrays

Text segment

0x400000

Reserved

Oscar Bonilla29Universidad Galileo


Disciplinas de paso de par metros

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

Oscar Bonilla30Universidad Galileo


Registros

20

Registros

  • No es un registro, hard-wired a la constante 0

Oscar Bonilla31Universidad Galileo


Registros1

Registros

  • Return Address de una llamada (call)

    • Implicitamente copiada por jal y jalr

Oscar Bonilla32Universidad Galileo


Registros2

Registros

  • Frame pointer

  • Stack pointer

  • Pointer to global area

Oscar Bonilla33Universidad Galileo


Registros3

Registros

  • Reservado para uso del ensamblador

    • Se necesita almacenamiento para manejar instrucciones de assembler compuestas

Oscar Bonilla34Universidad Galileo


Registros4

Registros

  • Retornan los resultados

    • Copiar el resultado cuando estamos listos para retornar

    • Usados para evaluar expresiones (si quieren)

Oscar Bonilla35Universidad Galileo


Registros5

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

Oscar Bonilla36Universidad Galileo


Registros6

Registros

  • El resto son temporales

Oscar Bonilla37Universidad Galileo


Registros7

Registros

  • En una llamada a procedimiento los temporales:

    • Son guardados por el caller

    • Son guardados por el callee

    • Alguna combinación de ambos

Oscar Bonilla38Universidad Galileo


Pregunta

21

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

Oscar Bonilla39Universidad Galileo


Registros8

Registros

  • En una llamada a procedimiento los temporales:

    • Son guardados por el caller

    • Son guardados por el callee

    • Alguna combinación de ambos

Oscar Bonilla40Universidad Galileo


Stack

23

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

Oscar Bonilla41Universidad Galileo


Stack1

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Dirección del n-ésimo argumento es -(n-4)*4*$fp

  • Variables locales son constantes positivas de $fp

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

sp

Oscar Bonilla42Universidad Galileo


Stack2

24

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al llamar un nuevo procedimiento

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

sp

Oscar Bonilla43Universidad Galileo


Stack3

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al llamar un nuevo procedimiento, el caller:

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

sp

Oscar Bonilla44Universidad Galileo


Stack4

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al llamar un nuevo procedimiento, el caller:

    • push de cualquier t0-t9 que tenga un valor importante al stack

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

sp

Oscar Bonilla45Universidad Galileo


Stack5

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

sp

Oscar Bonilla46Universidad Galileo


Stack6

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

sp

Oscar Bonilla47Universidad Galileo


Stack7

sp

25

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • En el procedimiento, el calliee al principio:

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

Oscar Bonilla48Universidad Galileo


Stack8

sp

Stack

...

argument 5

argument 4

old frame pointer

return address

  • En el procedimiento, el calliee al principio :

    • copiar $sp a $fp

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

fp

arguments

Oscar Bonilla49Universidad Galileo


Stack9

sp

Stack

...

argument 5

argument 4

old frame pointer

return address

  • En el procedimiento, el calliee al principio :

    • copiar $sp a $fp

    • push $fp al stack

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

Oscar Bonilla50Universidad Galileo


Stack10

sp

Stack

...

argument 5

argument 4

old frame pointer

return address

  • En el procedimiento, el calliee al principio :

    • copiar $sp a $fp

    • push $fp al stack

    • push $ra al stack

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Oscar Bonilla51Universidad Galileo


Stack11

sp

Stack

...

argument 5

argument 4

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Oscar Bonilla52Universidad Galileo


Stack12

sp

Stack

...

argument 5

argument 4

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Oscar Bonilla53Universidad Galileo


Stack13

Stack

...

argument 5

argument 4

old frame pointer

return address

  • 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...

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

Oscar Bonilla54Universidad Galileo


Stack14

26

Stack

...

argument 5

argument 4

old frame pointer

return address

  • En el procedimiento, el calliee al final :

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

Oscar Bonilla55Universidad Galileo


Stack15

Stack

...

argument 5

argument 4

old frame pointer

return address

  • En el procedimiento, el calliee al final :

    • poner valores de retorno en v0,v1

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

Oscar Bonilla56Universidad Galileo


Stack16

Stack

...

argument 5

argument 4

old frame pointer

return address

  • En el procedimiento, el calliee al final :

    • poner valores de retorno en v0,v1

    • actualizar $sp usando $fp ($fp+4) + ...

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

sp

Oscar Bonilla57Universidad Galileo


Stack17

Stack

...

argument 5

argument 4

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

sp

return address

Calliee saved

registers

Oscar Bonilla58Universidad Galileo


Stack18

Stack

...

argument 5

argument 4

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

sp

old frame pointer

return address

Oscar Bonilla59Universidad Galileo


Stack19

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

sp

old frame pointer

Oscar Bonilla60Universidad Galileo


Stack20

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • 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

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

sp

Oscar Bonilla61Universidad Galileo


Stack21

27

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al regresar de la llamada al procedimiento, el caller:

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

sp

Oscar Bonilla62Universidad Galileo


Stack22

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al regresar de la llamada al procedimiento, el caller:

    • actualizar $sp para ignorar argumentos

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

sp

Oscar Bonilla63Universidad Galileo


Stack23

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al regresar de la llamada al procedimiento, el caller:

    • actualizar $sp para ignorar argumentos

    • pop de los registros caller saved

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

sp

Caller saved registers

Oscar Bonilla64Universidad Galileo


Stack24

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al regresar de la llamada al procedimiento, el caller:

    • actualizar $sp para ignorar argumentos

    • pop de los registros caller saved

    • continuar...

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

sp

Oscar Bonilla65Universidad Galileo


Pregunta1

30

Pregunta:

  • ¿es necesario el $fp?

  • ¿cuáles son las ventajas y desventajas de tener $fp?

Oscar Bonilla66Universidad Galileo


Programa ejemplo

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;

}

}

Oscar Bonilla67Universidad Galileo


Programa ejemplo1

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);

Oscar Bonilla68Universidad Galileo


Programa ejemplo2

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)

Argument 6: by (1)

Argument 5: bx (0)

fp

Oscar Bonilla69Universidad Galileo


Programa ejemplo3

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)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

sp

return address

Oscar Bonilla70Universidad Galileo


Programa ejemplo4

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)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

Oscar Bonilla71Universidad Galileo


Resumen4

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

Oscar Bonilla72Universidad Galileo


Creaci n de expresiones

Creación de Expresiones

  • Algoritmo ingenuo de generación de código x = y op z

    • Seleccionar un registro Rsrc1 (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 Rsrc2 (digamos $t1) y cargar el valor z

    • Seleccionar registro Rdest (digamos $t2) para guardar x

    • Hacer la operación (digamos and) and $t2, $t1, $t0

Oscar Bonilla73Universidad Galileo


Programa ejemplo5

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;

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

sp

Local variable dz (??)

Oscar Bonilla74Universidad Galileo


Programa ejemplo6

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;

address

src1

src2

dest

Dynamic area

add $t0, $a1, zero

lw$t1, 0($fp)

sub$t2, $t0, $t1

sw$t2, -12($fp)

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

sp

Local variable dz (??)

Oscar Bonilla75Universidad Galileo


Cuidado

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

Oscar Bonilla76Universidad Galileo


Resumen5

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

Oscar Bonilla77Universidad Galileo


Generaci n de control de flujo

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

Oscar Bonilla78Universidad Galileo


Template para condicionales

38

Template para condicionales

if (test)

true_body

else

false_body

<do the test>

boper …, lab_true

<false_body>

jlab_end

lab_true:

<true_body>

lab_end:

Oscar Bonilla79Universidad Galileo


Programa ejemplo7

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

<do test>

boper..., ..., lab0

<false body>

jlab1

lab0:

<true body>

lab1:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

Oscar Bonilla80Universidad Galileo


Programa ejemplo8

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

add$t0, $a1, zero

lw$t1, 0($fp)

bgt$t0, $t1, lab0

<fale body>

jlab1

lab0:

<true body>

lab1:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

Oscar Bonilla81Universidad Galileo


Programa ejemplo9

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

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:

<true body>

lab1:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

Oscar Bonilla82Universidad Galileo


Programa ejemplo10

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

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:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

Oscar Bonilla83Universidad Galileo


Template para ciclos while

Template para ciclos while

while (test)

body

Oscar Bonilla84Universidad Galileo


Template para ciclos while1

Template para ciclos while

lab_cont:

<do the test>

boper …, lab_body

jlab_end

lab_body:

<body>

jlab_cont

lab_end:

while (test)

body

Oscar Bonilla85Universidad Galileo


Template para ciclos while2

lab_cont:

<do the test>

boper …, lab_end

<body>

jlab_cont

lab_end:

43

Template para ciclos while

lab_cont:

<do the test>

boper …, lab_body

jlab_end

lab_body:

<body>

jlab_cont

lab_end:

while (test)

body

  • Una template optimizada

Oscar Bonilla86Universidad Galileo


Pregunta2

Pregunta:

  • ¿Cuál es la template para?

    do

    body

    while (test)

Oscar Bonilla87Universidad Galileo


Question

44

Question:

  • ¿Cuál es la template para?

    do

    body

    while (test)

lab_begin:

<body>

<do test>

boper …, lab_begin

Oscar Bonilla88Universidad Galileo


Resumen6

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

Oscar Bonilla89Universidad Galileo


Procedure call

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...

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

Oscar Bonilla90Universidad Galileo


Procedure call1

46

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...

Oscar Bonilla91Universidad Galileo


Procedure call2

48

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 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...

Oscar Bonilla92Universidad Galileo


Procedure call3

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)

. . .

  • Ejecutar el cuerpo del procedimiento callee

    • Acceso a variables locales y parámetros como offsets del $fp

Oscar Bonilla93Universidad Galileo


Procedure call4

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

Oscar Bonilla94Universidad Galileo


Procedure call5

51

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

Oscar Bonilla95Universidad Galileo


Resumen7

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

Oscar Bonilla96Universidad Galileo


S mbolos

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

Oscar Bonilla97Universidad Galileo


Salida del compilador

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

Oscar Bonilla98Universidad Galileo


S mbolos exportados por el compilador

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

Oscar Bonilla99Universidad Galileo


Linker

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

Oscar Bonilla100Universidad Galileo


Lecturas

Lecturas

  • Ballena

    • Capítulo 7

  • Dragón (opcional)

    • Capítulo 9, 10.1, 10.2, 10.3, 10.4

Oscar Bonilla101Universidad Galileo


  • Login