Simpletron

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 8

Construya su propia Computadora.

Adaptacin al ejercicio original de el libro (DEITEL, Paul J. y Harvey M. DEITEL, Cmo Programar
en JAVA. Sptima Edicin, Pearson Educacin. Mxico 2008, ISBN 978-970-26-1190-5).
El ejercicio original de Deitel consiste en construir una mquina virtual o una computadora virtual
muy simple.
El enunciado del problema es muy extenso, pero lo que hace el autor es dictar el programa con
palabras simples. Si lo leemos con atencin, solo tenemos que hacer lo que pide.
Modificaciones al Texto original:
1.- En el ejercicio original el programa en lenguaje de mquina se captura de tal forma que si nos
equivocamos al teclearlo lo tenemos que capturar todo de nuevo. Por lo tanto la Adaptacin que
proponemos, toma la entrada de un archivo de texto que puede ser capturada en un block de
notas, despus la copiamos y pegamos en el cuadro de texto del programa.
2.- Le agregamos una interfaz grfica de usuario.

Una vez aclarado esto, el enunciado queda como sigue:


Seccin especial: Construya su propia computadora.
Ejercicio 1: (Programacin en lenguaje de mquina) Crearemos una computadora a la que le
llamaremos Simpletron. Como su nombre lo indica es una mquina muy simple, pero poderosa.
Simpletron solo ejecuta programas escritos en el nico lenguaje que entiende directamente: el
lenguaje de mquina Simpletron o LMS.
Simpletron contiene un acumulador, un registro especial en el cual se coloca la informacin antes
que Simpletron la utilice en los clculos, o que la analice de distintas maneras. Toda la informacin
de Simpletron se manipula en teminos de palabras. Una palabra es un nmero decimal con signo
de cuatro digitos, como +3364, -1293, +0007 y -0001. Simpletron est equipada con una memoria
de 100 palabras, y se hace referencia a estas palabras mediante sus nmeros de ubicacin 00,01,
, 99.
Antes de ejecutar un programa LMS se coloca siempre en la ubicacin 00. El simulador empezar a
ejecutarse en esta ubicacin.
Cada instruccin escrita en LMS ocupa una palabra de la memoria de Simpletron (y, por tanto, las
instrucciones son nmeros decimales de cuatro dgitos con signo). Supondremos que el signo de
una instruccin LMS siempre ser positivo, pero el signo de una palabra de informacin puede ser
positivo o negativo. Cada una de las ubicaciones en la memoria de Simpletron puede contener una
instruccin, un valor de datos utilizado por un programa o un rea no utilizada (y, por lo tanto,
indefinida) de memoria. Los primeros dos dgitos de cada instruccin LMS son el cdigo de
operacin que especifica la operacin a realizar. Los cdigos de operacin LMS se sintetizan en la
figura 1.

Los ltimos dos digitos de una instruccin LMS son el operando (la direccin de la ubicacin en
memoria que contiene la palabra a la cual se aplica la operacin). Consideremos varios programas
simples en LMS.
Cdigo de Operacin

Significado

Operaciones de
entrada/salida
private const int LEE = 10;

Lee una palabra


introduce a una
memoria

desde el
ubicacin

private const int ESCRIBE = 11;

Escribe
una
palabra
especfica de memoria
pantalla

de
y

teclado y
especfica

la
de

una
ubicacin
la imprime en

Operaciones de
Carga/Almacenamiento
private const int CARGA = 20;

Carga una palabra de una ubicacin especfica


de memoria y la coloca en el acumulador

private const int ALMACENA = 21;

Almacena una palabra del acumulador dentro de


una ubicacin especfica de memoria

Operaciones aritmticas
private const int SUMA

=30;

Suma una palabra de una ubicacin especfica


de memoria a la palabra en el acumulador
(deja el resultado en el acumulador).

private const int RESTA

=31;

Resta una palabra de una ubicacin especfica


de memoria a la palabra en el acumulador
(deja el resultado en el acumulador).

private const int DIVIDE

=32;

Divide
una
palabra
de
una
ubicacin
especfica de memoria a la palabra en el
acumulador
(deja
el
resultado
en
el
acumulador).

private const int MULTIPLICA =33;

Multiplica una palabra de una ubicacin


especfica de memoria a la palabra en el
acumulador
(deja
el
resultado
en
el
acumulador).

Operaciones de tranferencia de
control
private const int BIFURCA

=40;

especfica

de

private const int BIFURCANEG =41;

Salta hacia una ubicacin especfica


memoria si el acumulador es negativo

de

private const int BIFURCACERO=42;

Salta hacia una ubicacin especfica


memoria si el acumulador es cero

de

private const int ALTO

Alto. El programa complet su tarea.

=43;

Salta hacia
memoria

una

ubicacin

Figura 1. Cdigos de operacin del Lenguaje de mquina Simpletron (LMS)


El primer programa en LMS (figura 2) lee dos nmeros del teclado, calcula e imprime la su suma.
La instruccin +1007 lee el primer nmero del teclado y lo coloca en la ubicacin 07 (que se ha
inicializado con 0). Despus, la instruccin +1008 lee el siguiente nmero y lo coloca en la

ubicacin 08. La instruccin carga, +2007, coloca el primer nmero en el acumulador y la


instruccin suma, +3008, suma el segundo nmero al nmero en el acumulador. Todas las
instrucciones LMS aritmticas dejan sus resultados en el acumulador. La instruccin almacena,
+2109, coloca el resultado devuelto en la ubicacin de memoria 09, desde la cual la instruccin
escribe, +1109, toma el nmero y lo imprime (como un nmero decimal de cuatro dgitos con
signo). La instruccin alto, +4300, termina la ejecucin.
Ubicacin
00

Nmero
+1007

Instruccin
(Lee A)

01

+1008

(Lee B)

02

+2007

(Carga A)

03

+3008

(Suma B)

04

+2109

(Almacena C)

05

+1109

(Escribe C)

06

+4300

(Alto)

07

+0000

(Variable A)

08

+0000

(Variable B)

09
+0000
(Variable C)
Figura 2. Programa LMS que lee dos enteros y calcula la suma.
El segundo programa LMS (Figura 3) lee dos nmeros desde el teclado, determina e imprime el
valor ms grande. Observe el uso de la instruccin +4107 como una transferencia de control
condicional, en forma muy similar a un if.
Ubicacin
00

Nmero
+1009

Instruccin
(Lee A)

01

+1010

(Lee B)

02

+2009

(Carga A)

03

+3110

(Resta B)

04

+4107

05

+1109

(Salto si acumulador es
negativo a 07)
(Escribe A)

06

+4300

(Alto)

07

+1110

(Escribe B)

08

+4300

(Alto)

09

+0000

(Variable A)

10
+0000
(Variable B)
Fig. 3 Programa LMS que lee dos enteros y determina cul de ellos es mayor.
Ahora escriba programas en LMS para realizar cada una de las siguientes tareas:
a) Usar un ciclo controlado por centinela para leer 10 nmeros positivos. Calcular e imprimir
la suma.
b) Usar un ciclo controlado por contador para leer siete nmeros, algunos positivos y otros
negativos, y calcular e imprimir su promedio.
c) Leer una serie de nmeros, determinar e imprimir el nmero ms grande. El primer
nmero ledo indica cuntos nmeros deben procesarse.
Ejercicio 2. (Un simulador de computadora) Es este problema usted crear su propia
computadora. No, no soldar componentes, sino que utilizar la poderosa tcnica de la simulacin
basada en software para crear un modelo de software orientado a objetos de Simpletron, la
computadora del ejercicio 1. Su simulador Simpletron convertir la computadora que usted utiliza
en Simpletron, y ser capaz de ejecutar, probar y depurar los programas LMS que escribi en el
ejercicio 1.
Cuando su simulador comience comenzar mostrando la figura 4
Su aplicacin debe simular la memoria del Simpletron con un arreglo unidimensional llamado
memoria, que cuenta con 100 elementos. Ahora suponga que el simulador se est ejecutando y
examinaremos el dilogo a media que introduzcamos el programa de la figura 2, que lee dos
enteros y calcula la suma.
En la ventana presentada en la figura 4, el campo de texto llamado Programa en LMS se utiliza
para capturar el programa en lenguaje de mquina Simpletron. Dado que el campo de Texto
(TextBox) permite copiar, cortar y pegar, el programa lo podemos editar con un block de notas y
guardarlo como un archivo de texto como se ve en figura 5, luego lo marcamos en el block de
notas, lo copiamos y lo pegamos en el TextoBox Programa en LMS.
El botn, Cargar en Memoria pone el programa en la memoria de Simpletron, o sea, dentro del
arreglo llamado memoria y presenta el programa ensamblado en el campo de Texto Programa
en Ensablador.
El botn Ejecutar corre el programa, mientras que Ejecutar Paso a paso solo hace una
instruccin por vez.
La intefaz tambin tiene una Consola llamada Consola LMS que muestra los mensajes
producidos por Simpletron

Figura 4. Interfaz de Simpletron


Ahora el programa en LMS se ha colocado (o cargado) en el arreglo de memoria, como se ve en la
figura 4 en el TextBox Memoria de Simpletrn. Note como la primera instruccin +1007 fue
colocada en la posicin 0 de memoria, la +1008 en la posicin 1 y as sucesivamente. La ejecucin
comienza en la ubicacin 0 y como en cualquier lenguaje de programacin, contina
secuencialmente a menos que se lleve a otra parte del programa mediante una transferencia de
control.

Figura 5. Programa de la Figura 2 en un Block de Notas

Use la variable acumulador para representar el registro acumulador. Use la variable


contadorDePrograma para llevar el registro de la instruccin de la ubicacin de memoria que se
est ejecutando. Use la variable codigoDeOperacion para indicar la operacin que se est
realizando actualmente (es decir, los dos dgitos a la izquierda en la palabra de instruccin). Use la
variable operandopara indicar la posicin de la memoria en la que operar la instruccin actual.
Por lo tanto, operando est compuesta por los dos dgitos ms a la derecha de la instruccin que
se est ejecutando en esos momentos. No ejecute las instrucciones directamente desde la
memoria. En vez de eso, transfiera la siguiente instruccin a ejecutar desde la memoria hasta una
variable llamada registroDeInstruccion. Luego recoja los dos dgitos a la izquierda y colquelos
en codigoDeOperacion, despus recoja los dos dgitos a la derecha y colquelos en
operando. Cuando Simpletron comience con la ejecucin, todos los registros especiales se
deben inicializar con cero.
Ahora vamos a dar un paseo por la ejecucin de la primera instruccin LMS. +1009 en la
ubicacin de memoria 00. A este procedimiento se le conoce como ciclo de ejecucin de una
instruccin (fetch, decode, execute).
El contadorDePrograma nos indica la siguiente instruccin a ejecutar. Nosotros buscamos el
contenido de esa ubicacin de memoria, utilizando la siguiente instruccin:
registroDeInstruccion = memoria[ contadorDePrograma ];
El cdigo de operacin y el operando se extraen del registro de instruccin, mediante las
instrucciones (fetch):
codigoDeOperacion = registroDeInstruccion / 100;
operando = registroDeInstruccion % 100;
Ahora, Simpletron debe determinar que el cdigo de operacin es en realidad un LEE en
comparacin de ESCRIBE, CARGA, etctera (decode). Una instruccin switch establece la diferencia
entre las 12 operaciones de LMS. En la instruccin switch se simula el comportamiento de varias
instrucciones de LMS, como se mestra en la figura 5. En breve hablaremos sobre las instrucciones
de bifurcacin (salto) y dejaremos las otras a usted.
Instruccin
LEE:

Descripcin
Muestra el Dialogo de entrada (fig. 6) que recibe como entrada un entero y
se almacena en la ubicacin
memoria[operando]= entrada;

CARGA:

acumulador = memoria[operando];

SUMA:

acumulador += memoria[operando];

ALTO:

Esta instruccin muestra el mensaje en la consola de Simpletron


Fin de Programa. Favor de Recargar en Memoria
Figura 5. Comportamiento de varias instrucciones de LMS en Simpletron

Figura 6. Dialogo de entrada al ejecutar la instruccin +1007 (LEE 7)

Cuando el programa en LMS termine de ejecutarse, debern de mostrarse la consola LMS, el valor
de los registro, as como el contenido completo de la memoria (Fig 4). A este tipo de impresin se
le denomina vaciado de la computadora. Para ayudarlos a programar su mtodo de vaciado la
figura 4 se muestra un formato de vaciado en Memoria de Simpleton, muestra los valores
actuales de las instrucciones y los valores de los datos al momento en que se termin la ejecucin.
Procedamos ahora con la ejecucin de la primera instruccin de nuestro programa, +1007 en la
ubicacin 00. Como lo hemos indicado, la instruccin switch simula esta tarea pidiendo al usuario
que escriba un valor, leyendo el valor y almacenndolo en la ubicacin de memoria[ operando ]. A
continuacin este valor se lee (figura 6) y se coloca en la posicin de memoria 07.
En este punto se ha completado la simulacin de la primera instruccin. Todo lo que resta es
preparar a Simpletron para que ejecute la siguiente instruccin. Como la instruccin que acaba de
ejecutarse no es una transferencia de control, solo necesitamos incrementar el registro contador
de programa de la siguiente manera:
++contadorDePrograma;

Esta seccin completa la ejecucin simulada de la primera instruccin. Todo el proceso (es decir, el
ciclo de ejecucin de una instruccin) empieza de nuevo, con la bsqueda de la siguiente
instruccin a ser ejecutada,
Ahora veremos como se simulan las instrucciones de bifurcacin (las transferencias de control).
Todo lo que necesitamos hacer es ajustar el valor en el contador de instrucciones de manera
apropiada. Por lo tanto, la instruccin de bifurcacin incondicional (40) se simula dentro de la
instruccin switch como:
contadorDePrograma = operando;
La instruccin condicional bifurca si el acumulador es cero se simula como
if( acumulador == 0)
contadorDePrograma = operando;
En este punto, usted debe implementar su simulador Simpletron y ejecutar cada uno de los
programas que escribi en el ejercicio 1. Si lo desea, puede embellecer al LMS con caractersticas
adicionales y ofrecerlas a su simulador.
Su simulador debe comprobar diversos tipos de errores. Por ejemplo, durante la fase de carga del
programa, cada nmero que el usuario escribe en la memoria de Simpletron debe encontrarse
dentro del rango -9999 a +9999. Su simulador debe probar que cada nmero introducido se
encuentre dentro de este rango y, en caso contrario, seguir pidindole al usuario que vuelva a
introducir el nmero hasta que introduzca un nmero correcto.
Durante la fase de ejecucin, su simulador debe comprobar varios errores graves, como los
intentos de dividir entre cero, intentar ejecutar cdigos de operacin invlidos, y desbordamientos
del acumulador (es decir, las operaciones aritmticas que den como resultado valores mayores de
+9999 o menores que -9999). Dichos errores graves se conocen como errores fatales. Al detectar
un error fatal, su simulador debe imprimir un mensaje de error tal como
*** Intento de dividir entre cero ***
*** La ejecucin de Simpletron se termin en forma anormal ***
Y deber imprimir un vaciado de computadora completo en el formato que vimos anteriormente.
Este anlisis ayudar al usuario a localizar el error en el programa.
Para escribir el programa en lenguaje ensamblador (fig. 4 y fig 6) se hace lo siguiente (fig 7)
Lenguaje de mquina
codigoDeOperacion
operando
+1007
10
07
+1008
10
08
+2007
20
07
+3008
30
08
+2109
21
09
+1109
11
09
+4300
43
00
+0000
0
0
+0000
0
0
+0000
0
0
Figura 7. Decodificacin de instrucciones y ensamblado en Simpletron.

Ensamblador
0: LEE 7
1: LEE 8
2: CARGA 7
3: SUMA 8
4: ALMACENA 9
5: ESCRIBE 9
6: ALTO 0
7: VARIABLE
8: VARIABLE
9: VARIABLE

También podría gustarte