PDA

View Full Version : ambiente di svilluppo C


antyf
05-11-2001, 19:04
Devo scrivere un assemblatore e un simulatore dell'8086. Il mio prof dice che non vale la pena usare il C++ perchè secondo lui è come sparare ad una farfalla con un cannone...devo usare il C. Ho UltraEdit-32, posso configurarlo al meglio per farlo funzionare il sinergia con un compilatore C? Quale compilatore mi consigliate?

Se qualcuno di voi ha fatto questo progetto come esame può darmi qualche dritta e/o links utili?

Grazie mille ragà

cionci
05-11-2001, 20:08
Che intendi per assemblatore ?

Il simulatore non è difficilissimo...è abbastanza meccanico e palloso...

misterx
05-11-2001, 20:47
Originariamente inviato da cionci
[B]Che intendi per assemblatore ?

Il simulatore non è difficilissimo...è abbastanza meccanico e palloso...


non mi dire che è una lunga serie di IF.....:)

cionci
05-11-2001, 21:00
Originariamente inviato da misterx
[B]


non mi dire che è una lunga serie di IF.....:)
Poco di più...se non vuoi fare una serie di if ti fai un file di dati indicizzati che poi carichi in memoria...

Dopo tutto si tratta di :

1) riconoscere l'istruzione (fase di fetch)
2) caricare gli operatori (se ci sono si vede dalla codifica opcode) (fase di load)
3) fare l'operazione implicata dall'istruzione e eventuale lettura/scrittura in memoria o nei registri (fase di execute e di store)

La struttura di memoria è molto semplice....il simulatore si deve tenere 2 buffer di memoria da 64Kbyte ciuascuno...uno per il segmento codice (il codice deve venire subito caricato in memoria, così fa ogni sistema operativo) e uno per i dati...

Un'altra struttura deve contenere i vari registri del processore virtuale...

La parte più lunga è lo studio di come viene formato il codice operativo e di come vengono codificati gli operatori...il + complesso dovrebbe essere il mov...pensare che alle superiori la sapevo a memoria...

cionci
05-11-2001, 23:05
Mi ero dimenticato lo stack segment...altri 64 kb...

Chiaramente se uno vuole aggiungere un supporto all'emulazione più ampio deve permettere il cambio di segmento in runtime...e la condivisione di segmento (come avviene nel modello di memoria Tiny...un solo segmento da 64kb per stack e dati)...

Quindi diciamo che allocando un buffer di 1 Mb per la memoria di sistema si può fare tutto...

Poi se si vuole andare oltre si può prevedere il riconoscimento delle più semplici interruzioni software...per gestire qualche rudimento di I\O...

antyf
05-11-2001, 23:28
ehm...
io dovrei cominciare con studiare l'architettura dell'8086 :rolleyes:
cmq l'assemblatore deve operare in 2 passaggi e mi sa tanto che avete ragione: sarà una lunga case...
Il prof non vuole che il sorgente venga caricato tutto in memoria perchè si presume che ad assemblare sia una macchina con poca RAM.
Il simulatore deve tener conto delle istruzioni elementari di I/O (deve saper gestire tastiera e schermo) e non deve simulare il microcodice delle istruzioni.

Posso contare sul vostro aiuto? :D

Riguardo l'editor e il compilatore C da usare che mi dite?

cionci
05-11-2001, 23:36
Allora non ho capito...

Cosa intendi per assemblatore e simulatore ?

cionci
05-11-2001, 23:38
Originariamente inviato da antyf
[B]iRiguardo l'editor e il compilatore C da usare che mi dite?
Come compilatore ti consiglio DJGPP...dovrebbe avere anche l'editor integrato...è un compilatore C++, ma credo che tu lo possa usare anche come compilatore C...

antyf
05-11-2001, 23:51
dobbiamo realizzare un programma che legge un sorgente assembler per processore 8086 e lo traduce in linguaggio macchina. Successivamente questo programmino in linguaggio macchina deve essere caricato ed eseguito da un altro programma fatto da noi che deve simulare l'esecuzione dell'8086, senza gestire interrupt e routine del sistema operativo (chiaramente) ma gestendo l'I/O della tastiera e del monitor.

Dovrei avere il compilatore C++ della Borland, che scaricai diversi mesi fa dal suo sito, pensi sia buono?

Grazie

cionci
05-11-2001, 23:58
Mi manca ancora un punto...il simulatore hai detto che cimula solo i/o...ma le istruzioni in linguaggio macchina del programma assemblato chi le esegue ? Come fai ad interfacciare il simulatore con il programma assemblato ?

Il compilatore Borland va benissimo...

antyf
06-11-2001, 00:10
il simulatore simula ANCHE I/O, le uniche cose che non bisogna simulare sono gli interrupt

cionci
06-11-2001, 00:15
Ok...allora sottoscrivo tutto quello che ti ho detto prima...
Per caricare tutto il programma in memoria...intendevo dire che il simulatore deve caricare tutto il programma in memoria...

Per il simulatore alloca 1 Mbyte...che in effetti è tutto lo spazio fisico indirizzabile da un 8086...

antyf
06-11-2001, 00:46
cionci in un post di qualche tempo fa lessi che per un esame avevi scritto un compilatore: per quale linguaggio? quanto tempo ci hai messo?

cionci
06-11-2001, 00:57
Era un compilatore C++ un po' ristrestto...

Funzioni con passaggio di parametri, solo interi con aritmetica di base...input e output di base...scope locale o globale delle variabili...

Ci ho emsso circa 2 mesi (lavorandoci una decina di ore settimanali)...ed eravamo in due...

Un assemblatore è molto + semplice...il compilatore deve fare anche un parsing completo...deve riconoscere blocchi a + livelli e roba del genere...l'albero derivato dal parsing può avere una profondità anche notevole...

Su un assemblatore tutte le istruzioni stanno allo stesso livello e come figli hanno i parametri che sono al + due...

Un simulatore lo abbiamo fatto per una CPU didattica...pensa che era scritto in assembler ;)

Assemblatori non ne ho fatti...ma in pratica dovrebbe fare un primo passaggio per sostituire le etichette con gli indirizzi relativi di memoria delle variabili, per indicizzare il codice (associando ad ogni istruzione la sua lunghezza e la posizione nel segmento) e sostituire le etichette di salto con l'indirizzo di salto all'interno del segmento...poi il secondo passaggio deve fare la traduzione vera e propria...

antyf
09-11-2001, 09:16
mi date dei links per l'architettura dell'8086? mi serve materiale il più approfondito possibile

cionci
09-11-2001, 10:29
http://www.itassembly.cjb.net/

cionci
09-11-2001, 11:04
ftp://download.intel.com/support/controllers/peripheral/231455.pdf

In fondo a questo documento c'è il codice operativo di ogni istruzione...

antyf
09-11-2001, 12:10
Grazie cionci, sei sempre molto disponibile

cionci
10-11-2001, 09:36
Niente ;) Fammi sapere come prosegue...

antyf
19-11-2001, 15:45
Sto vedendo un pò di realizzare la procedura che deve analizzare il sorgente su disco per assemblarlo. Secondo voi è più conveniente leggere una riga alla volta (con quale istruzione?), metterla in una stringa e farci tutti i controlli, oppure leggere un char alla volta e controllare al momento se EOF, \n, " ", ect..?
Sto da 3 ore sulla seconda soluzione ma mi sembra quasi impossibile.
Se potete, mi date una mano?

cionci
19-11-2001, 21:32
Per il compilatore C++ leggevo fino a quando non trovavo una parola valida.
Ma per me la situazione era diversa...

if(pippo==3) pippo++;

è equivalente a

if(pippo==3)

pippo++;

Mentre a te conviene leggere una riga intera...

OPCODE dst , src

Usa questo algoritmo :

Leggi una riga intera
Elimina gli eventuali spazi in testa (con la funzione isspace di ctype.h)
Metti i caratteri validi in una stringa che rappresenta il codice operativo. Se non riconosci un operatore valido genera un errore.
Se l'opcode necessita di un operatore elimina gli spazi fino al primo carattere valido e metti i caratteri validi fino alla ',' o alla fine della riga nella stringa operatore1 (elimina gli spazi). Se non c'è un operatore genera un errore.
Se l'opcode necessita di un altro operatore elimina gli spazi fino primo carattere valido dopo la virgola e metti i caratteri validi da lì fino alla fine della riga (eliminando sempre gli spazi) nella stringa operatore2.

Ora è il momento di valutare se gli operatori sono validi...ti consiglio di farti una specie di file di dati in cui specifichi quali sono i possibili tipi di operatori validi sia per src che per dst per ogni opcode.

Ciao !!!

antyf
20-11-2001, 00:18
Sai cionci, come dici tu andrebbe bene, solo che devo soddisfare le "direttive" del prof. Lui vuole che si crei a priori un file di testo ordinato che contenga il nome dell'OPCODE e la sua traduzione in binario (una rappresentazione con caratteri 0 o 1, non vero binario). Quando si va ad analizzare il sorgente, per semplicità non bisogna far controlli sulla validità degli OPCODE e operandi, oltretutto la riga deve essere formattata, es. da 0 a 10 label (opzionale,chiaro), da 11 a 20 OPCODE, da 21 a 41 operando/i, commento. Mentre leggiamo, dobbiamo costruire una tabella che contenga label, opcode, operandi, ecc. tutto questo nella prima passata. Nella seconda, leggendo si vanno a sostituire gli opcode facendo uso della tabella ordinata, le variabili, le label ecc. Ora, voglio abbozzare l'algoritmo della prima passata senza scendere troppo nei dettagli della sintassi, perchè giovedì mattina lo confronterò con quello fatto dagli altri 3 amici del mio grupppetto, e ne discuteremo, cercando di farne uscire qualcosa di positivo.
La vera fregatura è che, non avendo pratica ed esperienza in questo tipo di programmazione, contavo di aiutarmi con i costrutti e i suggerimenti che ci sono sul libro di Stroustrup, che avevo cominciato a masticare (contenitori standard e roba varia), poi il prof ha niente C++...
cionci se potessi continuare a darmi delle dritte te ne sarei molto grato, ciao.

ArtificialBoy
20-11-2001, 00:31
eheh... :)

antyf, il tuo prof sara' mica quel gran...ehm...del Prof Refice del Politecnico di Bari?

...vista la tua location direi di si'... :D

anch'io devo fare al piu' presto quell'esame... ma non mi decido mai a cominciare...

tu sei ad Elettronica o Informatica? stai seguendo il corso quest'anno?

cionci
20-11-2001, 08:32
Originariamente inviato da antyf
[B]cionci se potessi continuare a darmi delle dritte te ne sarei molto grato, ciao.
Se il testo è formattato è + semplice...
In ogni caso ti onviene leggere una riga intera...

Se da 0 a 10 non trovi una stringa di caratteri validi (solitamente formata numeri e lettere...puoi usare isalpha e isnumber smpre della ctype) significa che non c'è label...
Se da 11 a 20 non trovi una stringa di caratteri validi significa che la riga è vuota...altrimenti scrivi l'opcode tradotto nel file intermedio, anche se secondo me per fare la traduzione devi in gni caso verificare che l'opcode sia valido, perchè se cerchi nella tua struttura in memoria e non trovi alcuna entry valida sinigica che ll'istruzione non è valida.
A questo punto supponendo che da 21 a 41 scrivi tutto quello che trovi direttamente sul file intemedio.
Poi da 41 in poi è un commento e anche quello lo scrivi nel file intermedio.
Credo che in questo modo vada bene...

antyf
20-11-2001, 11:03
x ArtificialBoy: sto ad Informatica, e tu? forse ci conosciamo. Il corso ci stiamo alternando in gruppo a seguirlo, perchè tanto sai bene che Refice dice poco. Quando comincerai, compagno di "sventura"? :D
Visita il mio sito e se ti va iscriviti al forum, più diventiamo, meglio possiamo scambiarci info. Fatti sentire

x cionci: grazie, ti faccio sapere cosa combino. P.S. per ora nel mio forum non c'è una sezione programmazione, non c'è ancora niente per la verità, cmq se un giorno l'introdurrò mi piacerebbe averti come superesperto :) (se ci sarà un giorno e se ti andrà, chiaro). A presto

cionci
20-11-2001, 15:23
Grazie ;)

Ciao

antyf
07-12-2001, 19:16
dovrei applicare un algoritmo di hashing per memorizzare delle stringhe: conosco solo quello che utilizza il resto. Ce ne sono altri più evoluti e complessi e se si potete illustrarmene qualcuno? Thanx

cionci
07-12-2001, 19:24
Originariamente inviato da antyf
[B]dovrei applicare un algoritmo di hashing per memorizzare delle stringhe: conosco solo quello che utilizza il resto. Ce ne sono altri più evoluti e complessi e se si potete illustrarmene qualcuno? Thanx
Che intendi per hashing ? L'unica cosa che riguarda l'hashing che conosco sono le funzioni di hash, ma servono per la sicurezza...

antyf
07-12-2001, 19:32
per hash intendo l'algoritmo usato per gestire una struttura ad accesso calcolato. L'algoritmo permette di generare un indirizzo a partire da un valore assunto dalla stringa (nel mio caso). In questo modo, se l'algoritmo è fatto bene e quindi si hanno relativamente pochi casi di collisione (da gestire opportunamente), la ricerca è ottimizzata al max

cionci
07-12-2001, 19:36
Hai qualche esempio di algoritmo di hashing o qualche link ? Grazie....

antyf
07-12-2001, 19:55
link non ne ho perchè non ho ancora cercato, cmq l'esempio te lo posso fare dicendoti per cosa devo utilizzarla io.
Mi serve per memorizzare le label del sorgente e associarle all'indirizzo.

Creo un array di dimensioni opportune (pesate sul numero di label che dovrei memorizzare) preferibilmente la dimensione deve essere un numero primo
l'array memorizzerà una struttura formata da un campo testo per la label, un campo per l'indirizzo, un puntatore ad una struttura dello stesso tipo
per memorizzare sommo il valore numerico del codice ASCII di ciascuna lettera che compone la label, la divido per la dimensione dell'array e uso il resto come indice per l'array
Se a quella posizione l'array è vuoto, ci scrivo la mia struttura, se è pieno (collisione) creo una nuova struttura e ne metto l'indirizzo nel puntatore della struttura che ho trovato piena. Potrebbe succedere che la collisione ia più di una, ma si gestisce allo stesso modo
Quando devo leggere, applico l'algoritmo alla parola della label e mi ricavo l'indice. Leggo: se è quello che voglio Ok, altrimenti continuo controllando le strutture puntate da quelle precedenti

Quello che a me interessava sapere è se esiste un algoritmo più efficiente di quello del resto, dimodoché limitare le collisioni.

cionci
07-12-2001, 20:18
Capito...è molto interessante...

Dipende se vuoi o meno limitare il numero di elementi in memoria...altrimenti di algoritmi sicuramente + efficienti ne puoi trovare di sicuro...

xtaojr
07-12-2001, 22:48
x Antyf
Anch' io devo fare il tuo stesso progetto (8086) e conoscendo Refice so che sarà molto duro.
Sto seguendo il corso di Sistemi di Elaborazione I di Ingegneria informatica al Politecnico di Bari e confido nel terminare il progetto entro febbraio.
Per caso hai seguito la lezione del 06/12/2001 nella quale ha spiegato la funzione "fwrite" del C? Bhè ti dirò che ha detto molte cazzate e non è la prima volta.
Comunque sia in bocca al lupo.

antyf
08-12-2001, 00:36
Originariamente inviato da xtaojr
[B]x Antyf
Anch' io devo fare il tuo stesso progetto (8086) e conoscendo Refice so che sarà molto duro.
Sto seguendo il corso di Sistemi di Elaborazione I di Ingegneria informatica al Politecnico di Bari e confido nel terminare il progetto entro febbraio.
Per caso hai seguito la lezione del 06/12/2001 nella quale ha spiegato la funzione "fwrite" del C? Bhè ti dirò che ha detto molte cazzate e non è la prima volta.
Comunque sia in bocca al lupo.

no, non c'ero ma so che il giorno prima ha detto che se la sarebbe andata a rivedere...:D

teniamoci in contatto, se ti va iscriviti al mio forum

in bocca al lupo anche a te :)