Ho solo immaginato come fare un simulatore di una CPU niente di più...
Ma per la forma del file assemblato ? Non deve essere un file eseguibile...vero ?
Mi fai un esempio di sorgente che deve essere possibile assemblare ? Come definisci i segmenti codice e dati ?
Per l'assemblatore io lo farei in 2 passaggi...
Prendiamo per esempio questo codice sorgente (mi sono inventato la sintassi dei segmenti) :
Codice:
.DATA
Vett BYTE 10 DUP(0) ;Un vettore pieno di 0
Indice BYTE 0H ;Indice inizializzato a 0
END .DATA
.CODE
Ciclo:
INC Indice
CMP Indice, 10
JB Ciclo
END CODE
Primo passaggio : si individua la lunghezza delle istruzioni (basta individuare l'istruzione e la posizione delle etichette nel segmento dati nel segmento codice...
Nel frattempo secondo me conviene riscrivere il sorgente in una versione intermedia...
Codice:
.DATA
0000 BYTE 10 DUP(FAH) ;Un vettore di 10 elementi pieno di FA
000A BYTE 0H ;Indice inizializzato a 0
END .DATA
.CODE
0000 MOV BX, Indice
0004 INC Vett[BX]
0008 INC Indice
000C CMP Indice, 10
00F0 JB Ciclo
END CODE
Ho supposto le lunghezze delle istruzioni (solo della MOV sono sicuro che sia 4 byte)...
In memoria ti dovrai costruire due tabelle...una per le etichette del segmento dati...una per le etichette del segmento codice...
Codice:
Etichette Dati
Vett 0000
Indice 000A
Etichette codice
Ciclo 0000
Volendo puoi scrivere queste tabelle nel file intermedio... Ti potrebbe tornare utile (molti assemblatori lo fanno)...
Ora il secondo passaggio : costruire il file assemblato...
Qui se non si devono rispettare le specifiche per i file OBJ si fa molto presto... Fissiamo la dimensione del nostro segmento dati a 65536...
Scriviamo il segmento dati...
FAFAFAFAFAFAFAFAFAFA00 e dopo tutti 0 fino a 65535...
Ora bisogna scrivere il segmento codice e quindi fare la traduzione vera e propria...
Qui vi serviranno le due tabelle che vi siete creati in memoria per tradurre le etichette in numeri...
Ad esempio INC Vett[BX]... L'istruzione che dovete tradurre è questa INC CS:[BX + 0000]...
Le tabelle di traduzione in linguaggio macchina la potete trovare sul sito Intel...
Dopo per caricare ils egmento dati e il segmento codice in memoria basterà caricare i primi 65536 in data[65536] e il segmento codice in code [65535]...
Inizializzare regs.ip a 0, bp a 0 e sp a 65535 e cominciare l'esecuzione (facendo la traduzione inversa)...