Está en la página 1de 15

Mquinas de Pila Abstracta

Generacin de Cdigo
Intermedio

Cdigo intermedio
Un programa para una mquina
abstracta
Dos cualidades
Fcil de producir
Reglas claras de cmo construrla

Fcil de traducir al lenguaje objeto

Cdigo de 3 direcciones
A = A*8 + B/7
temp1 = A*8
temp2 = B/7
A = temp1 + temp2
Variables temporales

Mquinas de Pila
Memoria independiente para
instrucciones y datos
Toda operacin es con valores de la
pila
Operaciones
Aritmtica entera
Manipulacin de pila
Control de flujo

Instrucciones aritmticas
Una instruccin por cada operador
aritmtico
+, -, *, /, div, mod, etc.
Ojo con -: a 8 -> a 8 -

Simula evalucin de expresiones


postfijas

Ejemplo
1, 3 + 5 *
Push 1
Push 3
Push (Pop + Pop)
Push 5
Push (Pop * Pop)

Izquierda o derecha
i = 5; i = i + 1;
Lado derecho: valor entero
Lado izquierdo: dnde almacenar
resultado
i en lado izquierdo indica direccin

Instrucciones
Push v
inserta v en la pila
ValD w
inserta valor de
posicin w
ValI w
inserta direccin de w
Pop
Saca valor de la pila
:=
Pop y poner en dir. Pop
Copy
Pop y Push-Push

da := (14*a) div 4 +
153*m
En postfijo:
da 14 a * 4 div 153 m * + :=
En cdigo de pila
ValI da
Push 14
ValD a
*

Push 4
div
Push 153
ValD m
*

+
:=

Control de flujo
Opciones
Operando da destino
Jump 300

Operando da posicin relativa de


destino
Forward 5
Backward 10

Destino simblico (etiquetas)


Jump Ciclo

Instrucciones Control Flujo


Label z
etiqueta la posicin
Look z
va a posicin etiqueta z
IfFalseLook z
Si Pop = 0 va a posicin etiqueta z

IfTrueLook z
Si Pop <> 0 va a posicin etiqueta z

Halt

detiene ejecucin

if a>8 then a=10;


ValD a
Push 8
IfTrueLook Asigna
Look Contina

Label Asigna
ValI a
Push 10
:=
Label Contina

while a<5 do a++;


Label Prueba
ValD a
Push 5
-

IfFalseLook Sigue
ValI a
ValD a
Push 1
+
:=
Look Prueba
Label Sigue

Etiquetas
Funcin NewLabel()
Genera nuevas etiquetas
Puede inclurse en reglas semnticas
TmpLabel = NewLabel()

Garatiza etiquetas no repetidas


Label00001, Label00002, ...,
Label03428, ...

Reglas Semnticas
Prop -> if Expr then
Prop

Label1 =
NewLabel();
Prop.t = Expr.t & NL
& IfFalseLook &
Label1 & NL &
Prop.t & NL &
Label & Label1

También podría gustarte