Que signifie le «R» dans les noms de registre x64?

27

Je sais que les registres 32 bits ont été nommés comme les registres 16 bits avec un préfixe «E» pour signifier étendu. J'ai toujours supposé que cela signifiait étendu de 16 à 32 bits, même si je n'ai jamais vu cela explicitement indiqué.

J'essayais de savoir ce que signifie le «R», mais mes compétences sur Google m'ont échoué. Quelqu'un sait?

Mat
la source

Réponses:

32

Cela signifie s'inscrire , et ce n'est pas tout pour des raisons historiques.

La partie historique est qu'Intel a pris l'habitude d'énumérer les registres avec des lettres avec le 8008 (A à E plus H et L). Ce schéma était plus que suffisant à l'époque car les microprocesseurs avaient très peu de registres et n'étaient pas susceptibles d'en obtenir plus, et la plupart des conceptions le faisaient. Le sentiment dominant était alors que le logiciel serait réécrit pour les nouveaux processeurs au fur et à mesure qu'ils apparaissaient, donc changer le schéma de nommage des registres entre les modèles n'aurait pas été un gros problème. Personne n'a prévu que le 8088 deviendrait une "famille" après avoir été incorporé au PC IBM, et le joug de la compatibilité descendante a à peu près obligé Intel à devoir adopter des schémas comme le "E" sur les registres 32 bits pour le maintenir.

La partie non historique est toute pratique. L'utilisation de lettres pour les registres à usage général vous limite à 26, moins si vous éliminez ceux qui pourraient prêter à confusion avec les noms des registres à usage spécial comme le compteur de programme, les indicateurs ou le pointeur de pile.

Je n'ai pas de source pour le confirmer, mais je soupçonne le choix de Rcomme préfixe et l'introduction de R8 à R15 sur les processeurs 64 bits signale une transition vers des registres numérotés, qui ont été la norme entre 32 bits et -des architectures plus grandes non dérivées du 8008 depuis près d'un demi-siècle. IBM l'a fait dans les années 1960 avec le 360 ​​et a été suivi par le PowerPC, le DEC Alpha, le MIPS, le SPARC, l'ARM, les i860 et i960 d'Intel et un tas d'autres qui sont depuis longtemps oubliés.

Vous remarquerez que les registres existants s'intégreraient bien dans R0 à R7 s'ils existaient, et cela ne me surprendrait pas un peu s'ils sont traités de cette façon en interne. Les registres longs existants (RAX / EAX / AX / AL, RBX / EBX / BX / BL, etc.) resteront probablement jusqu'à ce que le soleil s'éteigne.

Blrfl
la source
1
Un peu anticlimatique mais je suppose que je ne devrais pas être trop surpris. Merci.
Matt
3
C'était tout le drame que je pouvais rassembler. :-)
Blrfl
+1 pour la lecture très intéressante. Mais si cela devait être résumé en une seule ligne, ce serait la réponse que j'ai donnée. Toutes ces informations riches et intéressantes se résument à des "raisons historiques" si elles sont résumées.
Mike Nakis
6
AMD ne considère renommer ou aliasing les 8 registres à bas r0- r7ou en utilisant au UAXlieu de r8, etc. . "Trouver la meilleure façon de nommer les registres était en fait l'une des parties les plus difficiles de l'extension du registre." (Voir stackoverflow.com/a/35619528/224132 pour un autre historique soigné x86-64.) De plus, la commande n'est pas RAX / RBX / ... dans l'encodage binaire, c'est AX, CX, DX, BX
Peter Cordes
9

Dans les processeurs précédents, tous les registres n'étaient pas égaux:

  • Il n'y avait pas assez d'espace sur les puces pour avoir une unité additionneur pour chaque registre.
  • Avec 8 bits, il n'y avait pas assez d'opcodes disponibles pour toutes les combinaisons possibles de source et de destination.

Ainsi, en supposant qu'un registre spécifique était toujours impliqué lorsque l'additionneur était impliqué, la puce était moins complexe et les opcodes plus courts.

Par exemple, le 6510 (utilisé dans le Commodore 64) ne pouvait ajouter qu'à l'aide du registre A et l'indexation utilisait X ou Y. Il existe des instructions INC X et INC Y, mais pas INC A.

Les registres ayant des usages différents, les mnémoniques ont été choisis en fonction de leur utilisation. Par exemple, A, X et Y dans le 6510 (au lieu de A, B et C).

Les noms du 8086 sont également choisis pour refléter leur utilisation. Avec 4 registres à usage général, il était logique de les nommer AX, BX, CX et DX. Des registres d'indexation supplémentaires ont été appelés BP et SP (mnémonique: Base Pointer, Stack Pointer).

Comme de nombreux opcodes ont été étendus à 16 bits, il y avait un espace pour indiquer quel registre sur quatre était utilisé. Cependant, certaines des raisons historiques s'appliquaient toujours, car CX était un peu spécial: REP et autres, qui sont des opcodes 8 bits, utilisent toujours CX comme compteur. Un simple mnémonique, CX = Counter, aide à se rappeler lequel est utilisé.

Les opcodes pour les successeurs du 8086 devaient être rétrocompatibles et sont un gâchis en raison des opcodes de longueur variable. Lorsque les bus 32 bits sont devenus plus courants, des processeurs avec une longueur d'opcode fixe ont été essayés. Cela simplifie la partie de décodage du CPU, ce qui a libéré de l'espace qui pourrait être utilisé par exemple pour plus de registres.

Les processeurs qui ont suivi cette ligne de pensée sont appelés processeurs RISC (CPU à jeu d'instructions réduit), en contraste avec le CISC (CPU à jeu d'instructions complexes).

Plus de registres entraînent moins de débordements dans la mémoire. Fondamentalement, les registres sont le cache le plus rapide disponible, donc augmenter le nombre de registres est une bonne idée, même de nos jours. Le manque d'instructions spécialisées a été (espérons-le plus) compensé par la rapidité d'exécution d'instructions simples.

Les opcodes 32 bits de longueur fixe ont suffisamment d'espace pour inclure une source, une deuxième source, une opération et une destination. SPARC a réussi à tordre 5 bits pour chacune de la source, de la deuxième source et de la destination, et a donc 32 registres visibles en même temps.

32 registres sont trop nombreux pour utiliser des lettres, et ils étaient pour la plupart égaux de toute façon, donc les numéroter était le choix évident. Le «R» a été utilisé pour les distinguer des constantes 0..31, et le «R» était un mnémonique facile pour Register. Par conséquent: R0..R31.

Au fil des ans, le Pentium et ses successeurs ont conservé une compatibilité ascendante. Cependant, bon nombre des idées les plus réussies du RISC ont également été intégrées. Souvent, ces nouvelles instructions de type RISC s'exécuteront plus rapidement que les versions rétrocompatibles.

Le nombre de registres a également été augmenté par Intel, afin de réduire le nombre d'accès à la mémoire.

Et apparemment, Intel a finalement commencé à utiliser la notation R. La rétrocompatibilité garantira que AX, BX, ... resteront, mais je parierais que AX n'est qu'un synonyme, par exemple, de R0.


Avertissement : Ce qui précède est mon point de vue sur l'histoire. Ce sera incomplet car je n'étais pas là pour assister aux premières parties de l'histoire de première main. J'espère néanmoins que cela sera utile à certains.

Sjoerd
la source
1
La famille 6500 n'avait vraiment pas besoin d'une instruction dédiée pour incrémenter l'accumulateur car une addition en mode immédiat de 1 prenait les deux mêmes cycles qu'un INXou INY, bien que le code occupe un octet supplémentaire. J'ai écrit beaucoup d'assemblage pour cette puce et dans la pratique, ce type d'incrément était rare en dehors des mathématiques qui en avaient besoin.
Blrfl
@Blrfl Vous avez raison: ADD 1fonctionne donc il n'y avait pas besoin d'une «augmentation A» spécialisée. Et je ne me souviens pas en avoir eu besoin non plus.
Sjoerd
1
Il convient de noter que ce n'est pas Intel qui a augmenté le nombre de registres en x64 et les a nommés, mais AMD, car les extensions 64 bits de x86 ont été créées par AMD . La conception 64 bits d' Intel était Itanium , qui n'a pas si bien fonctionné, bien qu'ils y aient mis beaucoup (128 entiers à usage général, ainsi que de nombreux autres) de registres.
8bittree
5

Cela signifie simplement «s'inscrire». Pour des raisons historiques.

Mike Nakis
la source
Ce n'est pas vraiment historique s'il fait actuellement référence à un registre, n'est-ce pas? Je dirais que les autres noms de registres (AX, EAX, etc.) sont plus pour des raisons historiques. Mais que le "R" dans RAX est en fait très présentement applicable.
Carl G
1
(+1) meme: "Si vous pouvez l'expliquer longtemps, vous pouvez l'expliquer brièvement."
user7813604