Newsgroup: it.comp.lang.c++
Titolo: Assemblatore e un simulatore dell'8086

 Cosa devo sapere e come dovrei impostare il lavoro per fare un assemblatore
e un simulatore dell'8086 in C++????
Tnk 1000

Progettino??? :-)
Beh, certamente devi fissare il set di istruzioni che intendi simulare.
Poi dovresti spiegare meglio cosa devi fare esattamente...
Saludos
Sini Andrea

E che nn so bene come devo operare.
Voi che mi dite?

 Voi che mi dite?
io dico che oltre al processore devi decidere
anche quale hardware simulare (gestione degli
interrupt, porte di I/O, eventuale video e
tastiera ecc.) perchè comunque con qualcosa il
tuo programma assembler deve interagire...

Cioe tipo un HHD ???

devi simulare solo il processore?
puoi simulare un imput ed un output su memoria (senza schede video etc...per
bon complicare ulteriormente le cose)
poi devi scegliere il set di istruzioni
mov op1,op2
etc..
cmq è complicato quello che vuoi fare e non è banale farlo :-))
Max

Dimenticavo, se ti interessa qualcosa di più specifico chiedi pure
ciao ciao
Max

 Max
Ma almeno mi sprona a conoscere di + che IMHO è quello che dovrebbe spingere
un programmatore ;)

 e un simulatore dell'8086 in C++????
Dipende molto da cosa devi fare.
Se vuoi leggere un disassemblato e interpretarlo è un conto se vuoi invece
una emulazione tipo VMWare per inderderci, allora è una cosa da mega
esperdsdti e non saprei francamente da dove partire, forse però c'è qualcosa
di opensource.
Nel primo caso invece io farei un programma in C++ che alloca una congrua
quantità di memoria, che riesca a trasformare l'assembly in codice macchina
(ti serve un buon manuale di 8086), con un sistema simile ai tokenizer dei
compilatori, poi il tuo programma dovrà riuscire a leggere il codice e ad
interpretarlo.
Magari puoi anche implementare gli interrupt principali, non è impossibile,
ma qualcosa di simile a VMWare è un'altra cosa...
Crei un'interfaccia tipo monitor (assembler), vedi ad esempio il comando
DEBUG del prompt di MS-DOS, che assembla, disassembla, esegue codice e
gestisce l'I/O su file per leggere e scrivere l'immagine della tua memoria.
Se interpreti il codice, puoi anche creare un debugger elementare.
Però l'argomento è OT quindi mi sono spinto anche oltre...
Come si fa??? Col C++ ovviamente! Studiati qualche tecnica di parsing e la
teoria dei compilatori, ti può essere utile!
Ciao.

Non una lunga serie di if....
ma bensì dovrai creare una struttura (tabella) con i relativi opcode da un
aparte e le relative interpretazioni dall'altra,
poi una funzione centrale che preso una linea di codice trova il suo
identificatore e puntando nella tabella attraverso l'identificatore ne
interpreta la specifica funzione... questo andrebbe fatto anche per gli
operatori
quindi
mov ax,bx
mov= id1
ax=op1
bx=op2
etc...
id1 nella tabella punterà ad una funzione determinata che agirà a seconda
degli operatori, naturalmente un operatore può essere sostituito anche da un
indirizzo in memoria..
utilizza tabelle quindi.
Massimo

Tabella = array bidimensionale?

yes
anche più che bidimensionale
Max

Mi faresti un esempino scarno di come implementeresti la tabellina????
Tnk

 Tnk
Non ho ben capito se vuoi fare questo lavoro per esercizio
o se hai una reale necessita' di simulare un 8086.
Nel primo caso secondo me hai scelto la CPU peggiore
per queste cose perche' ha dei codici macchina molto
incasinati, di lunghezza variabile, con prefissi vari, con
molte combinazioni illegali, ecc.
Niente di difficile, ma molto noioso da programmare.
Secondo me ti converrebbe considerare un'altra CPU,
magari un RISC.
In ogni caso ti e' indispensabile il manuale della cpu, dove
sono descritti esattamente i codici macchina e le operazioni
che svolgono in tutti i dettagli.

 ha scritto nel messaggio
news:qcNjb.44952$e6.15...@twister2.libero.it...
concordo con Valeria del Monte..
è molto noioso. un risc è sicuramente più interessante.
Array. .. vediamo es:  t[100][100][100]
al primo posto metti il codice dell'istruzione
poi ogni istruzione può avere come operandi dei registri, oppure degli
indirizzi di memoria
poi inserisci l'indirizzo della funzione da chiamare
per semplificare potresti farlo così:
   opcode[10]   opcode è un vettore di indirizzi che puntano a funzioni
etc...
comunque bisogna anche tener conto come dicevo prima deli operandi etc..
Max