Contatore di programma - Program counter
Il contatore di programma ( PC ), comunemente chiamato il puntatore all'istruzione ( IP ) di Intel x86 e Itanium microprocessori , ed a volte chiamato il registro di indirizzo di istruzione ( IAR ), il contatore di istruzioni , o solo una parte del sequencer di istruzione, è un registro del processore che indica dove si trova un computer nella sequenza del programma .
Di solito, il PC viene incrementato dopo aver recuperato un'istruzione e conserva l' indirizzo di memoria (" punta a") dell'istruzione successiva che verrebbe eseguita.
I processori di solito recuperano le istruzioni in sequenza dalla memoria, ma le istruzioni di trasferimento del controllo modificano la sequenza inserendo un nuovo valore nel PC. Questi includono rami (a volte chiamati salti), chiamate di subroutine e ritorni . Un trasferimento che è condizionato alla verità di un'asserzione consente al computer di seguire una sequenza diversa in condizioni diverse.
Un ramo prevede che l'istruzione successiva venga recuperata da un'altra parte della memoria. Una chiamata di subroutine non solo si ramifica, ma salva da qualche parte i contenuti precedenti del PC. Un ritorno recupera il contenuto salvato del PC e lo reinserisce nel PC, riprendendo l'esecuzione sequenziale con l'istruzione successiva alla chiamata della subroutine.
Implementazione hardware
In una semplice unità di elaborazione centrale (CPU), il PC è un contatore digitale (che è l'origine del termine "contatore di programma") che può essere uno dei diversi registri hardware . Il ciclo di istruzione inizia con un fetch , in cui la CPU inserisce il valore del PC sul bus degli indirizzi per inviarlo alla memoria. La memoria risponde inviando il contenuto di quella posizione di memoria sul bus dati . (Questo è il modello di computer con programma memorizzato , in cui un singolo spazio di memoria contiene sia istruzioni eseguibili che dati ordinari.) Dopo il recupero, la CPU procede all'esecuzione , intraprendendo alcune azioni in base al contenuto della memoria che ha ottenuto. Ad un certo punto di questo ciclo, il PC verrà modificato in modo che l'istruzione successiva eseguita sia diversa (tipicamente, incrementata in modo che l'istruzione successiva sia quella che inizia dall'indirizzo di memoria immediatamente successivo all'ultima posizione di memoria dell'istruzione corrente) .
Come altri registri del processore, il PC può essere un banco di latch binari, ognuno dei quali rappresenta un bit del valore del PC. Il numero di bit (la larghezza del PC) si riferisce all'architettura del processore. Ad esempio, una CPU a "32 bit" può utilizzare 32 bit per essere in grado di indirizzare 2 32 unità di memoria. Su alcuni processori, la larghezza del contatore del programma dipende invece dalla memoria indirizzabile; ad esempio, alcuni controller AVR hanno un PC che esegue il wrapping dopo 12 bit.
Se il PC è un contatore binario, può aumentare quando viene applicato un impulso al suo ingresso COUNT UP, oppure la CPU può calcolare un altro valore e caricarlo nel PC tramite un impulso al suo ingresso LOAD.
Per identificare l'istruzione corrente, il PC può essere combinato con altri registri che identificano un segmento o una pagina . Questo approccio consente un PC con meno bit assumendo che la maggior parte delle unità di memoria di interesse si trovi nelle vicinanze correnti.
Conseguenze nell'architettura della macchina
L'uso di un PC che normalmente incrementa presuppone che ciò che fa un computer sia eseguire una sequenza di istruzioni solitamente lineare. Un PC di questo tipo è fondamentale per l' architettura von Neumann . Pertanto i programmatori scrivono un flusso di controllo sequenziale anche per algoritmi che non devono essere sequenziali. Il conseguente " collo di bottiglia di von Neumann " ha portato alla ricerca sul calcolo parallelo, inclusi modelli non von Neumann o di flusso di dati che non utilizzavano un PC; ad esempio, invece di specificare passaggi sequenziali, il programmatore di alto livello potrebbe specificare la funzione desiderata e il programmatore di basso livello potrebbe specificarla utilizzando la logica combinatoria .
Questa ricerca ha anche portato a modi per rendere più veloci le CPU convenzionali basate su PC, tra cui:
- Pipelining , in cui hardware diverso nella CPU esegue diverse fasi di più istruzioni contemporaneamente.
- L' architettura VLIW ( parola d'istruzione molto lunga ), in cui una singola istruzione può ottenere più effetti.
- Tecniche per prevedere l' esecuzione fuori ordine e preparare istruzioni successive per l'esecuzione al di fuori della sequenza regolare.
Conseguenze nella programmazione di alto livello
I moderni linguaggi di programmazione di alto livello seguono ancora il modello di esecuzione sequenziale e, in effetti, un modo comune per identificare gli errori di programmazione è con una "procedura di esecuzione" in cui il dito del programmatore identifica il punto di esecuzione come farebbe un PC. Il linguaggio di alto livello è essenzialmente il linguaggio macchina di una macchina virtuale, troppo complesso per essere costruito come hardware ma invece emulato o interpretato dal software.
Tuttavia, i nuovi modelli di programmazione trascendono la programmazione a esecuzione sequenziale:
- Quando si scrive un programma multi-thread , il programmatore può scrivere ogni thread come una sequenza di istruzioni senza specificare la tempistica di qualsiasi istruzione relativa alle istruzioni in altri thread.
- Nella programmazione guidata dagli eventi , il programmatore può scrivere sequenze di istruzioni per rispondere agli eventi senza specificare una sequenza generale per il programma.
- Nella programmazione del flusso di dati , il programmatore può scrivere ciascuna sezione di una pipeline di elaborazione senza specificare la temporizzazione relativa ad altre sezioni.
Simbolo
I fornitori utilizzano caratteri diversi per simboleggiare il contatore del programma nei programmi in linguaggio assembly . Sebbene l'utilizzo del carattere "$" sia prevalente nella documentazione dei processori Intel , Zilog , Texas Instruments , Toshiba , NEC , Siemens e AMD , Motorola , Rockwell Semiconductor , Microchip Technology e Hitachi utilizzano invece un carattere "*", mentre SGS-Thomson La microelettronica utilizza "PC".
Guarda anche
- Previsione dei rami
- Cache di istruzioni
- Ciclo di istruzioni
- Unità di istruzione
- Pipeline di istruzioni
- Registro delle istruzioni
- Pianificazione delle istruzioni
- Parola di stato del programma