Información general: En última instancia, me gustaría escribir un emulador de una máquina real como la Nintendo o Gameboy original. Sin embargo, decidí que tenía que comenzar en un sitio mucho, mucho más simple. Mi asesor/profesor de informática me ofreció las especificaciones para un procesador imaginario muy simple que él creó para emular primero. Hay un registro (el acumulador) y 16 códigos de operación. Cada instrucción consta de 16 bits, los primeros 4 de los cuales contienen el código de operación, el resto de los cuales es el operando. Las instrucciones se dan como cadenas en formato binario, por ejemplo, "0101 0101 0000 1111".Preguntas sobre la implementación de un simulador de CPU simple
Mi pregunta: En C++, ¿cuál es la mejor manera de analizar las instrucciones para el procesamiento? Por favor, tenga en mente mi objetivo final. He aquí algunos puntos que he considerado:
No puedo proceso y ejecutar las instrucciones que los leo porque el código es auto-modificable: una instrucción puede cambiar una instrucción más tarde. La única forma en que puedo ver para evitar esto sería almacenar todos los cambios y para cada instrucción verificar si se debe aplicar un cambio. Esto podría conducir a una gran cantidad de comparaciones con la ejecución de cada instrucción, lo cual no es bueno. Y entonces, creo que tengo que recompilar las instrucciones en otro formato.
Aunque podría analizar el código de operación como una cadena y procesarlo, hay casos en que la instrucción como un todo debe tomarse como un número. El código de operación de incremento, por ejemplo, podría modificar incluso la sección de código de operación de una instrucción.
Si tuviera que convertir las instrucciones en enteros, no estoy seguro de cómo podría analizar solo el código de operación o la sección operando de la int. Incluso si tuviera que recompilar cada instrucción en tres partes, toda la instrucción como un int, el opcode como un int y el operando como un int, eso aún no resolvería el problema, ya que podría tener que incrementar una instrucción completa y luego analizar el código de operación afectado o el operando. Además, ¿tendría que escribir una función para realizar esta conversión, o hay alguna biblioteca para C++ que tenga una función que convierta una cadena en "formato binario" en un entero (como Integer.parseInt (str1, 2) en Java)?
Además, me gustaría poder realizar operaciones como el cambio de bits. No estoy seguro de cómo se puede lograr eso, pero eso podría afectar la forma en que implemente esta recopilación.
¡Gracias por cualquier ayuda o consejo que pueda ofrecer!
Tenía la esperanza de que alguien mencionara un concepto como este. Sin embargo, nunca lo había usado antes, así que tendré que investigar más. ¡Gracias! –
¡Ahh, recuerdos de proyectos universitarios! – sdg
+1. Este es el enfoque básico que debes tomar. El punto clave aquí, Brandon, en relación con su pregunta, es que para abordar esto normalmente, debe llegar al "código máquina", que será la matriz de bytes en una matriz que representa el espacio de direcciones de su computadora virtual. Entonces, si las instrucciones editan la memoria (código), no haces nada especial, simplemente sigues las instrucciones y deberían hacer lo correcto dentro de tu gran matriz de memoria virtual. IOW, necesita tanto el ensamblador (la herramienta que traduce cadenas de texto en bytes de instrucciones) como el emulador, lo que se ejecuta –