Wofür steht das "R" in x64-Registernamen?

27

Ich weiß, dass die 32-Bit-Register wie die 16-Bit-Register mit dem Präfix "E" (erweitert) benannt wurden. Ich bin immer davon ausgegangen, dass das bedeutet, von 16 auf 32 Bit erweitert, obwohl ich das nicht explizit gesehen habe.

Ich habe versucht herauszufinden, wofür das "R" steht, aber meine Google-Kenntnisse haben mich im Stich gelassen. Weiß jemand?

Matt
quelle

Antworten:

32

Es bedeutet registrieren , und es ist nicht alles aus historischen Gründen.

Der historische Teil ist, dass Intel es sich zur Gewohnheit gemacht hat, Register mit Buchstaben des 8008 (A bis E plus H und L) zu nummerieren. Dieses Schema war zu der Zeit mehr als angemessen, da Mikroprozessoren nur sehr wenige Register hatten und wahrscheinlich nicht mehr bekommen würden, und die meisten Entwürfe taten es. Die vorherrschende Meinung war damals, dass Software für neue CPUs neu geschrieben werden würde, so wie sie erscheinen, so dass das Ändern des Registernamensschemas zwischen den Modellen keine große Sache gewesen wäre. Niemand hat vorausgesehen, dass sich der 8088 nach der Integration in den IBM-PC zu einer "Familie" entwickelt, und das Joch der Abwärtskompatibilität zwang Intel dazu, Schemata wie das "E" in 32-Bit-Registern einzuführen, um ihn beizubehalten.

Der nicht-historische Teil ist alles praktisch. Die Verwendung von Buchstaben für Allzweckregister beschränkt sich auf 26, weniger, wenn Sie diejenigen ausschließen, die zu Verwechslungen mit den Namen von Allzweckregistern wie dem Programmzähler, den Flags oder dem Stapelzeiger führen können.

Ich habe keine Quelle, um dies zu bestätigen, aber ich vermute, dass die Wahl von Rals Präfix und die Einführung von R8 bis R15 auf 64-Bit-CPUs einen Übergang zu nummerierten Registern signalisiert, die bei 32-Bit- und -Registern die Norm waren - Größere Architekturen, die seit fast einem halben Jahrhundert nicht mehr aus dem 8008 stammen. IBM hat es in den 1960er Jahren mit dem 360 gemacht und es folgen PowerPC, DEC Alpha, MIPS, SPARC, ARM, Intels i860 und i960 sowie eine Reihe anderer, die lange in Vergessenheit geraten sind.

Sie werden feststellen, dass die vorhandenen Register gut in R0 bis R7 passen würden, wenn sie existieren, und es würde mich kein bisschen überraschen, wenn sie intern so behandelt würden. Die vorhandenen Langregister (RAX / EAX / AX / AL, RBX / EBX / BX / BL usw.) werden wahrscheinlich so lange bestehen bleiben, bis die Sonne ausbrennt.

Blrfl
quelle
1
Ein bisschen antiklimaktisch, aber ich denke, ich sollte nicht zu überrascht sein. Vielen Dank.
Matt
3
Das war das ganze Drama, das ich aufbringen konnte. :-)
Blrfl
+1 für die sehr interessante Lektüre. Aber wenn es nur in einer Zeile zusammengefasst wäre, wäre es die Antwort gewesen, die ich gegeben habe. All diese reichhaltigen und interessanten Informationen werden zusammengefasst zu "historischen Gründen" zusammengefasst.
Mike Nakis
6
AMD hat erwägen Umbenennung oder die niedrigen 8 Register Aliasing zu r0- r7oder unter Verwendung UAXanstelle von r8etc. . "Herauszufinden, wie man die Register am besten benennt, war tatsächlich einer der schwierigsten Teile bei der Registererweiterung." (Siehe stackoverflow.com/a/35619528/224132 für weitere Informationen zu x86-64.) Außerdem ist die Reihenfolge in der binären Codierung nicht RAX / RBX / ..., sondern AX, CX, DX, BX
Peter Cordes
9

In den früheren Prozessoren waren nicht alle Register gleich:

  • Auf den Chips war nicht genug Platz, um für jedes Register eine Addiereinheit zu haben.
  • Mit 8 Bits waren nicht genügend Opcodes für alle möglichen Kombinationen von Quelle und Ziel verfügbar.

Die Annahme, dass ein bestimmtes Register immer einbezogen war, wenn der Addierer involviert war, machte den Chip weniger komplex und die Opcodes kürzer.

Beispielsweise konnte der 6510 (in Commodore 64 verwendet) nur mithilfe von Register A hinzufügen, und die Indizierung verwendete entweder X oder Y. Es gibt INC X- und INC Y-Anweisungen, aber keine INC A.

Da die Register unterschiedliche Verwendungszwecke hatten, wurden Mnemoniken ausgewählt, die ihre Verwendung widerspiegeln. ZB A, X und Y im 6510 (anstelle von A, B und C).

Die Namen im 8086 sind so gewählt, dass sie auch ihre Verwendung widerspiegeln. Bei 4 Allzweckregistern war es logisch, sie AX, BX, CX und DX zu nennen. Zusätzliche Indexregister wurden als BP und SP (mnemonisch: Basiszeiger, Stapelzeiger) bezeichnet.

Da viele Opcodes auf 16 Bit erweitert wurden, gab es etwas Platz, um anzuzeigen, welches von vier Registern verwendet wurde. Einige der historischen Gründe galten jedoch immer noch, da CX etwas Besonderes war: REP und dergleichen, bei denen es sich um 8-Bit-Opcodes handelt, verwenden immer CX als Zähler. Eine einfache Mnemonik, CX = Counter, hilft, sich zu merken, welcher verwendet wird.

Die Opcodes für Nachfolger des 8086 mussten abwärtskompatibel sein und sind aufgrund der Opcodes mit variabler Länge ein Chaos. Als 32-Bit-Busse häufiger wurden, wurden Prozessoren mit fester Opcode-Länge ausprobiert. Dies vereinfacht den Dekodierungsteil der CPU, wodurch Speicherplatz freigesetzt wird, der beispielsweise für mehr Register verwendet werden könnte.

Prozessoren, die dieser Denkrichtung folgten, werden im Gegensatz zur CISC (Complex Instruction Set CPU) als RISC-Prozessoren (Reduced Instruction Set CPU) bezeichnet.

Mehr Register bedeuten weniger Überlauf in den Speicher. Grundsätzlich sind Register der schnellste verfügbare Cache. Daher ist es auch heutzutage eine gute Idee, die Anzahl der Register zu erhöhen. Das Fehlen spezialisierter Anweisungen wurde (hoffentlich mehr als) durch den schnelleren Durchsatz einfacher Anweisungen kompensiert.

32-Bit-Opcodes mit fester Länge haben genug Platz, um eine Quelle, eine zweite Quelle, eine Operation und ein Ziel aufzunehmen. SPARC schaffte es, jeweils 5 Bits für die Quelle, die zweite Quelle und das Ziel zu wringen, und daher waren 32 Register gleichzeitig sichtbar.

32 Register sind zu viele, um Buchstaben zu verwenden, und sie waren sowieso größtenteils gleich, daher lag es nahe, sie zu nummerieren. Das 'R' wurde verwendet, um sie von den Konstanten 0..31 zu unterscheiden, und 'R' war eine einfache Bezeichnung für Register. Deshalb: R0..R31.

Im Laufe der Jahre haben der Pentium und seine Nachfolger die Rückwärtskompatibilität aufrechterhalten. Viele der erfolgreicheren RISC-Ideen wurden jedoch ebenfalls einbezogen. Häufig werden diese neuen, RISC-ähnlichen Anweisungen schneller ausgeführt als die abwärtskompatiblen Versionen.

Die Anzahl der Register wurde ebenfalls von Intel erhöht, um die Anzahl der Speicherzugriffe zu verringern.

Und anscheinend hat Intel endlich angefangen, die R-Notation zu verwenden. Die Abwärtskompatibilität stellt sicher, dass AX, BX, ... erhalten bleiben, aber ich wette, dass AX nur ein Synonym für z. B. R0 ist.


Haftungsausschluss : Das Obige ist meine Sicht auf die Geschichte. Es wird unvollständig sein, da ich nicht dabei war, die früheren Teile der Geschichte aus erster Hand mitzuerleben. Trotzdem hoffe ich, dass es einigen nützlich ist.

Sjoerd
quelle
1
Die 6500-Familie brauchte wirklich keinen speziellen Befehl, um den Akkumulator zu erhöhen, da eine Sofortmodus-Addition von 1 die gleichen zwei Zyklen wie eine INXoder benötigte INY, obwohl der Code ein zusätzliches Byte belegte. Ich habe eine Menge Assembler für diesen Chip geschrieben und in der Praxis war diese Art von Inkrement selten, abgesehen davon, dass ich Mathe machte, die es brauchte.
Blrfl
@Blrfl Sie haben Recht: Funktioniert ADD 1, es war also kein spezialisiertes "Erhöhen von A" erforderlich. Und ich kann mich auch nicht erinnern, es gebraucht zu haben.
Sjoerd
1
Es ist zu beachten, dass nicht Intel die Anzahl der Register in x64 erhöht und benannt hat, sondern AMD, da die 64-Bit-Erweiterungen für x86 von AMD erstellt wurden . Das 64-Bit-Design von Intel war Itanium , was nicht ganz so gut gelungen ist, obwohl es eine Menge (128 Integer-Werte für allgemeine Zwecke und viele andere) von Registern enthielt.
8bittree,
5

Es bedeutet nur "registrieren". Aus historischen Gründen.

Mike Nakis
quelle
Es ist nicht wirklich so historisch, wenn es sich derzeit auf ein Register bezieht, oder? Ich würde sagen, dass die anderen Namen für Register (AX, EAX usw.) eher historische Gründe haben. Aber dass das "R" in RAX tatsächlich sehr aktuell ist.
Carl G
1
(+1) meme: "Wenn du es lange erklären kannst, kannst du es kurz erklären."
user7813604