Máquinas Intermedias

Anuncio
Diseñar un Lenguaje Simple
Un lenguaje simple y su máquina
•
•
•
•
Tipos de datos: enteros
Almacenamiento: Variables
No hay abstracción de datos
No hay abstracción de control
(procedimientos)
• Flujo de control: Simplemente secuencias
de instrucciones.
El lenguaje de alto nivel
•
•
•
•
•
P
Is
Is
I
I
Begin Is End
I
I ; Is
var := E
write ( E )
•
•
•
•
•
•
•
•
•
•
•
•
•
E E+T
E
E-T
E T
T
SignedF * T
T
SignedF / T
T
SignedF mod T
T
SignedF
SignedF - F
SignedF F
F num
F
var
F (E)
F read()
La máquina intermedia
para interpretación
Entrada
1
Memoria
5
2
i
Pila
salida
El lenguaje de la máquina
Explicación
Instrucción
Push <valor>
Empila el valor en la pila
PushV <dir>
Empila el valor guardado en <dir> en la pila
ASGMEM <dir>
Asigna el valor que está en el tope de la pila a la dirección dir de la memoria y
desempila
PLUS
y:= pop() , x := pop, push(x+y)
SUB
y:= pop() , x := pop, push(x-y)
TIMES
y:= pop() , x := pop, push(x*y)
DIV
y:= pop() , x := pop, push(x/y)
MOD
y:= pop() , x := pop, push(x%y)
CHSIGN
x=pop(), push(-x);
GET
Lee del stream de entada un entero y lo deja en el tope de la pila
PUT
X := pop() , imprime x en el stream de salida
Un ejemplo
X := 1
Read();
Agregar estructuras de control
•
•
•
•
•
•
•
•
•
•
•
•
•
•
P Begin Is End
Is I
Is I ; Is
I var := C
I write ( C )
I If Cond then Is else Is fi
I
If Cond then Is fi
I
While CondE do Is od
CondE CondE or CondT
CondE CondT
CondT CondT and CondF
CondT CondF
CondF
E
CondF
E opRel E
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
OpRel < | >| >= | <= | = | !=
E E+T
E
E-T
E T
T
SignedF * T
T
SignedF / T
T
SignedF mod T
T
SignedF
SignedF not F
SignedF - F
SignedF F
F num
F
var
F
true
F
false
F (E)
F read()
La máquina intermedia
para interpretación
Asgmem
Push 10 1
GET 1
PUSHV
PLUS
PUT
Entrada
1
Memoria
5
2
10
1
2
10
1
10
11
Pila
11
salida
La máquina intermedia
para interpretación
Entrada
1
Memoria
5
2
i
pc
Pila
codigo
salida
Instrucciones: opción 1
Explicación
Instrucción
Push <valor> Empila el valor en la pila
PushV <dir>
Empila el valor guardado en <dir> en la pila
ASGMEM <dir> Asigna el valor que está en el tope de la pila a la dirección dir de la memoria y
desempila
PLUS
y:= pop() , x := pop, push(x+y)
SUB
y:= pop() , x := pop, push(x-y)
TIMES
y:= pop() , x := pop, push(x*y)
DIV
y:= pop() , x := pop, push(x/y)
MOD
y:= pop() , x := pop, push(x%y)
CHSIGN
x=pop(), push(-x);
LT <pos>
y:= pop() , x := pop(), si x < y salta a <pos>
LTE <pos>
y:= pop() , x := pop(), si x <= y salta a <pos>
GT <pos>
y:= pop() , x := pop(), si x > y salta a <pos>
GTE <pos>
y:= pop() , x := pop(), si x >= y salta a <pos>
EQ <pos>
y:= pop() , x := pop(), si x = y salta a <pos>
NEQ <pos>
y:= pop() , x := pop(), si x != y salta a <pos>
JMP <pos>
Salta a <pos>
GET
Lee del stream de entada un entero y lo deja en el tope de la pila
PUT
X := pop() , imprime x en el stream de salida
End
Termina la ejecución
Instrucciones: opción 2
Explicación
Instrucción
Push <valor> Empila el valor en la pila
PushV <dir>
Empila el valor guardado en <dir> en la pila
ASGMEM <dir> Asigna el valor que está en el tope de la pila a la dirección dir de la memoria y
desempila
PLUS
y:= pop() , x := pop, push(x+y)
SUB
y:= pop() , x := pop, push(x-y)
TIMES
y:= pop() , x := pop, push(x*y)
DIV
y:= pop() , x := pop, push(x/y)
MOD
y:= pop() , x := pop, push(x%y)
CHSIGN
x=pop(), push(-x);
LT
y:= pop() , x := pop(), push( x < y)
LTE
y:= pop() , x := pop(), push( x
GT
y:= pop() , x := pop(),push( x > y)
GTE
y:= pop() , x := pop(),push( x
EQ
y:= pop() , x := pop(), push( x = y)
NEQ
y:= pop() , x := pop(),push( x != y)
JMP <pos>
Salta a <pos>
JMPT <pos>
y=pop(), si y es true salta a pos
JMPF <pos>
y=pop(), si y es false salta a pos
GET
Lee del stream de entada un entero y lo deja en el tope de la pila
PUT
X := pop() , imprime x en el stream de salida
End
Termina la ejecución
y)
y)
Ejemplo
BEGIN
n:= read();
i := 0;
f := 1;
WHILE (i < f) DO
i:= i+1;
f := f*i
OD
WRITE(f);
END
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
get
asgmem 1
push 0
asgmem 2
push 1
asgmem 3
pushv 2
pushv 1
LT
jmpF 20
pushV 2
push 1
plus
asgmem 2
pushv 3
pushv 2
times
asgmem 3
JMP 7
pushv 3
put
end
Descargar