All’unità centrale è riservato il com pito di « capire » ed eseguire i coman
di, cioè le istruzioni, impartiti dal pro grammatore; una buona comprensio ne dei meccanismi di funzionamento della CPU è quindi essenziale per sa
pere che cosa possiamo « chiedere » ad un elaboratore, quindi in che mo do dobbiamo programmarlo perché es so esegua i compiti che vogliamo af
fidargli.
A titolo di esempio, nella figura a è stato riportato lo schema generale dell’architettura di un microprocesso
re abbastanza diffuso, lo Z-80 della Zilog (con il termine « microproces sore » si indica una CPU totalmente contenuta in un solo circuito inte grato). Questo schema è comunque valido per la maggior parte dei pic coli calcolatori presenti sul mercato.
Cerchiamo di descrivere le funzioni dei vari « blocchi » che compaiono nel loschema:
a) controllo bus dati: complesso di circuiti che governano fisicamente lo scambio di dati sul bus dati; cioè che
inviano i segnali utilizzati dalle unità periferiche per sapere quando sui fili del bus è presente un’informazione si gnificativa, oppure quando il bus è libero ecc. Poiché le informazioni nel lo Z-80 sono scambiate ad un byte al
la volta, il bus dati è a 8 bit.
b) controllo bus indirizzi: comples so di circuiti che guidano la trasmis sione degli indirizzi sul bus indirizzi;
in altri termini, ogni volta che l’unità centrale vuole leggere o scrivere (cioè ricevere o trasmettere) dei dati sul bus dati, deve anche inviare sul bus in dirizzi, tramite questo circuito di con
trollo, l’indirizzo della cella di me moria principale o della periferia in
teressata al trasferimento. Notiamo che, mentre sul bus dati le informa
zioni viaggiano in entrambi i sensi (freccia bidirezionale), sul bus indi
rizzi esiste un solo « senso di marcia » (dalla CPU verso le periferiche). Il bus indirizzi è a 16 bit.
c) registro istruzione: un registro, in generale, è costituito da un gruppo di celle di memoria, che si differen ziano da quelle della memoria prin cipale essenzialmente per il fatto di essere direttamente accessibili dalle varie parti della CPU. Il registro istru
zione, in particolare, contiene in ogni istante l’istruzione in corso di esecu zione. Quindi ogni istruzione deve es
sere letta dalla memoria principale (con l’uso del bus dati e del bus indi
rizzi) e ricopiata in questo registro, prima di poter essere interpretata ed eseguita.
d) decodificatore istruzioni: il com pito di questo « blocco » è quello di interpretare e far eseguire l’istruzione di volta in volta contenuta nel regi stro istruzione. Di conseguenza, dal decodificatore partono dei segnali di comando per tutte le altre parti della CPU.
e) ALU: questa sigla corrisponde alle parole inglesi Arithmetic and
Lo-46
di SERGIO BARAGLI
gic Unii, cioè «unità aritmetico-logi
ca ». Questo blocco contiene quindi tutti i circuiti che permettono di ese guire, utilizzando i registri, le opera
zioni aritmetiche e logiche descritte negli articoli precedenti.
f) bus interno: con questo termine, in realtà, non si indica un vero e pro prio bus, bensì l’insieme delle connes
sioni tra i vari « blocchi », che con
sentono ai blocchi stessi di interagire, cioè di scambiarsi informazioni e se gnali di controllo.
g) registri CPU: come già sappia mo, con questo termine si indica la
« memoria interna » dell’unità centra le: nei registri vengono scritte le in
formazioni che devono essere trattate direttamente dall’unità aritmetico-lo
gica, oppure che devono essere invia te sul bus dati ecc. Lo Z-80 dispone di 12 registri «generici » da un byte ciascuno, oltre ad alcuni registri « spe
ciali »; tre di questi ultimi sono:
1) il program counter (PC, o con
tatore di programma): contiene sem pre l’indirizzo di memoria della pros sima istruzione da eseguire. In altri termini, mentre si sta eseguendo una determinata istruzione, il contenuto del program counter viene incremen
tato, in modo da corrispondere all’in
dirizzo della prossima istruzione; non appena l’istruzione corrente è termi nata, sarà quindi sufficiente inviare su! bus indirizzi il contenuto del PC, per ricevere indietro, dal bus dati, i byte che costituiscono la prossima i- struzione. Questi byte provengono ov
viamente dalla memoria principale e verranno scritti nel registro istruzio ne. Come vedremo più avanti, non sempre l’ordine di esecuzione delle i- struzioni corrisponde all’ordine con cui esse sono registrate in memoria principale: esistono infatti delle istru
zioni di « salto », che permettono ap
punto di « saltare » in un punto qual
siasi del programma. In un’istruzione
47
Fig. a
di salto deve quindi essere contenuto l’indirizzo della prossima istruzione da eseguire; ad esempio, l’istruzione di
« salto incondizionato » (cioè da ese guirsi comunque), nello Z-80 è lunga tre byte; il primo byte contiene il co
dice operativo corrispondente al salto, cioè 11000011, mentre negli altri due byte (operando) si scrive direttamen te l’indirizzo. Quando un’istruzione di salto incondizionato viene letta dalla memoria e caricata nel registro istru
zione, il decodificatore istruzioni in terpreta il primo byte, « capisce » di che istruzione si tratta, e di conse
guenza ricopia il contenuto dei due byte successivi nel PC; dà quindi il segnale di « istruzione terminata » e il contenuto del PC viene inviato, co
me al solito,,sul bus indirizzi,per leg gere l’istruzione richiesta.
2) lo stack pointer (SP, o « punta tore alla catasta »); finora abbiamo detto che, quando un programmatore vuole scrivere o leggere delle infor mazioni in memoria, deve sempre spe
cificare, tramite apposite istruzioni, il corrispondente indirizzo. Spesso però si presenta la necessità di « scaricare » in memoria il contenuto di tutti (o quasi) i registri della CPU, perché l’e
laborazione in corso deve essere mo mentaneamente sospesa, o perché una nuova serie di calcoli deve essere ef fettuata e non ci sono più registri di
sponibili ecc.; quando questa condi zione di « emergenza » viene a cessa
re, occorreripristinare la situazione di partenza, cioè « ricaricare » i registri con i valori scritti in memoria. La memoria principale viene in questo caso utilizzata quasi come estensione dei registri; il programmaotre potreb be specificare come al solito, per ogni registro da « salvare » o da ripristi
nare, un indirizzo di memoria, ma l’intera operazione comporterebbe, in questo caso, una discreta perdita di tempo. Si utilizza allora il cosiddetto stack, o « catasta » (vedi figura b):
un registro da salvare viene memo
rizzato all’indirizzo contenuto nello stack pointer (SP); dopo di che, il contenuto di SP viene immediatamen te incrementato, per puntare all’indi
rizzo di memoria successivo. Queste due operazioni possono essere com piute con un’unica istruzione specia lizzata, che ha come codice operativo simbolico la parola PUSH e come ope
rando il nome del registro da salvare.
È chiaro quindi come il salvataggio, ad esempio, di 5 registri possa essere compiuto con sole 5 istruzioni: inol
tre il programmatore non è costretto a specificare ogni volta un indirizzo, col rischio di commettere errori.
Un’istruzione « simmetrica», che ha come codiceoperativo simbolico la pa rola « POP », consente di ripristina
re dalla memoria il contenuto di un registro, decrementando contempora
neamente il contenuto di SP (vedere ancora figura b).
3) il registro flag (flag in inglese significa segnale o segnalare): è un re
gistro costituito da 8 bit (flag), cia
scuno dei quali è associato al risultato di una o più operazioni. Ad esempio, il risultato di un’operazione logica può essere soltanto “0” o “1”; allo ra uno di questi bit può essere utiliz
zato per scrivere il risultato di una operazione logica qualsiasi; natural
mente, dopo un’istruzione per un’ope
razione logica, ne dovrà esistere una che « legga » il contenuto di questo bit per prendere una qualche decisio ne (ad esempio, effettuare o meno un salto). Il significato di alcuni flag del lo Z-80 è il seguente:
• riporto: se il risultato di un’ope
razione di somma o sottrazione com porta un riporto oltre l’ultimo bit del registro che deve contenere il risulta
to, questo flag è posto a “1”;
• zero: va a “1” se il risultato di un’operazione aritmetica o logica è zero;
• parità/overflow: se usato per con
trolli di parità, va a “1” quando il ri
sultato di un’operazione contiene un numero pari di bit a “1”;
e così via.
In alcuni elaboratori (tipicamente
48
Fig. b .------ 1--- ■--- 1--- ‘--- 1--- ■--- 1--- ' memoria