Calcolatori elettronici
Istruzioni del processore
Esempi di istruzioni elementari
Vediamo alcuni esempi di istruzioni elementari che il processore è in grado di interpretare ed eseguire:
- Trasferisci un dato da una locazione di memoria (M) ad uno degli registri di macchina e viceversa: R … R0 n−1. Es: [ ] [14] M 18 → R, R → M2 1
- Addiziona i contenuti di due registri: R … R0 n−1. Es: +R R → R2 1 2
- Sottrai i contenuti di due registri: R … R0 n−1. Es: −RR → R3 0 0
- Trasla (shift) il contenuto di uno dei registri: R … R0 n−1. Es. shiftL (R) → R2
Struttura di un'istruzione
Com'è in generale un'istruzione? In linea di principio è una tripla, dove:
- f è l'insieme dei codici operativi del processore, cioè delle operazioni elementari definite al livello del linguaggio macchina;
- P1 è un insieme di operandi-sorgente, cioè di valori e/o indicazioni dei registri e/o indicazioni delle locazioni di memoria contenenti i valori su cui opera f;
- P2 è un insieme di operandi-destinazione, cioè di indicazioni dei registri o indicazioni delle locazioni di memoria cui sono destinati i risultati dell'istruzione.
Normalmente è presente un solo operando destinazione, che può coincidere con uno degli operandi sorgente.
Esempi di rappresentazione di un'istruzione
Il codice operativo e l'indicazione degli operandi sono essi stessi un'informazione da immagazzinare in memoria (come i dati); codice operativo e operandi sono quindi oggetto di una codifica, che fa corrispondere una stringa di "0" e "1" ad ogni codice operativo e possibile combinazione di operandi. Tale informazione è codificata in macchina mediante codici a lunghezza fissa (tipicamente 32 bit) o a lunghezza variabile.
Operandi delle istruzioni macchina
Rispetto agli operandi su cui operano, le istruzioni di macchina si diversificano per:
- Tipo degli operandi (es. intero a 8, 16 o 32 bit);
- Numero degli operandi espliciti (0, 1, 2 o 3);
- Per ciascun operando: natura (ad esempio, se è una costante, se è il contenuto di un registro o di una locazione di memoria); tecnica di indirizzamento (se è implicito o esplicito, etc.).
Classificazione delle istruzioni
Per numero di operandi espliciti
Le istruzioni macchina tipiche hanno 0, 1, 2 o 3 operandi espliciti. Un'istruzione può avere operandi impliciti, ovvero non indicati espressamente nella codifica dell'istruzione poiché questa fa riferimento sempre allo stesso operando; si tratta tipicamente della costante zero oppure di un particolare registro presente nel processore, ad esempio il registro accumulatore nelle cosiddette "macchine ad accumulatore".
Per la natura degli operandi
In funzione della natura degli operandi, le istruzioni sono classificate come: in ciascuna coppia, il primo termine indica la natura dell'operando destinazione, mentre il secondo termine indica la natura dell'operando (o degli operandi) sorgente. Una CPU non supporta necessariamente tutte le possibili combinazioni sopra elencate; eccezioni sono possibili, anche per le singole istruzioni.
Per codici operativi
Ciascuna CPU è caratterizzata da un proprio repertorio di istruzioni macchina (Instruction Set). Il repertorio di codici operativi di una CPU può essere più o meno ricco:
- CISC (Complex Instruction Set Computer): molte istruzioni complesse, tendenzialmente più lente nella loro esecuzione;
- RISC (Reduced Instruction Set Computer): poche istruzioni semplici, tendenzialmente più veloci nella loro esecuzione. Nei RISC le istruzioni sono più veloci, ma in genere ne occorrono di più per realizzare un determinato calcolo rispetto ad un CISC.
In entrambi i casi, il repertorio può essere suddiviso tipicamente in poche classi di istruzioni fondamentali:
Classi di istruzioni
Istruzioni di trasferimento dati
Copiano un dato dall'operando sorgente all'operando destinazione; MOVE tipicamente sono istruzioni a due operandi espliciti: sorgente, destinazione. In linea di principio, sorgente e destinazione possono essere un qualsiasi registro/locazione di memoria. L'operando sorgente può anche essere un dato immediato. La destinazione NON può essere un dato immediato! Le istruzioni in cui il trasferimento rappresenta esso stesso un indirizzo di memoria sono spesso considerate a parte; le istruzioni di tipo "scrivi zero in un registro/locazione" assumono la costante zero come secondo operando sorgente implicito, come in:
- Clear R1 → R1 ← 0
Esiste una particolare tipologia di architetture, nelle quali è sempre presente un singolo registro speciale detto accumulatore. In tali architetture, uno dei due operandi è implicito: l'accumulatore, appunto (indicato qui con ACC).
- LoadAccumulator #5 → ACC ← 5
- StoreAccumulator 1000 → M[1000] ← ACC
Istruzioni aritmetiche
Effettuano operazioni aritmetiche unarie (cambia segno) o binarie (addizione, sottrazione, moltiplicazione, divisione) su dati interi espressi su 8, 16, 32 bit:
- a = op b (operazione unaria, un operando)
- a = b op c (operazione binaria, due operandi)
Alcune CPU sono dotate di istruzioni macchina per l'aritmetica in virgola mobile (IEEE 754); in altri casi, un coprocessore apposito esterno al processore principale fornisce l'estensione del set di istruzioni per il supporto alla virgola mobile. Operazioni aritmetiche più complesse (es. radice quadrata) o funzioni trigonometriche ed esponenziali sono di solito supportate da coprocessori o realizzate in software. Molte CPU impongono il vincolo che l'operando destinazione coincida con uno degli operandi sorgente:
- a = op a (operazione unaria, un operando)
- a = a op b (operazione binaria, due operandi)
Ciò consente di lavorare con istruzioni a due soli operandi espliciti (e di risparmiare sui bit per codificare l'istruzione!), come nel Motorola 68000:
- ADD D0, D1 → D1 ← [D0] + [D1]
Il formato di istruzioni a 3 operandi espliciti è tipico delle CPU RISC; in esse, però, c'è il vincolo che i tre operandi siano tutti di tipo registro. Altre limitazioni sulla natura e sui modi di indirizzamento degli operandi valgono anche per le CPU CISC; ad esempio, nel 68000 le istruzioni aritmetiche devono avere necessariamente un operando di tipo registro.
Istruzioni logiche e di scorrimento (shift)
Effettuano operazioni logiche booleane "bit a bit" (bitwise) sia unarie (NOT) che binarie (AND, OR, XOR) su dati di tipo "stringa di bit" espressi su 8, 16, 32 bit:
- a = NOT b (operazione unaria, un operando)
- a = b AND c (operazione binaria, due operandi)
- a = b OR c (operazione binaria, due operandi)
- a = b XOR c (operazione binaria, due operandi)
Istruzioni di confronto
Alterano i flag del registro di stato del processore (Processor Status Word o Status Register, SR) in base all'esito del confronto tra due operandi sorgente espliciti (istruzioni di Compare) o tra un operando sorgente esplicito ed uno implicito (tipicamente zero, come per l'istruzione Test).
L'operazione di AND può essere utilizzata per mettere selettivamente a zero alcuni bit in un registro o in una locazione di memoria (ovvero, per "mascherare" i bit).
- AND 1111111111111100, R2 opera sul registro R2 (di 16 bit). Il contenuto del registro non verrà modificato, ad eccezione dei due bit meno significativi messi a '0'. Infatti, la AND di un bit con 0 produce sempre 0, mentre la AND di un bit con 1 non altera il bit (0 AND 0 = 0, 1 AND 1 = 1).
L'operazione di OR può essere utilizzata per mettere selettivamente a uno alcuni bit in un registro o in una locazione di memoria.
- OR 0000000000000011, R1 opera sul registro R1 (di 16 bit). Il contenuto del registro non verrà modificato, ad eccezione dei due bit meno significativi messi a '1'. Infatti, la OR di un bit con 1 produce sempre 1, mentre la OR di un bit con 0 non altera il bit (0 OR 0 = 0, 1 OR 0 = 1).
L'operazione di XOR può essere utilizzata per invertire selettivamente alcuni bit in un registro o in una locazione di memoria:
- XOR 0000000000000011, R1 opera sul registro R1 (di 16 bit). Il contenuto del registro non verrà modificato, ad eccezione dei due bit meno significativi, che verranno invertiti (se sono '1' diventano '0' e viceversa). Infatti, la XOR è definita come la funzione che è 1 se gli ingressi sono diversi, pertanto: 1 XOR 0 = 1, 1 XOR 1= 0.
Istruzioni di salto
Alterano il flusso sequenziale che caratterizza la normale esecuzione delle istruzioni, consentendo la realizzazione di diramazioni (if-then-else) e cicli; agiscono modificando il registro Program Counter. Possono essere condizionate (eseguite solo se è vera una delle condizioni espresse dai flag del registro di stato SR) o non-condizionate (eseguite sempre).
Si distinguono spesso in salti assoluti (Jump) e relativi (Branch): le istruzioni di Jump contengono nella codifica dell'istruzione l'indirizzo destinazione; le istruzioni di Branch contengono nella codifica dell'istruzione uno spiazzamento (offset) 'x' che, sommato al valore attuale del PC, determina l'indirizzo destinazione. Ci si sposta quindi non ad un specifico indirizzo, ma di 'x' locazioni prima o dopo il valore attuale del PC.
Istruzioni di collegamento a sottoprogramma
Sono istruzioni di salto che permettono di passare a eseguire una differente sequenza di istruzioni, a partire da quella corrente; al termine della nuova sequenza sarà poi possibile tornare al punto da cui è stato effettuato il salto; permettono di strutturare il programma in sottoprogrammi verso cui si può saltare e da cui si può ritornare. Le istruzioni di salto a sottoprogramma (Jump To Subroutine Call) salvano il valore del PC per consentire il ritorno al programma chiamante. Le istruzioni di ritorno da sottoprogramma (Return From Subroutine) ripristinano il valore del PC salvato per realizzare il ritorno al programma chiamante. Il valore del PC può essere salvato in un apposito registro (Link Register, LR) e/o in una opportuna area di memoria chiamata stack.
Istruzioni di input/output
Alcune CPU sono dotate di istruzioni apposite per il trasferimento di dati da/verso le interfacce delle periferiche di input/output (sottosistema di I/O). Si tratta in sostanza di istruzioni di trasferimento dati che operano su uno spazio di indirizzamento distinto da quello della memoria. Nei sistemi nei quali spazio di indirizzamento di I/O e spazio di indirizzamento di memoria coincidono (sistemi con I/O "memory mapped") le operazioni di I/O vengono eseguite tramite normali istruzioni di trasferimento dati.
Introduzione al linguaggio assembly
Programma in memoria
Le istruzioni sono esse stesse informazioni da immagazzinare in memoria (come i dati). Il contenuto di un'istruzione è quindi oggetto di codifica, che fa corrispondere una stringa di '0' e '1' ad ogni codice operativo e possibile combinazione di operandi. Tale informazione è codificata in macchina mediante:
- Codici a lunghezza fissa (tipicamente 32 bit, es. RISC), o a lunghezza variabile (es. nel 68000 multipli di 16 bit).
Esempi di istruzioni
Ciclo di sviluppo/esecuzione per programmi in linguaggio di alto livello
Linguaggi e dipendenza dalla piattaforma di esecuzione
Ciclo di sviluppo/esecuzione per programmi in linguaggio assembly
Ciclo di sviluppo semplificato di programmi assembly MC68000 nel sistema didattico ASIM:
Assembly: formato del codice sorgente
Una linea di codice sorgente Assembly è costituita da quattro campi (esempio riferito al processore M68000):
- LABEL (opzionale): stringa alfanumerica; definisce un nome simbolico per il corrispondente indirizzo;
- TAB OPCOD: carattere + codice mnemonico o pseudo-operatore; determina la generazione di un'istruzione in linguaggio macchina o la modifica del valore corrente del Program Location Counter;
- TAB OPERANDI: carattere + oggetti dell'azione specificata dall'OPCODE; variano a seconda dell'OPCODE e del modo di indirizzamento;
- TAB COMMENTI (opzionale): carattere + testo arbitrario inserito dal programmatore.
Di regola, una linea di codice assembly corrisponde ad una istruzione macchina, ma ci sono eccezioni:
- Macro: 1 linea assembler → diverse istruzioni macchina;
- Pseudo istruzioni: 1 linea assembler → nessuna istruzione macchina.
Variabili interamente gestite dal programmatore:
- Allocazione: memoria o registri CPU, No dichiarazione.
Linguaggi assembly
Per una data macchina, esiste sempre almeno il linguaggio assembly definito dal costruttore. In aggiunta, possono esistere linguaggi assembly forniti da terze parti. Quando si definisce un linguaggio assembly si ha libertà di scelta per quanto riguarda:
- Mnemonics (i codici testuali usati per indicare le istruzioni);
- Il formato delle linee del sorgente;
- I formati per specificare modi di indirizzamento, varianti delle istruzioni, costanti, label, pseudo-operatori, etc.
Non si ha libertà di scelta per quanto riguarda l'effetto finale di ogni singola istruzione macchina.
Convenzioni (M68000)
Gli spazi bianchi tra i diversi campi fungono esclusivamente da separatori (vengono ignorati dall'assemblatore). Una linea che inizi con un asterisco (*) è una linea di commento. Nelle espressioni assembly, gli argomenti di tipo numerico si intendono espressi:
- In notazione decimale, se non diversamente specificato.
- In notazione esadecimale, se preceduti dal simbolo "$".
Nell'indicazione degli operandi, il simbolo "#" denota un indirizzamento immediato.
Program location counter (PLC)
- È una variabile interna dell'assemblatore;
- Punta alla locazione di memoria in cui andrà caricata (a run time) l'istruzione assemblata;
- Viene inizializzato dallo pseudo-operatore "origin" (ORG);
- Durante il processo di assemblaggio, il suo valore è aggiornato sia in funzione degli operatori, sia in funzione degli pseudo-operatori;
- È possibile, all'interno di un programma, fare riferimento al suo valore corrente, mediante il simbolo "*".
Esempi di file list: ASIMTOOL
ASIM: programma caricato in memoria
Pseudo-operatori
- NON sono istruzioni eseguite dal processore, sono direttive che regolano il processo di traduzione del programma assembler in programma eseguibile;
- Lo pseudo-operatore ORG: viene usato per inizializzare il Program Location Counter (PLC), ovvero per indicare a quale indirizzo sarà posta la successiva sezione di codice o dati.
- Esempio: ORG $8100
- Lo pseudo-operatore END: viene usato per terminare il processo di assemblaggio ed impostare l'entry-point (prima istruzione da eseguire) nel programma.
- Esempio: END TARGETLAB
- Lo pseudo-operatore DS: viene usato per incrementare il Program Location Counter (PLC), in modo da riservare spazio di memoria per una variabile.
- Esempio: LABEL DS.W NUMSKIPS
- Lo pseudo-operatore DC: viene usato per inizializzare il valore di una variabile.
- Esempio: LABEL DC.W VALUE
- Lo pseudo-operatore EQU: viene usato per definire una costante usata nel sorgente assembler.
- Esempio: LABEL EQU VALUE
Etichette
- Sono stringhe di testo arbitrarie (opzionali) anteposte ad una istruzione o ad un dato all'interno del programma assembler;
- Servono a riferirsi al particolare indirizzo che contiene quella istruzione o dato;
- Usati per gestire i salti;
- Usati per gestire variabili (manipolate nel programma assembler attraverso le loro etichette in maniera simile alle variabili di un linguaggio di programmazione di alto livello).
- Ad esempio: ALOOP è un'etichetta usata per riferirsi all'istruzione MOVE, SUM è una etichetta usata per gestire una variabile, mentre IVAL è una costante.
Introduzione al linguaggio assembly del programma Motorola 68000
68000: modello di programma
- 8 registri dati utilizzabili per dati generici, possono essere usati tutti i 32 bit dei registri, o solo i 16 meno significativi (lasciando inalterati gli altri), o solo gli 8 bit meno significativi (lasciando inalterati gli altri);
- 8 registri indirizzo utilizzati per contenere valori di indirizzi in memoria, possono essere utilizzati a 32 o a 16 bit;
- Program counter, contenente l'indirizzo della prossima istruzione da eseguire;
- Registro di stato, contenente indicatori di flag e condizioni del processore.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Calcolatori Elettronici
-
Appunti lezione Calcolatori elettronici
-
Calcolatori elettronici I - analisi
-
Riassunto Calcolatori elettronici e reti di calcolatori 1