Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
Low-level IR
Representación Intermedia
Generador de Código
Código en Assembler
Oscar Bonilla 4 Universidad Galileo
Representación en Formato Intermedio
• ALU Memory
• Control
• Memoria Registers ALU
• Registros Control
• Con forma:
OP Rdest, Rsrc1, Rsrc2
Registers ALU
• Operaciones son:
– Operaciones aritméticas (add, sub, mul) Control
– 8, 16, 32 bits
– Aritmética con y sin signo Control
• Ejecución de Instrucciones
– Todas las instrucciones están en
Registers ALU
memoria
– Fetch de la instrucción a la que apunta Control
el PC y ejecutarla
– Para instrucciones generales,
incrementar el PC para que apunte a la
siguiente posición de memoria
– traps y excepciones
– Mecanismo
Registers ALU
• Guardar la posición de la siguiente
instrucción (o la actual)
Control
• Encontrar la dirección a la que hay que
saltar (de un vector de excepciones)
• Saltar a esa posición
– Variables locales
– Stack
– Heap
Registers ALU
Objetos Control
Heap
Arrays
Código Generado
a/de registros
Control
Low-level IR
Representación Intermedia
Generador de Código
Código en Assembler
Low-level IR
Representación Intermedia
Generador de Código
Código en Assembler
Assembler & linker
Binario Ejecutable
Procesador
Oscar Bonilla 23 Universidad Galileo
Lenguaje Ensamblador
• Ventajas
– Simplifica la generación de código debido al uso de
instrucciones simbólicas y nombres simbólicos
– Capa de abstracción lógica
– Las arquitecturas pueden ser descritas por un
lenguaje ensamblador
podemos modificar la implementación
• Instrucciones de macro assembler
• Desventajas
– Proceso adicional de ensamblaje y linking
Text segment
0x400000
Reserved
Oscar Bonilla 29 Universidad Galileo
Disciplinas de paso de parámetros
• Muchos métodos distintos
– Llamada por referencia
– Llamada por valor
– Llamada por valor-resultado
• ¿Cómo pasamos los parámetros?
– Por el stack
– Por los registros
– O una combinación
Registros
• No es un registro, hard-wired a la constante 0
31 ra return address
Oscar Bonilla 32 Universidad Galileo
Registros
• Frame pointer
• Stack pointer
• Pointer to global area
0 zero hard-wired to zero
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
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 Bonilla 41 Universidad Galileo
...
Stack argument 5
argument 4
fp
old frame pointer
return address
• Dirección del n-ésimo Calliee saved
registers
argumento es -(n-4)*4*$fp Local variables
Stack argument 5
argument 4
fp
• Al llamar un nuevo old frame pointer
return address
Calliee saved
procedimiento registers
Local variables
Stack temporaries
Dynamic area
sp
Stack argument 5
argument 4
fp
• Al llamar un nuevo old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
Local variables
Stack temporaries
Dynamic area
sp
Stack argument 5
argument 4
fp
• Al llamar un nuevo old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
– push de cualquier t0-t9 que Local variables
tenga un valor importante al Stack temporaries
stack Dynamic area
Stack argument 5
argument 4
fp
• Al llamar un nuevo old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
– push de cualquier t0-t9 que Local variables
tenga un valor importante al Stack temporaries
stack Dynamic area
– poner argumentos 1-4 en Caller saved registers
registros a0-a3 arguments
sp
– push del resto de los
argumentos al stack
Stack argument 5
argument 4
fp
• Al llamar un nuevo old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
– push de cualquier t0-t9 que Local variables
tenga un valor importante al Stack temporaries
stack Dynamic area
– poner argumentos 1-4 en Caller saved registers
registros a0-a3 arguments
sp
– push del resto de los
argumentos al stack
– hacer un jal o jalr
Stack argument 5
argument 4
fp
• En el procedimiento, el old frame pointer
return address
Calliee saved
calliee al principio: registers
Local variables
Stack temporaries
Dynamic area
Stack argument 5
argument 4
Stack temporaries
Dynamic area
Stack argument 5
argument 4
Stack argument 5
argument 4
Stack argument 5
argument 4
Stack argument 5
argument 4
Stack argument 5
argument 4
Stack argument 5
argument 4
old frame pointer
• En el procedimiento, el calliee return address
Calliee saved
al final : registers
Local variables
Stack temporaries
Dynamic area
Dynamic area
sp
Oscar Bonilla 55 Universidad Galileo
...
Stack argument 5
argument 4
old frame pointer
• En el procedimiento, el calliee return address
Calliee saved
al final : registers
– poner valores de retorno en v0,v1 Local variables
Stack temporaries
Dynamic area
Dynamic area
sp
Oscar Bonilla 56 Universidad Galileo
...
Stack argument 5
argument 4
old frame pointer
• En el procedimiento, el calliee return address
Calliee saved
al final : registers
– poner valores de retorno en v0,v1 Local variables
– actualizar $sp usando $fp Stack temporaries
($fp+4) + ... Dynamic area
Stack argument 5
argument 4
old frame pointer
• En el procedimiento, el calliee return address
Calliee saved
al final : registers
– poner valores de retorno en v0,v1 Local variables
– actualizar $sp usando $fp Stack temporaries
($fp+4) + ... Dynamic area
– Pop los registros callee-saved del
Caller saved registers
stack arguments
fp
old frame pointer
return address
Calliee saved
sp
registers
Stack argument 5
argument 4
old frame pointer
• En el procedimiento, el calliee return address
Calliee saved
al final : registers
– poner valores de retorno en v0,v1 Local variables
– actualizar $sp usando $fp Stack temporaries
($fp+4) + ... Dynamic area
– Pop los registros callee-saved del
Caller saved registers
stack arguments
– restaurar $ra del stack fp
old frame pointer sp
return address
Stack argument 5
argument 4
fp
old frame pointer
• En el procedimiento, el calliee return address
Calliee saved
al final : registers
– poner valores de retorno en v0,v1 Local variables
– actualizar $sp usando $fp ($fp+4) Stack temporaries
+ ... Dynamic area
– Pop los registros callee-saved del
Caller saved registers
stack arguments
– restaurar $ra del stack sp
old frame pointer
– restaurar $fp del stack
Stack argument 5
argument 4
fp
old frame pointer
• En el procedimiento, el calliee al return address
Calliee saved
final : registers
– poner valores de retorno en v0,v1 Local variables
– actualizar $sp usando $fp ($fp+4) Stack temporaries
+ ... Dynamic area
– Pop los registros callee-saved del
Caller saved registers
stack arguments
– restaurar $ra del stack sp
– restaurar $fp del stack
– ejecutar jr ra para regresar al
caller
Stack argument 5
argument 4
fp
• Al regresar de la llamada al old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
Local variables
Stack temporaries
Dynamic area
Stack argument 5
argument 4
fp
• Al regresar de la llamada al old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
– actualizar $sp para ignorar Local variables
argumentos Stack temporaries
Dynamic area
Stack argument 5
argument 4
fp
• Al regresar de la llamada al old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
– actualizar $sp para ignorar Local variables
argumentos Stack temporaries
– pop de los registros caller Dynamic area
sp
saved Caller saved registers
Stack argument 5
argument 4
fp
• Al regresar de la llamada al old frame pointer
return address
Calliee saved
procedimiento, el caller: registers
– actualizar $sp para ignorar Local variables
argumentos Stack temporaries
– pop de los registros caller Dynamic area
sp
saved
– continuar...
Pregunta:
• ¿es necesario el $fp?
• ¿cuáles son las ventajas y desventajas de tener
$fp?
…
int px, py, pz;
…
auxmath am;
am.sum3d(px, py, pz, 0, 0, 0);
do
body
while (test)
Question:
• ¿Cuál es la template para?
do
body
while (test)
lab_begin:
<body>
<do test>
boper …, lab_begin
Oscar Bonilla 88 Universidad Galileo
Resumen
• Introducción
• Resumen de un procesador moderno
• Lenguaje de Máquina
• Convenciones de Llamado
• Generación de Expresiones
• Generación de Control de Flujo
• Generación de Procedimientos
• Linking
Dynamic area
sp
Oscar Bonilla 90 Universidad Galileo
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...
Procedure Call
proc_entry:
• En el procedimiento, el calliee add $t0, $fp, zero
al principio : add $fp, $sp, zero
– copiar $sp a $fp addi $sp, $sp, -4
sw $t0, ($sp)
– push $fp al stack addi $sp, $sp, -4
– push $ra al stack sw $ra, ($sp)
– si cualquier s0-s7 es usado en el
procedimiento, guardarlo en el
stack
– crear espacio para variables
locales en el stack
– ejecutar al calliee...
stack
– restaurar $ra del stack
– restaurar $fp del stack
– ejecutar jr ra para regresar al caller