Università degli Studi di Palermo Facoltà di Ingegneria Il linguaggio macchina Edoardo Ardizzone & Ignazio Infantino Appunti per il corso di Fondamenti di Informatica Corso di Laurea in Ingegneria Informatica
Il linguaggio macchina Come detto, le istruzioni del linguaggio macchina si compongono di due parti: codice operativo (sempre presente) e operandi (uno o più, ma in alcune istruzioni possono anche mancare) A titolo di esempio, prendiamo in considerazione un linguaggio molto semplice, in cui ogni istruzione ha al più un operando, appropriato all architettura che abbiamo illustrato (in questo linguaggio è scritto il programma dell esempio precedente) Se S è la lunghezza (in bit) di una istruzione, si ha: S = M + N dove M è il numero di bit riservati al CO e N è il numero di bit riservati agli operandi. La cardinalità dell insieme delle istruzioni eseguibili, ovvero il numero dei codici operativi differenti, è pertanto inferiore o uguale a 2 M. Invece N è legato al numero di locazioni indirizzabili (2 K ): deve essere N K, affinché tutte le celle di memoria possano essere indirizzate. In realtà, gli indirizzi di memoria possono essere rappresentati anche in forma sintetica, a seconda della modalità di indirizzamento utilizzata E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 2
Il linguaggio macchina Ovviamente la lunghezza S delle istruzioni è in relazione con la lunghezza H delle parole di memoria. Nel nostro esempio assumiamo S = H (ogni istruzione è esattamente contenuta in una cella di memoria), ma nei casi reali S può essere un multiplo di H (una istruzione è contenuta in più celle di memoria consecutive), oppure un sottomultiplo di H (più istruzioni possono essere allocate nella stessa cella di memoria). E anche possibile che la lunghezza delle istruzioni dipenda dall istruzione stessa: in tal caso l unità centrale determina il numero di locazioni di memoria interessate al momento della decodifica del codice operativo. Tenendo presenti le ipotesi fatte (S=H=M + N, con l operando che talvolta può essere assente), siamo adesso in grado di definire il nostro semplice linguaggio macchina. Esso comprende: -istruzioni di load e store dei due registri A e B di ingresso alla ALU, per la lettura e la scrittura in memoria; - istruzioni di lettura (read) e scrittura (write) su periferica (ne ipotizziamo una di input e una di output); E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 3
Il linguaggio macchina -istruzioni relative ad operazioni fra numeri interi: add, dif, mul, div; -istruzioni di salto (jump) incondizionato o condizionato dal valore di A: il salto avviene solo se il bit di segno in SR è posto a 0; -istruzioni di pausa (nop) e di arresto (halt). Riassumendo: CO CO simbolico Formato (simbolico) 0000 loada loada ind 0001 loadb loadb ind 0010 storea storea ind 0011 storeb storeb ind 0100 read read ind 0101 write write ind 0110 add add 0111 dif dif 1000 mul mul 1001 div div 1010 jump jump ind 1011 jumpp jumpp ind 1100 nop nop 1101 halt halt E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 4
Il linguaggio macchina Il programma dell esempio: si tratta di effettuare il calcolo dell espressione (a +b) * (c + d), leggendo i valori delle variabili dal dispositivo di input e scrivendo il risultato sul dispositivo di output. L algoritmo: -leggi i valori di a, b, c e d dal dispositivo di input; -somma i valori di a e b; -salva il risultato parziale; -somma i valori di c e d; -moltiplica il risultato con il parziale precedente; -scrivi il risultato finale sul dispositivo di output; -arresta l esecuzione del programma. Un programma in linguaggio macchina che implementa l algoritmo è il seguente (ogni istruzione è accompagnata da un breve commento): E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 5
Il linguaggio macchina 0 010000000010000 leggi il primo valore (a) e ponilo nella cella 16 1 010000000010001 leggi il secondo valore (b) (cella 17) 2 010000000010010 leggi il terzo valore (c) (cella 18) 3 010000000010011 leggi il quarto valore (d) (cella 19) 4 000000000010000 carica A con il contenuto della cella 16 5 000100000010001 carica B con il contenuto della cella 17 6 011000000000000 somma i due valori (il risultato è in A) 7 001000000010100 salva il risultato parziale nella cella 20 8 000000000010010 carica A con il contenuto della cella 18 9 000100000010011 carica B con il contenuto della cella 19 10 011000000000000 somma i due valori (il risultato è in A) 11 000100000010100 carica B con il contenuto della cella 20 12 100000000000000 moltiplica i due valori (il risultato è in A) 13 001000000010100 salva il risultato nella cella 20 14 010100000010100 scrivi il contenuto della cella 20 15 110100000000000 arresta l esecuzione 16 cella riservata ad a 17 cella riservata a b 18 cella riservata a c 19 cella riservata a d 20 cella riservata al risultato parziale celle libere E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 6
Il linguaggio macchina Esercizio 1: Si prendano in considerazione le tre celle di memoria x, y e z. Si effettui la seguente elaborazione: se x è maggiore di y, si memorizzi x in z, altrimenti si memorizzi y in z. Esercizio 2: Dati due valori di ingresso, n e m, si scriva in uscita n un numero di volte pari ad m. E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 7
Modi di indirizzamento Si è finora supposto che l indirizzo dell operando sia esplicitamente presente nel relativo campo dell istruzione macchina. Si tratta del cosiddetto indirizzamento diretto dell operando: la macchina deve compiere un accesso alla memoria per recuperare l operando. Operando RIC N bit H bit H bit Inoltre l indirizzamento che abbiamo utilizzato è anche assoluto, e questo rende la rilocazione del programma impossibile o comunque estremamente onerosa. Un altro inconveniente è dato dal fatto che, se lo spazio degli indirizzi è grande, questo modo di indirizzamento richiede molti bit, e quindi costringe a campi indirizzi molto lunghi. E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 8
Modi di indirizzamento Per ovviare a tali inconvenienti sono state studiate altre modalità di indirizzamento, alcune delle quali vengono adesso brevemente discusse. Nell indirizzamento indiretto (o differito), l indirizzo effettivo dell operando è contenuto nella locazione di memoria il cui indirizzo è presente nel campo operando RIC N bit Operando H bit H bit L indirizzo effettivo può essere quindi rappresentato in H bit, e non soltanto in N bit. Si deve però effettuare un accesso in più alla memoria per recuperare l operando. Inoltre l indirizzo è ancora espresso in modo assoluto. E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 9
Modi di indirizzamento Nell indirizzamento tramite registro indice, l indirizzo effettivo dell operando è ottenuto sommando il contenuto di un registro della CPU, detto indice, al contenuto del campo operando: I + Operando RIC N bit H bit H bit L indirizzo effettivo può essere ancora rappresentato con un numero di bit maggiore di N. L accesso alla memoria. per recuperare l operando è uno solo. Inoltre l indirizzo è in sostanza espresso in modo relativo rispetto a I.. Nell indirizzamento immediato, infine, il campo operando contiene non l indirizzo, ma l operando stesso. Non è quindi richiesto nessun accesso alla memoria, però il valore dell operando è limitato a N bit. E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 10
Modi di indirizzamento Il modo di indirizzamento può essere esplicitato nell istruzione in linguaggio macchina utilizzando un apposito campo. Nei nostri esempi abbiamo finora usato 4 bit per il codice operativo, e dei rimanenti 12 in realtà solo 10 sono stati usati per gli operandi. Gli altri 2 possono quindi essere utilizzati per specificare la modalità di indirizzamento, per esempio secondo la seguente codifica: 00 ind. diretto 01 ind. indiretto 10 ind. con indice 11 ind. immediato Questa soluzione evita di aumentare il numero di codici operativi necessari per tener conto delle differenti modalità di indirizzamento (si dovrebbero avere per esempio più istruzioni storea, loadb, etc.). In generale, si può assumere S = M + I + N, dove S è la lunghezza dell istruzione, M la lunghezza del codice operativo, I il numero di bit riservati alla modalità di indirizzamento, N la lunghezza del campo operandi. E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 11
Linguaggio di assemblatore E evidente che programmare in linguaggio macchina presenta non pochi problemi: facilità di commettere errori, scarsa chiarezza dei programmi, difficoltà di modifica e correzione degli stessi, stretto legame con l architettura, etc. Per tali motivi sono stati sviluppati i linguaggi di programmazione evoluti, detti di alto livello in quanto si collocano su un certo livello di astrazione rispetto al linguaggio macchina. Si tratta in sostanza di linguaggi il cui alfabeto e la cui sintassi consentono di costruire frasi, cioè istruzioni, più vicine al linguaggio umano che a quello della macchina. Ovviamente, prima dell esecuzione un programma scritto in linguaggio evoluto (programma sorgente) deve essere tradotto in linguaggio macchina (programma oggetto). A ciò provvedono degli appositi programmi traduttori, i compilatori e gli interpreti. Ad un livello intermedio tra quello della macchina e quello dei linguaggi evoluti si colloca il linguaggio di assemblatore, che è caratterizzato dall uso di parole chiave per esprimere i codici operativi e dall uso di riferimenti simbolici alle celle di memoria, nonché di una maniera simbolica di esprimere le modalità di indirizzamento. E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 12
Linguaggio di assemblatore Per il resto, le istruzioni in linguaggio di assemblatore corrispondono in modo biunivoco alle istruzioni in linguaggio macchina, per cui la capacità espressiva dei due linguaggi è esattamente la stessa. Per esempio, una tipica istruzione in linguaggio di assemblatore potrebbe essere: LOADA NUM che carica A con il contenuto della cella di indirizzo simbolico NUM. L indirizzamento è in questo caso diretto.analogamente si potrebbero avere: LOADA @NUM (indirizzamento indiretto) LOADA NUM(I) (indirizzamento con indice) LOADA #NUM (indirizzamento immediato) E. Ardizzone & I. Infantino - Appunti per il corso di Fondamenti di Informatica 13