prof. Nunzio Brugaletta PC inside

EnneBi - Computer Science
Avanti Indietro Inizio


CPU ed esecuzione di un programma

Per l'esecuzione di un programma in linguaggio macchina, una CPU esegue, iterativamente, un ciclo di fetch-decode-execute: preleva (fetch) una istruzione dalla memoria, la decodifica (decode) e la esegue (execute).

schema cpu

Nello schema sono riportati i componenti principali di una CPU:

Il ciclo fetch-decode-execute eseguito dal processore per ogni istruzione, si può esprimere, tenendo conto del ruolo dei registri:

Fase di fetch

  1. Per avviare un programma, residente nella memoria principale, bisogna inserire l'indirizzo della prima istruzione nel Program Counter.

  2. La CU ricopia il contenuto del PC nel MAR e viene effettuato un accesso in lettura a quell'indirizzo.

  3. Il dato prelevato dall'indirizzo, cui si è acceduto, viene conservato in MDR.

  4. Il contenuto di MDR viene ricopiato in IR. Nel frattempo PC si è, in maniera automatica, aggiornato alla locazione successiva.

Fase di decode

L'istruzione viene interpretata, prelevando eventualmente dalla memoria altri dati necessari se l'istruzione completa non è contenuta nel dato prelevato in precedenza. In ogni caso, alla fine, PC punterà all'istruzione da eseguire successivamente.

Fase di execute

Se, per esempio, l'istruzione da eseguire è una somma, i registri verranno caricati con i numeri da sommare e la CU invia alla ALU il comando per l'esecuzione della somma. La ALU esegue l'operazione: il risultato prodotto sarà conservato in uno dei registri e verrà aggiornata la PSW.

Il ciclo viene ripetuto per la prossima istruzione fino a che non si arrivi ad una istruzione di halt.

La PSW o registro di stato conserva lo stato di alcune operazioni matematiche ed è un registro che funziona in modo particolare: ogni singolo bit ha un significato autonomo a differenza degli altri registri dove ha significato l'intera stringa binaria. Ogni singolo bit del registro di stato è un indicatore (flag) di un determinato evento che si è verificato nel corso dell'ultima operazione.

Di seguito si esaminano alcuni indicativi:

Normalmente le istruzioni di un programma vengono eseguite in sequenza, ma, in presenza di strutture di controllo, la sequenza potrebbe essere modificata: si pensi, per esempio in C/C++, a strutture come if o for.

Gli ultimi due flag vengono utilizzati quando si tratta di effettuare salti condizionati.

...
// istruzioni A
if(alfa>beta)
  // istruzioni B
else
  // istruzioni C
// istruzioni D

Nel frammento di codice riportato, dopo l'esecuzione delle istruzioni A c'è una condizione che specifica, in dipendenza del risultato del confronto, quali istruzioni eseguire prime delle D: se la condizione è vera si eseguono le B e si salta alle D, se è falsa si salta alle C e quindi, in sequenza, si eseguono le D.

Per poter stabilire l'obiettivo del salto è necessario verificare il risultato del confronto. Il confronto viene risolto effettuando una sottrazione senza conservazione del risultato fra alfa e beta e consultando i flag di Zero e di Segno.

Considerando che ZF viene posto ad 1 se il risultato è nullo e SF viene posto ad uno se il risultato è negativo, esaminando il valore dei due flag, si possono avere indicazioni sul risultato del confronto:

Operazione

SF

ZF

Risultato

alfa - beta

0

0

alfa > beta

0

1

alfa == beta

1

0

alfa < beta




Avanti Indietro Inizio

http://ennebi.solira.org ennebi@solira.org