vuoi
o PayPal
tutte le volte che vuoi
Istruzioni
La caratteristica principale del livello ISA è il suo insieme di istruzioni: «cosa» la macchina è in grado di fare.
• Le istruzioni più comuni includono:
▪ STORE e LOAD per il trasferimento dati dai registri alla memoria e viceversa
▪ MOVE per la copia di dati tra registri
▪ Istruzioni aritmetiche
▪ Istruzioni booleane
▪ Istruzioni di confronto
▪ Istruzioni di salto condizionato
Formato delle istruzioni
Un’istruzione consiste di:
• Un codice operativo (opcode)
• Alcuno, uno, o più operandi riferibili tramite indirizzi
•
Su alcune macchine le istruzioni hanno tutte la stessa lunghezza:
• Decodifica più semplice
• Spreco di spazio: tutte le istruzioni devono essere lunghe quanto la più lunga
Alcune possibili relazioni fra la lunghezza di una istruzione e la lunghezza della parola:
Criteri progettuali
La scelta dei formati di istruzione deve tenere conto di alcuni criteri:
• Preferire istruzioni corte a quelle lunghe (a fronte di un aumento delle prestazioni dei processori non è
corrisposto un aumento dell’ampiezza di banda della memoria → collo di bottiglia)
• Prevedere spazio sufficiente a esprimere tutte le operazioni volute (la storia è piena di fallimenti di progetti
folli in cui non sono stati previsti abbastanza codici operativi in eccedenza per fronteggiare aggiunte
successive)
Codice operativo espandibile )
• Si consideri un’istruzione lunga ( + bit, composta da un opcode di k bit e da un solo indirizzo di n bit:
▪ 2 operazioni diverse
▪ 2 celle di memoria indirizzabili
Si potrebbe spezzare gli stessi indirizzi (k+n) in (k-1) bit di opcode e (n+1) bit di indirizzo: si dimezza il numero di
istruzioni ma si raddoppia la dimensione della memoria raggiungibile.
Si può quindi prevedere un codice operativo espandibile, in cui il numero di bit per l’opcode e per gli indirizzi può
variare.
Esempio: si consideri una macchina in cui le istruzioni sono a 16 bit e gli indirizzi a 4 bit.
Codice operativo espandibile che consente di avere:
• 15 istruzioni con 3 indirizzi
• 14 istruzioni con 2 indirizzi
• 31 istruzioni con 1 indirizzo
• 16 istruzioni senza indirizzo
La capacità di usare opcode di dimensione variabile può essere sfruttata in due modi:
• Assegnando gli opcode più corti alle istruzioni che hanno bisogno di più bit
• Scegliendo opcode più corti per le istruzioni comuni e lasciando più bit alle istruzioni di uso più raro
Indirizzamento
L’indirizzamento si riferisce alla modalità con cui sono specificate le posizioni degli operandi.
Esistono diverse modalità di indirizzamento:
• Immediato
• Diretto
• A registro
• A registro indiretto
• Indicizzato
• Indicizzato esteso
• A stack
Indirizzamento immediato
È il metodo più semplice: l’istruzione contiene già, nel campo riservato all’indirizzo dell’operando, l’operando stesso.
Tale modalità si dice immediata perché l’operando viene immediatamente utilizzato nel momento stesso in cui
avviene la fetch dell’istruzione; in altre parole, è già pronto per l’uso.
Svantaggi:
• Un solo operando per volta
• L’entità del valore è limitata alla dimensione del campo: spesso si utilizza per piccole costanti intere
Indirizzamento diretto
Consiste nel fornire l’indirizzo completo dell’operando.
Svantaggi:
• L’istruzione accederà sempre alla stessa locazione di memoria:
o Per questo motivo viene spesso usato per accedere a variabili globali il cui indirizzo è noto in fase di
compilazione
Indirizzamento a registro
E’ analogo all’indirizzamento diretto, ma viene specificato un registro piuttosto che un indirizzo di memoria.
• È la modalità di indirizzamento più diffusa poiché i registri sono veloci in accesso e hanno indirizzi brevi
• Molti compilatori cercano di prevedere quali variabili saranno richiamate più spesso per destinarle ai registri
Indirizzamento a registro indiretto
Questa modalità di indirizzamento è ibrida rispetto alle precedenti:
• L’operando è contenuto in un indirizzo di memoria (indirizzamento diretto)
• Tale indirizzo è contenuto in un registro (indirizzamento a registro)
Un indirizzo utilizzato in questa maniera prende il nome di puntatore.
Vantaggi:
• è possibile referenziare la memoria senza dover incorporare un intero indirizzo nell’istruzione
• è possibile usare diverse parole di memoria in occasione di esecuzioni diverse della stessa istruzione
Indirizzamento indicizzato
Questa modalità referenzia un indirizzo di memoria che si ottiene specificando un registro più uno spiazzamento
(offset) costante.
L’istruzione 4 effettua la fetch di A con modalità indicizzata: il registro R2 è sommato all’indirizzo A e la somma è
i
usata come riferimento in memoria.
Indirizzamento indicizzato esteso
L’indirizzo di memoria è calcolato sommando il contenuto di due registri più uno spiazzamento.
• Un registro funge da base
• L’altro da indice MOV R4, (R2 + R5)
Notazione polacca inversa
Tradizionalmente, si è soliti indicare l’operatore in mezzo agli operandi cui si applica, come in + (notazione
infissa)
La notazione polacca inversa prevede di applicare l’operatore ai due operandi che lo precedono, come in +.
Vantaggi:
▪ Qualunque formula può essere espressa senza parentesi
▪ La valutazione delle formule beneficia dell’uso dello stack.
Algoritmo per la valutazione
1. Scandisci l’operazione da sinistra verso destra
2. Se leggi un operando, impilalo nella pila degli operandi
3. Se leggi un operatore, rimuovi i due operandi in cima alla pila, applica l’operatore, e impila il risultato
dell’operazione nella pila degli operandi
4. Al termine della scansione, l’elemento in cima alla pila conterrà il risultato finale
Indirizzamento a Stack
Ortogonalità e quasi-ortogonalità •
Le istruzioni, in linguaggio macchina, sono caratterizzate dai seguenti tre insiemi finiti:
▪ è l’insieme dei codici operativi
▪ è l’insieme di tutti i registri
▪ è l’insieme di tutti i possibili modi di indirizzamento ammessi
Il prodotto cartesiano di tali insiemi × × è uno spazio tridimensionale finito e discreto, i cui punti individuano
una specifica potenziale istruzione eseguibile da un processore.
Un processore è definito:
▪ Ortogonale se il formato delle sue istruzioni è in grado di codificare tutti i punti del sotto-spazio → maggiore
flessibilità (architetture RISC più recenti)
▪ Quasi-ortogonale altrimenti.
Da wikipedia: Una caratteristica importante dell'insieme (set) delle istruzioni di una CPU è la sua ortogonalità: vale a dire, il fatto che ogni
istruzione che usi i registri possa usarli tutti indifferentemente (tranne quelli "speciali" come l'IP) e che nessun registro sia in qualche modo
privilegiato rispetto agli altri perché su di esso si possono compiere operazioni particolari: è stato dimostrato che un set di istruzioni ortogonali, a
parità di tempo di esecuzione delle istruzioni e di numero dei registri, è più efficiente di uno non ortogonale.
Modalità di indirizzamento a confronto
Una macchina dovrebbe offrire ogni scelta possibile, oppure una sola: ogni via di mezzo costringe il compilatore a
fare scelte per cui potrebbe non essere abbastanza preparato.
Tipi di istruzioni
Anche se possono differire nei dettagli, alcune istruzioni del livello ISA sono rintracciabili in tutte le macchine.
Oltre a queste, ciascuna macchina dispone di poche istruzioni insolite (ad esempio per retrocompatibilità).
Istruzioni principali:
▪Trasferimento dati
▪ Operazioni binarie
▪ Unarie
▪ Confronti e salti condizionati
▪ Invocazioni di procedura
▪ Input/output
Trasferimento dati
In informatica, il trasferimento indica la copia di un dato in una nuova posizione, mentre il dato originale si trova
indisturbato in una locazione di memoria.
Ci sono due ragioni fondamentali per copiare dati da una locazione di memoria a un’altra:
▪ Assegnamento di valori a variabili A = B (A <- B)
▪ Preparare i dati a diversi tipi di accesso LOAD, STORE, MOVE
Operazioni binarie
Sono le operazioni che producono un risultato dalla combinazione di due operandi
▪ Operazioni booleane
▪ Operazioni aritmetiche
L’AND è spesso usato per estrarre bit da una parola.
Tale estrazione avviene applicando l’AND fra la parola e una costante detta maschera.
Operazioni unarie
Prendono in input un operando e restituiscono un risultato
Sono esempi di operazioni unarie lo scorrimento (shift) e la rotazione del contenuto di una parola
Le operazioni di scorrimento possono spostare i bit verso destra o verso sinistra, e i bit che «fuoriescono» vengono
perduti
▪ Sono usate per semplificare operazioni aritmetiche (es.: se un intero positivo viene fatto scorrere di k bit verso
sinistra, allora il risultato è l’intero moltiplicato per 2 )
k
Le rotazioni sono scorrimenti in cui i bit che escono da un’estremità riappaiono all’altra estremità
▪ Sono usate per esaminare parole bit per bit (ripristinandole al termine)
Confronti e salti condizionati
Quasi tutti i programmi hanno bisogno della capacità di esaminare il contenuto dei dati e alterare il flusso di
esecuzione delle istruzioni in base al risultato del confronto
Un metodo comune consiste nell’uso dell’istruzione di salto condizionato che:
▪ Verifica una certa condizione
▪ Salta a un particolare indirizzo di memoria se la condizione è soddisfatta
Un salto non-condizionato trasferisce il controllo a un punto qualunque del programma senza aver prima valutato
una condizione.
Pro:
▪ Estrema flessibilità (qualunque algoritmo può essere scritto usando solo sequenza e goto!)
▪ Estrema potenza
Contro:
▪ Scarsa leggibilità del programma
▪ Alti costi di manutenzione
Invocazioni di procedura
Una procedura è un insieme di istruzioni che svolge un certo compito e può essere invocato in diversi punti del
programma
▪ In C prende il nome di funzione (anche se non è propriamente una funzione nel senso matematico)
▪ In Java prende il nome di metodo
Quando una p