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.