simpletron

8
Construya su propia Computadora. Adaptación al ejercicio original de el libro (DEITEL, Paul J. y Harvey M. DEITEL, “Cómo Programar en JAVA. Séptima Edición, Pearson Educación. México 2008, ISBN 978-970-26-1190-5”). El ejercicio original de Deitel consiste en construir una máquina 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 atención, solo tenemos que hacer lo que pide. Modificaciones al Texto original: 1.- En el ejercicio original el programa en lenguaje de máquina se captura de tal forma que si nos equivocamos al teclearlo lo tenemos que capturar todo de nuevo. Por lo tanto la Adaptación que proponemos, toma la entrada de un archivo de texto que puede ser capturada en un block de notas, después la copiamos y pegamos en el cuadro de texto del programa. 2.- Le agregamos una interfaz gráfica de usuario. Una vez aclarado esto, el enunciado queda como sigue: Sección especial: Construya su propia computadora. Ejercicio 1: (Programación en lenguaje de máquina) Crearemos una computadora a la que le llamaremos “Simpletron”. Como su nombre lo indica es una máquina muy simple, pero poderosa. Simpletron solo ejecuta programas escritos en el único lenguaje que entiende directamente: el lenguaje de máquina Simpletron o LMS. Simpletron contiene un acumulador, un registro especial en el cual se coloca la información antes que Simpletron la utilice en los cálculos, o que la analice de distintas maneras. Toda la información de Simpletron se manipula en teminos de palabras. Una palabra es un número 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 números de ubicación 00,01, …, 99. Antes de ejecutar un programa LMS se coloca siempre en la ubicación 00. El simulador empezará a ejecutarse en esta ubicación. Cada instrucción escrita en LMS ocupa una palabra de la memoria de Simpletron (y, por tanto, las instrucciones son números decimales de cuatro dígitos con signo). Supondremos que el signo de una instrucción LMS siempre será positivo, pero el signo de una palabra de información puede ser positivo o negativo. Cada una de las ubicaciones en la memoria de Simpletron puede contener una instrucción, un valor de datos utilizado por un programa o un área no utilizada (y, por lo tanto, indefinida) de memoria. Los primeros dos dígitos de cada instrucción LMS son el código de operación que especifica la operación a realizar. Los códigos de operación LMS se sintetizan en la figura 1.

Upload: danielordaz

Post on 03-Dec-2015

19 views

Category:

Documents


6 download

DESCRIPTION

Una modificación del simpletron original de deitel.

TRANSCRIPT

Page 1: Simpletron

Construya su propia Computadora. Adaptación al ejercicio original de el libro (DEITEL, Paul J. y Harvey M. DEITEL, “Cómo Programar en JAVA. Séptima Edición, Pearson Educación. México 2008, ISBN 978-970-26-1190-5”). El ejercicio original de Deitel consiste en construir una máquina 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 atención, solo tenemos que hacer lo que pide. Modificaciones al Texto original: 1.- En el ejercicio original el programa en lenguaje de máquina se captura de tal forma que si nos equivocamos al teclearlo lo tenemos que capturar todo de nuevo. Por lo tanto la Adaptación que proponemos, toma la entrada de un archivo de texto que puede ser capturada en un block de notas, después la copiamos y pegamos en el cuadro de texto del programa. 2.- Le agregamos una interfaz gráfica de usuario. Una vez aclarado esto, el enunciado queda como sigue: Sección especial: Construya su propia computadora. Ejercicio 1: (Programación en lenguaje de máquina) Crearemos una computadora a la que le llamaremos “Simpletron”. Como su nombre lo indica es una máquina muy simple, pero poderosa. Simpletron solo ejecuta programas escritos en el único lenguaje que entiende directamente: el lenguaje de máquina Simpletron o LMS. Simpletron contiene un acumulador, un registro especial en el cual se coloca la información antes que Simpletron la utilice en los cálculos, o que la analice de distintas maneras. Toda la información de Simpletron se manipula en teminos de palabras. Una palabra es un número 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 números de ubicación 00,01, …, 99. Antes de ejecutar un programa LMS se coloca siempre en la ubicación 00. El simulador empezará a ejecutarse en esta ubicación. Cada instrucción escrita en LMS ocupa una palabra de la memoria de Simpletron (y, por tanto, las instrucciones son números decimales de cuatro dígitos con signo). Supondremos que el signo de una instrucción LMS siempre será positivo, pero el signo de una palabra de información puede ser positivo o negativo. Cada una de las ubicaciones en la memoria de Simpletron puede contener una instrucción, un valor de datos utilizado por un programa o un área no utilizada (y, por lo tanto, indefinida) de memoria. Los primeros dos dígitos de cada instrucción LMS son el código de operación que especifica la operación a realizar. Los códigos de operación LMS se sintetizan en la figura 1.

Page 2: Simpletron

Los últimos dos digitos de una instrucción LMS son el operando (la dirección de la ubicación en memoria que contiene la palabra a la cual se aplica la operación). Consideremos varios programas simples en LMS.

Código de Operación Significado Operaciones de

entrada/salida

private const int LEE = 10;

private const int ESCRIBE = 11;

Lee una palabra desde el teclado y la

introduce a una ubicación específica de

memoria

Escribe una palabra de una ubicación

específica de memoria y la imprime en

pantalla

Operaciones de

Carga/Almacenamiento

private const int CARGA = 20;

private const int ALMACENA = 21;

Carga una palabra de una ubicación específica

de memoria y la coloca en el acumulador

Almacena una palabra del acumulador dentro de

una ubicación específica de memoria

Operaciones aritméticas

private const int SUMA =30;

private const int RESTA =31;

private const int DIVIDE =32;

private const int MULTIPLICA =33;

Suma una palabra de una ubicación específica

de memoria a la palabra en el acumulador

(deja el resultado en el acumulador).

Resta una palabra de una ubicación específica

de memoria a la palabra en el acumulador

(deja el resultado en el acumulador).

Divide una palabra de una ubicación

específica de memoria a la palabra en el

acumulador (deja el resultado en el

acumulador).

Multiplica una palabra de una ubicación

específica de memoria a la palabra en el

acumulador (deja el resultado en el

acumulador).

Operaciones de tranferencia de

control

private const int BIFURCA =40;

private const int BIFURCANEG =41;

private const int BIFURCACERO=42;

private const int ALTO =43;

Salta hacia una ubicación específica de

memoria

Salta hacia una ubicación específica de

memoria si el acumulador es negativo

Salta hacia una ubicación específica de

memoria si el acumulador es cero

Alto. El programa completó su tarea.

Figura 1. Códigos de operación del Lenguaje de máquina Simpletron (LMS) El primer programa en LMS (figura 2) lee dos números del teclado, calcula e imprime la su suma. La instrucción +1007 lee el primer número del teclado y lo coloca en la ubicación 07 (que se ha inicializado con 0). Después, la instrucción +1008 lee el siguiente número y lo coloca en la

Page 3: Simpletron

ubicación 08. La instrucción carga, +2007, coloca el primer número en el acumulador y la instrucción suma, +3008, suma el segundo número al número en el acumulador. Todas las instrucciones LMS aritméticas dejan sus resultados en el acumulador. La instrucción almacena, +2109, coloca el resultado devuelto en la ubicación de memoria 09, desde la cual la instrucción escribe, +1109, toma el número y lo imprime (como un número decimal de cuatro dígitos con signo). La instrucción alto, +4300, termina la ejecución.

Ubicación Número Instrucción

00 01 02 03 04 05 06 07 08 09

+1007 +1008 +2007 +3008 +2109 +1109 +4300 +0000 +0000 +0000

(Lee A) (Lee B) (Carga A) (Suma B) (Almacena C) (Escribe C) (Alto) (Variable A) (Variable B) (Variable C)

Figura 2. Programa LMS que lee dos enteros y calcula la suma. El segundo programa LMS (Figura 3) lee dos números desde el teclado, determina e imprime el valor más grande. Observe el uso de la instrucción +4107 como una transferencia de control condicional, en forma muy similar a un if.

Ubicación Número Instrucción

00 01 02 03 04 05 06

+1009 +1010 +2009 +3110 +4107 +1109 +4300

(Lee A) (Lee B) (Carga A) (Resta B) (Salto si acumulador es negativo a 07) (Escribe A) (Alto)

Page 4: Simpletron

07 08 09 10

+1110 +4300 +0000 +0000

(Escribe B) (Alto) (Variable A) (Variable B)

Fig. 3 Programa LMS que lee dos enteros y determina cuál 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 números positivos. Calcular e imprimir la suma.

b) Usar un ciclo controlado por contador para leer siete números, algunos positivos y otros negativos, y calcular e imprimir su promedio.

c) Leer una serie de números, determinar e imprimir el número más grande. El primer número leído indica cuántos números 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 técnica de la simulación 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 aplicación 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 diálogo 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 máquina 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 botón, “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 botón “Ejecutar” corre el programa, mientras que “Ejecutar Paso a paso” solo hace una instrucción por vez. La intefaz también tiene una “Consola” llamada “Consola LMS” que muestra los mensajes producidos por Simpletron

Page 5: 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 Simpletrón”. Note como la primera instrucción +1007 fue colocada en la posición 0 de memoria, la +1008 en la posición 1 y así sucesivamente. La ejecución comienza en la ubicación 0 y como en cualquier lenguaje de programación, continúa 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

Page 6: Simpletron

Use la variable “acumulador” para representar el registro acumulador. Use la variable “contadorDePrograma” para llevar el registro de la instrucción de la ubicación de memoria que se está ejecutando. Use la variable “codigoDeOperacion” para indicar la operación que se esté realizando actualmente (es decir, los dos dígitos a la izquierda en la palabra de instrucción). Use la variable “operando”para indicar la posición de la memoria en la que operará la instrucción actual. Por lo tanto, operando está compuesta por los dos dígitos más a la derecha de la instrucción que se esté ejecutando en esos momentos. No ejecute las instrucciones directamente desde la memoria. En vez de eso, transfiera la siguiente instrucción a ejecutar desde la memoria hasta una variable llamada “registroDeInstruccion”. Luego “recoja” los dos dígitos a la izquierda y colóquelos en “codigoDeOperacion”, después “recoja” los dos dígitos a la derecha y colóquelos en “operando”. Cuando Simpletron comience con la ejecución, todos los registros especiales se deben inicializar con cero. Ahora vamos a “dar un paseo” por la ejecución de la primera instrucción LMS. +1009 en la ubicación de memoria 00. A este procedimiento se le conoce como ciclo de ejecución de una instrucción (fetch, decode, execute). El “contadorDePrograma” nos indica la siguiente instrucción a ejecutar. Nosotros buscamos el contenido de esa ubicación de memoria, utilizando la siguiente instrucción: registroDeInstruccion = memoria[ contadorDePrograma ]; El código de operación y el operando se extraen del registro de instrucción, mediante las instrucciones (fetch): codigoDeOperacion = registroDeInstruccion / 100; operando = registroDeInstruccion % 100; Ahora, Simpletron debe determinar que el código de operación es en realidad un LEE en comparación de ESCRIBE, CARGA, etcétera (decode). Una instrucción switch establece la diferencia entre las 12 operaciones de LMS. En la instrucción switch se simula el comportamiento de varias instrucciones de LMS, como se mestra en la figura 5. En breve hablaremos sobre las instrucciones de bifurcación (salto) y dejaremos las otras a usted.

Instrucción Descripción

LEE: CARGA: SUMA: ALTO:

Muestra el “Dialogo de entrada” (fig. 6) que recibe como entrada un entero y se almacena en la ubicación memoria[operando]= entrada; acumulador = memoria[operando]; acumulador += memoria[operando]; Esta instrucción 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

Page 7: Simpletron

Figura 6. Dialogo de entrada al ejecutar la instrucción +1007 (LEE 7) Cuando el programa en LMS termine de ejecutarse, deberán de mostrarse la consola LMS, el valor de los registro, así como el contenido completo de la memoria (Fig 4). A este tipo de impresión se le denomina vaciado de la computadora. Para ayudarlos a programar su método 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 ejecución. Procedamos ahora con la ejecución de la primera instrucción de nuestro programa, +1007 en la ubicación 00. Como lo hemos indicado, la instrucción switch simula esta tarea pidiendo al usuario que escriba un valor, leyendo el valor y almacenándolo en la ubicación de memoria[ operando ]. A continuación este valor se lee (figura 6) y se coloca en la posición de memoria 07. En este punto se ha completado la simulación de la primera instrucción. Todo lo que resta es preparar a Simpletron para que ejecute la siguiente instrucción. Como la instrucción que acaba de ejecutarse no es una transferencia de control, solo necesitamos incrementar el registro contador de programa de la siguiente manera: ++contadorDePrograma;

Page 8: Simpletron

Esta sección completa la ejecución simulada de la primera instrucción. Todo el proceso (es decir, el ciclo de ejecución de una instrucción) empieza de nuevo, con la búsqueda de la siguiente instrucción a ser ejecutada, Ahora veremos como se simulan las instrucciones de bifurcación (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 instrucción de bifurcación incondicional (40) se simula dentro de la instrucción switch como: contadorDePrograma = operando; La instrucción 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 características adicionales y ofrecerlas a su simulador. Su simulador debe comprobar diversos tipos de errores. Por ejemplo, durante la fase de carga del programa, cada número que el usuario escribe en la memoria de Simpletron debe encontrarse dentro del rango -9999 a +9999. Su simulador debe probar que cada número introducido se encuentre dentro de este rango y, en caso contrario, seguir pidiéndole al usuario que vuelva a introducir el número hasta que introduzca un número correcto. Durante la fase de ejecución, su simulador debe comprobar varios errores graves, como los intentos de dividir entre cero, intentar ejecutar códigos de operación inválidos, y desbordamientos del acumulador (es decir, las operaciones aritméticas 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 ejecución de Simpletron se terminó en forma anormal *** Y deberá imprimir un vaciado de computadora completo en el formato que vimos anteriormente. Este análisis 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 máquina codigoDeOperacion operando Ensamblador

+1007 +1008 +2007 +3008 +2109 +1109 +4300 +0000 +0000 +0000

10 10 20 30 21 11 43 0 0 0

07 08 07 08 09 09 00 0 0 0

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

Figura 7. Decodificación de instrucciones y ensamblado en Simpletron.