• Non ci sono risultati.

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

———< a registro A SP

puntatore ^X_ registro B

Documenti correlati