Proyecto 3: Maquina virtual

En este trabajo realizaremos una maquina virtual, que cumpla los siguientes requisitos:

  • Cumplir con el ciclo de estados de instrucción.
  • El programa debe estar  orientado a objetos.
  • Cada estado debe realizarse siguiendo los pasos especificados en clase.
  • La maquina es capaz de ejecutar código elaborado por el usuario.
  • El programa genera interrupciones al ciclo usando 



La maquina virtual cuenta con varios tipos de objetos, como los buses que se usan para transferir o los registros que sirven para almacenar datos, todos los objetos y sus clases están representados en el siguiente diagrama.

(clic en la imagen para verla más grande)

INSTRUCCIONES Y DATOS GENERALES:

Las instrucciones se forman de una cadena de 16 bits:

0000 000000 000000
  • Los primeros 4 son las instrucciones.
  • Los siguientes 6 son la primera referencia.
  • Los últimos 6 son la segunda referencia.
Nuestras instrucciones son de dos referencias, lo cual significa que en la primera referencia de la operación es donde se almacena el valor resultante, ejemplo:

A + B 

se toma como:

A=A+B


Las operaciones que esta maquina ejecuta (junto a su valor en binario) son:

ADD = 1000  (Suma)
SUB  = 1001 (Resta)
MUL = 1010 (Multiplicación)
DIV  = 1011 (División)
AND = 1100 (Operación lógica AND)
ORR = 1100 (Operación lógica OR)
XOR = 1100 (Operación lógica XOR)

Para esta maquina contamos contamos con 10 espacios para datos, es decir 10 variables.
Nuestras variables abarcan de A a J, es decir, de 0 a 9 respectivamente en la memoria de la computadora.(Aunque se puede aumentar la cantidad de espacios se dejo en 10 por comodidad a la hora de programar)

Entonces, un ejemplo de una operación pasada a código sería:

A=A+C

1000 000000 000010
ADD     A           C

Final -> 1000000000000010

Para la interrupcion, una vez terminada una instrucción se calculara un random de 0 a 3 y en caso de que quede en 1 se realizara la acción de J=J+1;

CODIFICACIÓN:

Este programa necesita de un archivo llamado "code.txt" del cual se tomara el código a ejecutar.
Toda declaración de variable o instrucción se escribe en mayúsculas.

Para declarar un valor se escribe: una letra(A a J), espacio, cantidad.
Ejemplo:
A=35  se entiende como A 35

Para declara una instrucción se escribe: operación, espacio, letra de referencia, espacio, letra  de referencia.
Ejemplo:

A=A+B

queda como ADD A B

Todo espacio de la memoria no usado quedara en 0's.


Muestra de traducción de código a instrucciones en binario:



*En el programa final la parte de la impresión de instrucciones en binario estará comentada así solo se verán los resultados finales. Si desea ver la traducción de su programa quite los  //.



CLASES:


Clase Celda: Este es un espacio de memoria, no cuenta con una cualidad especial mas que ser la base para otras clases.

Clase Registro: Este registro hereda de celda, cuenta con funciones  get y set para establecer el valor almacenado en números binarios y por comodidad una función value() la cual regresa su valor almacenado en decimal.

Clase Bus: Este es una clase cuya función principal es simular que se transfiere de un lugar a otro una cadena bit por bit.

Clase ALU(Unidad lógica aritmética): Este objeto se encarga de ejecutar las instrucciones una vez que ya se hayan decodificado y realizado el fetch a los operados;

Clase Memoria: Esta clase se encarga de ser el almacenamiento principal de la computadora, almacena tanto instrucciones como datos, se pude leer datos de esta y escribir también. Para este proyecto la memoria cuenta con dos funciones especiales: la primera es  traducir el código del usuario a binario y almacenarlo en esta; la segunda función se encarga de realizar un calculo para saber a partir de que lugar en la memoria empieza el programa para que la maquina virtual realice su funcionamiento a partir de esta posición. Cuenta con 64 espacios para instrucciones o datos.

Clase Control unit; Esta es la unidad de control de la maquina virtual, se encarga de controlar a los demás objetos y cumplir con el ciclo de estados para cada instrucción. Cuenta con funciones para cada estado y funciones propias como la de decodificar una instrucción y también para regresar un valor cuando la unidad de control participa directamente en un estado.

OBJETOS:

PC1 (Tipo registro): Apunta a la siguiente instrucción que se va a ejecutar.

MAR (Tipo registro): Se encarga de transferir la dirección del PC al bus de dirección;

MBR (Tipo registro): Se encarga de almacenar el dato regresado por la memoria a través del bus de datos.

IR (Tipo registro): Se encarga de almacenar la instrucción a ejecutarse.

OPC (Tipo registro): Almacena la parte del código de operación de la instrucción.

OP0 (Tipo registro): Almacena la primera referencia (variable) de la instrucción.

OP1 (Tipo registro):Almacena la segunda referencia (variable) de la instrucción.

X (Tipo registro): Almacena el valor de la primera referencia.

Y (Tipo registro):Almacena el valor de la segunda referencia.

RESULT (Tipo registro): Almacena el valor resultante de la operación.

ALU1(Tipo ALU): Realiza las operaciones.

Mem(Tipo memoria): Almacena el código y las variables.

ADR(Tipo bus): Se encarga de transferir una dirección hacia la memoria ya sea para escribir o leer en ella.

CTRL(Tipo bus): Se utiliza para transferir el comando leer o escribir que emite la unidad de control hacia la memoria.

DATA(Tipo bus): Transfiere un dato de o hacia la memoria.


Pruebas  y resultados: 










DESCARGA:

MEGA

*Programa realizado en Visual Studio 2013 si llega a tener problemas a lo mejor tiene que realizar modificaciones.





0 comentarios:

Publicar un comentario

More

Recent Posts

Whats Hot