Discussione: L'Intel 8086
View Single Post
Old 23-11-2002, 11:41   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
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)...
cionci è offline   Rispondi citando il messaggio o parte di esso