# Registre de processeur

Un registre est un emplacement de mémoire interne à un processeur. Les registres se situent au sommet de la hiérarchie mémoire : il s'agit de la mémoire la plus rapide d'un ordinateur, mais dont le coût de fabrication est le plus élevé, car la place dans un microprocesseur est limitée.
Une architecture externe de processeur définit un ensemble de registres, dits architecturaux, qui sont accessibles par son jeu d'instructions. Ils constituent l'état externe (architectural) du processeur. Cependant, une réalisation donnée d'une architecture interne (microarchitecture) peut contenir un ensemble différent de registres, qui sont en général plus nombreux que les registres architecturaux. Ils stockent non seulement l'état externe du processeur, mais aussi celui de sa microarchitecture : valeurs opérandes, indicateurs, etc. Ce dernier état est utilisé exclusivement par la microarchitecture, et n'est pas visible par le jeu d'instructions (architecture). Un processeur peut contenir plusieurs centaines de registres, mais, à titre d’exemple, un processeur Intel 32 bits en contient seize. Chaque registre a une capacité de 8, 16, 32 ou 64 bits (couramment la taille d’un bus).
La plupart des architectures modernes sont qualifiées de load-store : les programmes transfèrent d'abord des données de la mémoire centrale vers des registres, puis effectuent des opérations sur ces registres, et enfin transfèrent le résultat en mémoire centrale.

## Utilisation des registres
### Registres spécialisés

Sur de nombreux processeurs, les registres sont spécialisés et ne peuvent contenir qu'un type bien précis de données.
On rencontre souvent les classes de registres suivantes :
* les registres entiers, chargés de stocker des nombres entiers (et éventuellement des adresses) ;
* les registres flottants, qui stockent des nombres à virgule flottante ;
* les registres d'adresses : sur certains processeurs, les adresses mémoires à manipuler sont placées dans ces registres dédiés ;
* les registres d'Index, qui servaient à faciliter certains calculs d'adresses sur de vieilles architectures ;
* les registres à prédicats, des registres qui stockent des résultats de comparaisons et d'instructions de tests divers.
Un processeur contient souvent des registres spécialisés, présents en un seul exemplaire. On trouve parmi ceux-ci :
* compteur ordinal (CO) : indique l'emplacement de la prochaine instruction à être exécutée (synonymes : compteur de programme, pointeur d'instruction) ;
* registre d'état (PSW pour Processor Status Word) : décrit l'état du processeur ; il est le plus souvent interprété bit à bit, chaque bit représentant un drapeau ;
* pointeur de pile : indique la position du prochain emplacement disponible dans la pile mémoire.

### Registres généraux

Sur certaines architectures, l'ensemble ou une partie des registres spécialisés sont remplacés par des registres généraux (en anglais, general-purpose register ou GPR) interchangeables (parfois notés R0, R1, etc.). Ceux-ci peuvent stocker indifféremment des adresses, des entiers, des flottants, etc. Par exemple, le Motorola 68000 dispose de 8 registres de données banalisés (D0 à D7) et de 8 registres d'adresses (A0 à A7, banalisés sauf A7 qui sert de pointeur de pile).
Sur la majorité des processeurs, ces registres généraux ne sont pas les seuls registres du processeur, qui contient aussi des registres spécialisés comme un compteur ordinal ou un registre d'état. Mais sur certains processeurs, il se peut que ces registres soient malgré tout des registres généraux, adressables comme tous les autres registres. Il devient alors possible d'écrire ou de lire directement leur contenu sans restrictions. Cela peut servir pour faciliter l'implémentation des branchements indirects ou relatifs (si le compteur ordinal devient un registre général).

## Référencement des registres

Sur les processeurs disposant de plusieurs registres de même type (des registres entiers, flottants ou généraux), certaines instructions peuvent manipuler indifféremment certains registres. Dans ce cas, elles doivent préciser quel est le registre à manipuler. Sélectionner un registre pour une manipulation peut s'effectuer de diverses manières au niveau du code machine.

### Registres non-référençables

Certains registres n'ont pas besoin d'être sélectionnés. On les manipule implicitement avec certaines instructions. Le seul moyen de manipuler ces registres est de passer par une instruction appropriée. C'est le cas pour le Program Counter : à part sur certains processeurs vraiment très rares, on ne peut modifier son contenu qu'en utilisant des instructions de branchement. Idem pour le registre d'état, manipulé implicitement par les instructions de comparaisons et de test, et certaines opérations arithmétiques. Idem aussi pour le stack pointer sur certaines architectures.

### Noms de registres

Autre possibilité : numéroter certains registres. Ce numéro est l'équivalent des adresses pour la mémoire RAM. Ce numéro est ce qu'on appelle un nom de registre. Ce n'est rien d'autre qu'une suite de bits différente attribuée à chaque registre. Celle-ci sera intégrée à toutes les instructions devant manipuler ce registre, afin de sélectionner celui-ci.

### Registres adressables

Il est possible de faire correspondre les registres avec des adresses mémoire, typiquement à partir de 0 (c’est-à-dire que les cases mémoire d'adresse 0 à 31 pourront correspondre aux registres R0 — R31). C'est par exemple le cas des 16 registres du PDP-10. Les programmeurs astucieux désirant optimiser le temps d'exécution d'une boucle de code avaient donc la possibilité de la stocker dans les registres. Cette méthode évidemment marginale et dépendante de l'architecture de l'ordinateur montre la versatilité des registres généraux.

## Réalisation physique

Divers procédés ont été retenus pour la réalisation des registres, notamment de la RAM statique, d'abord sous forme de bascules individuelles, puis plus récemment sous forme de bancs de registres.