PRODIS Technical Reference INTRODUZIONE Il programma PRODIS e' un disassemblatore, cioe' un programma in grado di trasformare istruzioni in linguaggio macchina in codici mnemonici. La caratteristica peculiare di PRODIS e' quella di poter essere istruito su un particolare set di istruzioni, in tal modo e' possibile disassemblare codice di qualsiasi microprocessore a 8 bit, conoscendone il set di istruzioni. PRINCIPIO DI FUNZIONAMENTO GENERALE In un primo tempo viene letto il file del set di istruzioni e vengono caricate nella memoria HEAP le istruzioni in esso contenute. Successivamente si passa alla fase di disassemblamento, durante la quale, per ogni byte letto dal file di input binario si cerca l'istruzione corrispondente. STRUTTURE DI DATI type reg_type Ogni identificatore dichiarato puo' essere: - un identificatore di dato immediato (byte o word); - un identificatore di una lista di registri. type data_type Un dato immediato puo' essere un byte o una word. type simbolo Simboli associati alle entita' che si leggono dal file del set di istruzioni. E cioe' identificatori,caratteri speciali,sequenze di bit etc. type alfa Tipo stringa per gli identificatori. type beta Tipo stringa per le stringhe di testo nei codici mnemonici delle istruzioni. type gamma Tipo stringa per le sequenze di bit. type str_sep Struttura che contiene una stringa di una istruzione. Sono previsti un certo numero di identificatori di lista di registri separati da stringhe ASCII. type rl Elemento di una tabella di registri. type reg Elemento iniziale di una tabella di registri, e quindi inserito nella lista delle tabelle di registri. type code Elemento di codice di un'istruzione (byte). type inst Elemento iniziale di una istruzione, inserito nella lista di istruzioni. var fin,fout,coni,cono,fhex,fnset,fnhex File di ingresso e uscita. var start_byte,segment_len Indirizzo di partenza e lunghezza del segmento da disassemblare nel file binario. var ca,sim Ultimo carattere e ultimo simbolo letti. var id Ultimo identificatore letto. var im Ultima stringa letta. var bs Ultima sequenza di bit letta. var fine EOF del file set di istruzioni. var sims Array dei simboli assegnati ai caratteri letti. var er Array delle stringhe dei messaggi di errore. var reg_list Puntatore alla lista di tabelle di registri. var inst_list Puntatore alla lista di istruzioni. DESCRIZIONE DELLE PROCEDURE procedure errore Stampa del codice e del messaggio di un errore. procedure termina Uscita anticipata al sistema operativo. procedure input Lettura dei nomi dei file. procedure print_info Stampa info. procedure leggisim Legge un simbolo dal file del set di istruzioni in input. procedure leggica Legge un carattere dal file di input. function ric_reg Ricerca di una tabella di registri tramite l'identificatore. function ric_rl Ricerca di un registro in una tabella di registri. function conv Trasforma un byte in una stringa di otto caratteri contenente il valore binario. function numbit Restituisce il numero di bit presente in una sequenza di bit. function numbyte Restituisce il numero di byte di un'istruzione. function str_byte Converte un byte in 2 caratteri esadecimali. function str_word Converte una word in 4 caratteri esadecimali. procedure register Lettura della parte registri del file del set di istruzioni e creazione della lista delle tabelle di registri in memoria HEAP. procedure add_reg Aggiunge una tabella di registri alla lista. procedure add_rl Aggiunge un registro a una tabella. procedure instruction Lettura della parte istruzioni del file del set di istruzioni e creazione della lista delle istruzioni in memoria HEAP. procedure add_inst Aggiunge un'istruzione alla lista. procedure add_code Aggiunge un byte di codice a un'istruzione. procedure verif_corr Verifica che nei byte di codice di un'istruzione siano presenti tutti i bit corrispondenti ai registri dichiarati. procedure disassembler Disassemblamento byte per byte del file di input binario secondo le istruzioni dichiarate nel file del set di istruzioni. procedure lby Leggi un byte dal file binario. function ver_istr Verifica se e' l'istruzione giusta, e leggi gli eventuali dati immediati. procedure read_imm Leggi un dato immediato. function preleva Riconosce tra i bit del codice da disassemblare quelli che dovrebbero appartenere al registro attualmente considerato. procedure stampa_istr Stampa stringhe e dati per ogni istruzione sul file di uscita. MESSAGGI E CODICI DI ERRORE Procedura LEGGISIM 1 Simbolo ( mancante 2 Simbolo ) mancante 3 Simbolo > mancante 4 Simbolo ' mancante 5 Simbolo = mancante 6 IDENTIFICATORE di registro mancante 7 Numero di IDENTIFICATORI troppo elevato in questa STRINGA Procedura REGISTER 20 Parola REGISTER mancante 21 Tipo di dato immediato sconosciuto 22 Simboli < > non permessi in questa STRINGA 23 STRINGA di registro o BITSEQ di registro mancante 24 STRINGA di registro mancante 25 IDENTIFICATORE di registro non dichiarato 26 IDENTIFICATORE di registro mancante 27 Numero di bit in questa BITSEQ di registro diverso da quello della precedente 28 IDENTIFICATORE di registro gia' dichiarato 29 BITSEQ di registro gia' dichiarata in questo gruppo 30 In questa STRINGA sono permessi solo IDENTIFICATORI di registro immediati Procedura INSTRUCTION 40 Numero di bit in questa BITSEQ di codice diverso da 8 41 BITSEQ di codice mancante 42 STRINGA di istruzione mancante 43 Parola END mancante 44 IDENTIFICATORE di registro non dichiarato 45 Lettera ripetuta in 2 codici 46 Lettere ripetuta in un codice 47 Lettera non prevista in un codice 48 Lettera mancante Procedura DISASSEMBLER 60 Dati immediati mancanti 61 Istruzione non trovata PRODUZIONI DELLA GRAMMATICA PRODIS Simbologia della notazione: ( ) racchiudono un sottoinsieme di simboli; [ ] racchiudono un sottoinsieme di simboli che puo' essere saltato; + indica che il sottoinsieme a sinistra puo' essere considerato una o piu' volte; | separa diverse possibilita'; < > racchiudono il nome di un simbolo non terminale (in lettere maiuscole); eventuali commenti sul simbolo non terminale sono presenti all'interno di parentesi tonde; = separa un simbolo non terminale dalla sua definizione. Tutti i restanti caratteri, comprese le lettere minuscole e le cifre, sono simboli terminali; in piu lo sono anche: '(' ')' '<' '>' '=' '+' Produzioni del linguaggio PRODIS : = register instruction END . = ( [,] )+ = ( [,] )+ = '=' '(' ( [,] )+ ')' = '=' = '=' '(' ( [,] )+ ')' = ' [ ]+ [ [ ]+ ]+ ' = '<' ( | )+ '>' = [ | ]+ = #0| ... |#255 = a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z = 0|1|2|3|4|5|6|7|8|9 = 0|1