El documento describe un lenguaje de programación simple llamado MUSIM/0 y su correspondiente lenguaje intermedio ENSAMPOCO/0. MUSIM/0 permite tres tipos de sentencias (lectura, asignación y escritura) y un solo tipo de datos (enteros). ENSAMPOCO/0 es un ensamblador que traduce programas de MUSIM/0 a instrucciones para una máquina abstracta de pila.
1. MUSIM/0
Los componentes léxicos o tokens que conforman el lenguaje son los siguientes:
Identificadores, que solo son nombres de variables y están compuestos por una única
letra minúscula de rango a-z.
Constantes numéricas de un solo digito, de rango 0-9.
Operadores: +,-,*,/, y %.
Símbolo de asignación: = (igual).
Paréntesis: ( y ).
Separador de sentencias: ; (punto y coma).
Indicadores de principio y fin de bloque: { y }.
Palabras reservadas que están formadas por una letra mayúscula.
Tan solo son tres: R (lectura), W (escritura) y M (programa principal).
Puede observarse que este lenguaje solo permite tres tipos de sentencias: lectura, asignación y
escritura. Tiene un solo tipo de datos: entero. Las variables están formadas por una única letra
minúscula, y las constantes son de un dígito.
Tiene cinco operadores + (adición), -(diferencia), *(producto), / (división entera), y %(modulo).
Se permite el uso de paréntesis.
Ejemplo 1:
M
{
R a;
R b;
c = a + b;
W c;
}
Analicemos lo que hace este programa:
“R a” y “R b” indica que le leen las variables a y b.
“c = a + b” indica que en la variable c se asignara el resultado de la suma de a y b.
“W c” indica que se escribirá la variable c.
En pocas palabras, este programa leerá dos variables, las sumara y finalmente
mostrará el resultado en pantalla.
Ejercicio 1
M
{
R a;
R b;
R c;
p = (a + b + c)/3;
W p;
}
2. Describa lo que hace el programa anterior según las definiciones del lenguaje:
Ejercicio 2
M
{
R a;
R b;
r = (a * a) + (b * b);
W r;
}
Describa lo que hace el programa anterior.
Ejercicio 3
Escriba un programa en MUSIM/0 que lea un número, calcule y muestre en pantalla cuanto es
ese número elevado al cubo.
Ejercicio 4
Escriba un programa en MUSIM/0 que lea 5 números, calcule y muestre en pantalla: la suma,
promedio y multiplicación de los 5 números.
Ejercicio 5
Escriba un programa en MUSIM/0 que lea un número y determine si este es par o impar. Si es
par deberá mostrar 0 en pantalla, mientras que si es impar deberá mostrar 1
3. ENSAMPOCO/0
Como lenguaje objeto se utiliza un lenguaje intermedio que es un pequeño ensamblador, que
se denomina ENSAMPOCO/0. Este ensamblador trabaja sobre una maquina abstracta, en este
caso particular es una máquina de pila. La máquina tendrá una memoria de 26 celdas cuyas
direcciones se nombrarán con las letras de la ‘a’ a la ‘z’, y una pila LIFO donde se realizarán las
operaciones aritméticas.
A continuación se describe la forma de trabajo de las distintas instrucciones:
Instrucción Descripción
Instrucción Descripción
.CODE Indica el comienzo del código.
PUSHC Coloca una constante en la pila. El operando es una constante.
PUSHA Coloca en la pila la dirección de una variable. El operando es una variable,
dado que las direcciones se denominan con el nombre de las variables.
LOAD Asume que el último valor insertado en la pila es una dirección. Esta dirección
es extraída de la pila y en su lugar se pone el valor ubicado en dicha dirección.
No tiene operando.
STORE Usa los dos últimos elementos de la pila. Uno es la dirección de una celda y
memoria y el otro el valor a almacenar en dicha celda. El último elemento de
la pila es el valor y el otro la dirección. Después de ejecutada la instrucción, los
dos elementos implicados son extraídos de la pila, dejándolos en el mismo
lugar. No tiene operando.
NEG Cambia el signo del último valor introducido en la pila, dejándolo en el mismo
lugar. No tiene operando.
ADD Cambia el signo del último valor introducido en la pila, dejándolo en el mismo
lugar. No tiene operando.
MUL Opera con los dos últimos elementos introducidos en la pila, extrayéndolos y
dejando en su lugar el producto. Por tanto la pila habrá disminuido en un
elemento. No tiene operando.
DIV Opera con los dos últimos elementos introducidos en la pila, extrayendo
primero el denominador y después el numerador y dejando en su lugar la
división entera. Por tanto la pila habrá disminuido en un elemento. No tiene
operando.
MOD Opera con los dos últimos elementos introducidos en la pila, extrayendo
primero el denominador y después el numerador y dejando en su lugar el
modulo. Por tanto, la pila habrá disminuido en un elemento. No tiene
operando.
INPUT Toma el valor del buffer de entrada, en este caso el teclado, y lo coloca en la
dirección asignada a la variable. La pila no sufre cambios.
OUTPUT Toma el valor de la dirección indicada y lo lleva al buffer de salida, en este caso
la pantalla. La pila no sufre cambios.
END Indica el fin de programa.
Ejemplo 2
A continuación se muestran un programa fuente en MUSIM/0, y su traducción al código
intermedio ENSAMPOCO/0
Código en MUSIM/0
4. M
{
R a;
R b;
z = a + b;
W z;
}
Traducción a ENSAMPOCO/0
.CODE
INPUT a
INPUT b
PUSHA z
PUSHA a
LOAD
PUSHA b
LOAD
ADD
STORE
OUTPUT z
END
Ejercicio 6
Traducir el siguiente código en MUSIM/0 A ENSAMPOCO/0
M
{
R a;
R b;
z = a + b - 2;
W z;
}
Traducción a ENSAMPOCO/0
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
Ejercicio 7
Traducir el siguiente código en MUSIM/0 a ENSAMPOCO/0
5. M
{
R a;
R b;
R c;
q = (a * a) + (b * b) + (c * c);
W q;
}
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________