generaci n de c digo no optimizado
Download
Skip this Video
Download Presentation
Generación de Código No Optimizado

Loading in 2 Seconds...

play fullscreen
1 / 101

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


  • 107 Views
  • Uploaded on

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.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Generación de Código No Optimizado' - cedric-greene


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 data assembly instruction

main:

[test.c: 3] 0x4009b0: 3c1c0fc0 lui gp,0xfc0

[test.c: 3] 0x4009b4: 279c7640 addiu gp,gp,30272

[test.c: 3] 0x4009b8: 0399e021 addu gp,gp,t9

[test.c: 3] 0x4009bc: 8f998044 lw t9,-32700(gp)

[test.c: 3] 0x4009c0: 27bdffe0 addiu sp,sp,-32

[test.c: 3] 0x4009c4: afbf001c sw ra,28(sp)

[test.c: 3] 0x4009c8: afbc0018 sw gp,24(sp)

[test.c: 3] 0x4009cc: 0320f809 jalr ra,t9

[test.c: 3] 0x4009d0: 2404000a li a0,10

[test.c: 3] 0x4009d4: 8fbf001c lw ra,28(sp)

[test.c: 3] 0x4009d8: 8fbc0018 lw gp,24(sp)

[test.c: 3] 0x4009dc: 27bd0020 addiu sp,sp,32

[test.c: 3] 0x4009e0: 03e00008 jr ra

[test.c: 3] 0x4009e4: 00001025 move v0,zero

Oscar Bonilla21Universidad Galileo

slide22

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

slide23

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:

.word 1

.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

b lab2

lab1:

lw $15, 40($sp)

bne $15, 1, $33

li $2, 1

b lab1

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>

j lab_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>

j lab1

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>

j lab1

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)

j lab1

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)

j lab1

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

j lab_end

lab_body:

<body>

j lab_cont

lab_end:

while (test)

body

Oscar Bonilla85Universidad Galileo

template para ciclos while2

lab_cont:

<do the test>

boper …, lab_end

<body>

j lab_cont

lab_end:

43

Template para ciclos while

lab_cont:

<do the test>

boper …, lab_body

j lab_end

lab_body:

<body>

j lab_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

ad