Nel percorso di sviluppo del nostro simulatore di CPU Simpletron, uno dei componenti fondamentali è l’assemblatore. Dopo aver completato la prima passata per l’identificazione delle etichette, in questo secondo capitolo ci immergiamo nel cuore della traduzione: la trasformazione del codice mnemonico in linguaggio macchina eseguibile.
Mentre la prima passata serve a popolare la Symbol Table con i nomi delle etichette e i relativi indirizzi di memoria, la seconda passata rilegge il file sorgente per generare il codice finale. Un passaggio cruciale all’inizio di questa fase è l’uso della funzione rewind, che permette di riportare il puntatore all’inizio del file di input.
Per poter tradurre comandi come READ, LOAD o STORE, è necessario definire una struttura dati che associ ogni stringa mnemonica al suo OP code (codice operativo). Nel video viene definita una struttura instruction_t e una tabella contenente le 12 istruzioni del linguaggio SML, tra cui:
- I/O:
READ(10),WR(11) - Caricamento/Memorizzazione:
LOAD(20),STORE(21) - Aritmetica:
ADD(30),SUB(31),DIVIDE(32),MULTIPLY(33) - Controllo:
BRANCH(40),BRANCHNEG(41),BRANCHZERO(42),HALT(43)
Il processo di traduzione avviene riga per riga utilizzando funzioni come strtok per isolare i token. Il sistema deve distinguere tra:
- Codici Mnemonici: Trovati tramite la funzione
find_instruction. - Indirizzi Immediati: Valori numerici diretti.
- Simboli/Etichette: Identificati tramite la
find_symbolnella tabella creata in precedenza.
Il codice finale viene composto come (OP_CODE * 100) + ADDRESS, producendo un valore a 5 cifre pronto per essere caricato nella memoria del Simpletron.
Un buon assemblatore non deve solo tradurre, ma anche guidare il programmatore. Nel video viene mostrato come implementare la gestione degli errori:
- Symbol not found: Quando si fa riferimento a un’etichetta mai definita.
- Syntax Error: Quando viene inserita una parola chiave non riconosciuta.
Parallelamente al file oggetto (il codice macchina), viene generato un file di listing. Questo file è essenziale per il debug, poiché mostra in modo allineato l’indirizzo di memoria, il codice generato e la riga originale del sorgente.
Un’istruzione speciale gestita in questa fase è WORD, parola chiave interpretata direttamente dall’assemblare. Essa permette di riservare celle di memoria e inizializzarle con valori specifici, fondamentale per definire costanti o variabili di lavoro all’interno dei nostri programmi SML.
Il video si conclude con un test pratico su un simulatore di CPU, mostrando come un semplice programma che esegue un conto alla rovescia da 5 a 1 venga correttamente assemblato ed eseguito.
Questo progetto non è solo un esercizio di stile in C, ma una base fondamentale per comprendere come funziona l’informatica a basso livello, dai set di istruzioni alla gestione della memoria hardware.
Ti è piaciuto questo tutorial? Iscriviti al canale Alexa Academy per altri approfondimenti sullo sviluppo in C e sull’elettronica!
