# Registro (informatica)

Un registro (in inglese processor register), in informatica e nell'architettura dei calcolatori, è una piccola parte di memoria utilizzata per velocizzare l'esecuzione dei programmi fornendo un accesso rapido ai valori usati più frequentemente e/o tipicamente, i valori correntemente in uso in una determinata parte di un calcolo.

## Descrizione

Il termine è usato spesso per riferirsi esclusivamente al gruppo di registri che possono essere direttamente indirizzati dalle istruzioni di input e output del microprocessore. Più propriamente, questi registri sono definiti "architected registers". Per esempio, nell'architettura x86 è disponibile un set di otto registri utilizzabili dalle istruzioni del linguaggio macchina, ma la CPU conterrà molti più registri per uso interno o con funzioni speciali.
I registri costituiscono il punto più alto della gerarchia della memoria, e sono il meccanismo più rapido per il sistema di manipolare i dati. I registri sono normalmente misurati in base al numero di bit che possono contenere (ad esempio, registri a 8 bit o registri a 32 bit). Attualmente i registri sono implementati normalmente con file dei registri, ma in passato sono stati implementati usando flip-flop individuali, memoria a nuclei di ferrite ad alta velocità, memoria thin film e vari altri modi.
La maggior parte delle moderne architetture dei computer (RISC, o più genericamente architetture load-store) è basata su un'architettura a pipeline che trae beneficio dal limitare l'accesso in memoria alle sole istruzioni load e store, utilizzando soltanto registri e costanti per l'esecuzione di tutte le altre istruzioni.

## Classificazione
### Classi di registri

Vi sono molte classi di registri:
* Registri di dati: sono usati per memorizzare numeri interi. Nelle CPU più semplici o più vecchie, uno speciale registro per i dati è l'accumulatore, usato per calcoli aritmetici.
* Registri di indirizzo: sono usati per memorizzare gli indirizzi e per accedere alla memoria.
* Registro generico: può contenere sia dati che indirizzi (ad esempio RWR).
* Registri floating point: sono usati per memorizzare numeri a virgola mobile.
* Registri costanti: contengono dati a sola lettura (ad esempio zero, uno, pi greco, ecc.).
* Registri vettoriali: contengono dati utilizzati dalle istruzioni SIMD (single instruction, multiple data).
* Registri speciali: contengono dati interni della CPU, come il program counter, lo stack pointer e il registro di stato.
** Registro di istruzione: contiene l'istruzione corrente.
** Registri indice: sono usati per modificare l'indirizzo degli operandi.
* In alcune architetture, vi sono dei registri specifici del modello di processore, che memorizzano dati e impostazioni del processore stesso. Essendo registri legati a caratteristiche peculiari di uno specifico modello, non è garantita la presenza o lo stesso funzionamento nelle generazioni successive di quel processore.
* Vi sono inoltre registri dedicati al fetching (trasferimento dalla RAM verso la CPU).
I registri hardware a livello firmware sono simili ai registri dei processori, ma sono presenti esternamente alle CPU.

### Registri del microprocessore

I registri del microprocessore forniscono un livello di memoria più veloce e ridotto rispetto alla memoria principale e svolgono principalmente le seguenti due funzioni:
* registri visibili all'utente: registri ottimizzabili dal programmatore a livello di linguaggio macchina o Assembler. Nei casi di programmazione ad alto livello il compilatore cercherà di fare scelte intelligenti riguardo alle variabili da assegnare ai registri ed alla localizzazione della memoria. Esistono casi in cui è possibile con linguaggi di alto livello (come con il C) specificare al compilatore quali variabili si vorrebbero memorizzare nei registri. Sono tipicamente registri disponibili sia ai programmi applicativi sia a quelli di sistema. Tali registri sono quello dei dati, degli indirizzi e dei condition code. I registri dei dati possono essere destinati dal programmatore a diverse funzioni. Solitamente sono ristretti a particolari tipi di funzione (ad esempio i registri dedicati ad operazioni in virgola mobile), tuttavia possono essere usati in qualsiasi istruzione macchina. I registri degli indirizzi contengono gli indirizzi dei dati e delle istruzioni contenute nella memoria. Tali registri possono essere di tipo generale o dedicati ad un particolare modo di indirizzamento (index register, segment pointer, stack pointer);
* registri di stato e di controllo: usati dalla CPU per controllare le sue operazioni e dal sistema operativo per le sue routine privilegiate per il controllo d'esecuzione dei comandi.

## Esempi

Il numero di registri varia significativamente tra le varie architetture in funzione dell'età dell'ISA e della tipologia di architettura: per esempio le architetture RISC tendono a essere dotate di un elevato numero di registri mentre le architetture CISC che sono mediamente più vecchie tendono ad avere un numero ridotto di registri anche se spesso gli ultimi processori dispongono di un elevato numero di registri nascosti che vengono utilizzati per implementare l'esecuzione superscalare dei programmi.
| Processore | Registri interi | Registri FPU |
| Intel Core Duo | 8 | 8 |
| Intel Core 2 Duo | 16 | 16 |
| Pentium 4 | 8 | 8 |
| Pentium 4 con EM64T | 16 | 16 |
| Athlon 64 | 16 | 16 |
| Athlon MP | 8 | 8 |
| Opteron 240 | 16 | 16 |
| Itanium 2 | 128 | 128 |
| UltraSPARC IIIi | 32 | 32 |
| POWER3 | 32 | 32 |
| MOS 6502 | 3 | 0 |