Informazioni di base: In definitiva, mi piacerebbe scrivere un emulatore di una macchina reale come Nintendo o Gameboy originali. Tuttavia, ho deciso che ho bisogno di iniziare da qualche parte molto, molto più semplice. Il mio consulente/professore di informatica mi ha offerto le specifiche per un processore immaginario molto semplice che ha creato per emulare prima. C'è un registro (l'accumulatore) e 16 codici operativi. Ogni istruzione consiste di 16 bit, i primi 4 dei quali contengono l'opcode, il resto dei quali è l'operando. Le istruzioni vengono fornite come stringhe in formato binario, ad esempio "0101 0101 0000 1111".Domande relative all'implementazione di un semplice emulatore di CPU
La mia domanda: In C++, qual è il modo migliore per analizzare le istruzioni per l'elaborazione? Per favore, tieni il mio obiettivo finale in mente. Qui ci sono alcuni punti che ho preso in considerazione:
Non posso processo ed eseguire le istruzioni come ho letto loro, perché il codice è auto-modifica: un'istruzione può cambiare un'istruzione più tardi. L'unico modo che posso vedere per aggirare questo sarebbe quello di memorizzare tutte le modifiche e per ogni istruzione per verificare se è necessario applicare una modifica. Ciò potrebbe portare a enormi quantità di confronti con l'esecuzione di ogni istruzione, il che non è buono. E così, penso di dover ricompilare le istruzioni in un altro formato.
Sebbene sia possibile analizzare l'opcode come stringa ed elaborarlo, ci sono casi in cui l'istruzione nel suo insieme deve essere considerata come un numero. L'opcode di incremento, ad esempio, potrebbe modificare anche la sezione opcode di un'istruzione.
Se dovessi convertire le istruzioni in numeri interi, non sono sicuro di come avrei potuto analizzare solo la sezione opcode o operando dell'int. Anche se dovessi ricompilare ogni istruzione in tre parti, l'intera istruzione come un int, l'opcode come un int e l'operando come un int, che comunque non risolverebbe il problema, poiché potrei dover incrementare un'intera istruzione e in seguito analizza l'opcode o l'operando interessato. Inoltre, dovrei scrivere una funzione per eseguire questa conversione, o c'è qualche libreria per C++ che ha una funzione per convertire una stringa in "formato binario" in un numero intero (come Integer.parseInt (str1, 2) in Java)?
Inoltre, vorrei essere in grado di eseguire operazioni quali bit di spostamento. Non sono sicuro di come ciò possa essere realizzato, ma ciò potrebbe influire sul modo in cui implemento questa ricompilazione.
Grazie per qualsiasi aiuto o consiglio si può offrire!
Speravo che qualcuno menzionasse un concetto come questo. Non l'ho mai usato prima però, quindi dovrò fare ulteriori ricerche. Grazie! –
Ahh, ricordi di progetti universitari! – sdg
+1. Questo è l'approccio di base che dovresti prendere. Il punto chiave qui, Brandon, relativo alla tua domanda, è che per avvicinarti normalmente, devi arrivare a "codice macchina" che sarà la matrice di byte in una matrice che rappresenta lo spazio degli indirizzi del tuo computer virtuale. Quindi se le istruzioni modificano la memoria (codice), non fai niente di speciale, basta seguire le istruzioni e dovrebbero fare la cosa giusta all'interno del tuo grande array di memoria virtuale. IOW, hai bisogno sia dell'assemblatore (lo strumento che traduce le stringhe di testo in byte di istruzioni) che dell'emulatore, la cosa che esegue –