Ein Register ist in der Digitaltechnik eine nach Funktion zusammengefasste Gruppe von einzelnen Speicherzellen – oft Flipflops, manchmal auch DRAM-Zellen – innerhalb eines Prozessors oder Peripheriebausteins.
Die Gesamtheit aller Register eines solchen Bausteins bezeichnet man als dessen Registersatz. Register werden allgemein für die Wahl der Betriebsmodi, im Prozessor zusätzlich zum Zwischenspeichern von Befehlen, Speicheradressen, Rechenoperanden und in Peripheriebausteinen auch zum Zwischenspeichern von Ein- und Ausgabewerten benutzt.
Registertypen in der CPU
In CPUs stehen Register an der Spitze der Speicherhierarchie und sind daher die schnellste Möglichkeit, Daten zu manipulieren, da der Zugriff unabhängig vom Daten- oder Adressbus erfolgt.
Die Registersätze verschiedener Arten von Prozessoren unterscheiden sich in der Art, der Anzahl und der Größe der zur Verfügung stehenden Register.
Datenregister
Datenregister werden benutzt, um Operanden zu speichern. Prozessoren neuerer Generation besitzen oft Datenregister mit Akkumulatorfunktion.
In der Regel ist die Größe des Datenregisters zusammen mit der Breite des Datenbus mit ausschlaggebend für die Einordnung des Prozessors als 8-, 16-, 32- oder 64-Bit-Prozessor. Prozessoren mit 8-Bit-Datenbus und 8-Bit-Datenregistern werden als 8-Bit-Prozessoren bezeichnet, z. B. MOS Technologies 6502 oder Zilog Z80. Prozessoren mit unterschiedlicher Größe von Datenbus und Datenregistern werden häufig auch entsprechend bezeichnet, z. B. der Motorola 68000, der mit 16-Bit-Datenbus und 32-Bit-Datenregistern als 16-/32-Bit-Prozessor bezeichnet wird. Die derzeit (2005) neuesten Prozessoren sind meistens 64-Bit-Prozessoren, z. B. Alpha AXP, AMD Opteron, oder Intel-Prozessoren mit EM64T sowie Itanium.
Bei 8-Bit-Prozessoren waren Adressbus und Adressregister meistens 16 Bit groß. Bei den meisten heutigen Prozessoren sind die Addressregister genauso groß wie die Datenregister, der Adressbus meistens gleich groß oder kleiner.
Meistens sind die Datenregister nur mit der ALU verbunden, nicht jedoch mit der FPU. Das heißt, in den meisten Prozessoren können Datenregister nicht als Operanden für FPU-Operationen verwendet werden. In diesem Fall müssen Operanden für die FPU in speziell dafür vorgesehenen Registern, den Fließkommaregistern, gespeichert werden.
Adressregister
Die Adressregister spielen eine wichtige Rolle in der Adressarithmetik. Adressregister werden für die Berechnung von Speicheradressen eines Operanden oder Befehls genutzt. Sie haben Verbindung mit dem internen Datenbus und dem Adressbus.
Bei indizierter Adressierung, z. B. beim Intel 8086, werden zwei Typen von Adressregistern unterschieden, die Indexregister und die Basisadressregister, auf die bei den Spezialregistern eingegangen wird. Indexregister speichern den Offset zu einer Basisadresse, der oft vorzeichenbehaftet ist.
Für das Indexregister berechnet ein spezieller Addierer die Summe aus dem Indexregisterwert und einem Offset, der auf dem internen Datenbus anliegt. Die sich ergebende Summe wird auf dem Adressbus ausgegeben.
Bei linearer Adressierung, z. B. beim Motorola 68000, gibt es keine solche Unterscheidung bei den Adressregistern, auch wenn indirekte Adressierungsarten unter Umständen unterstützt werden.
Frei verwendbare Register
Moderne CPUs, z. B. PowerPC, besitzen frei verwendbare Register (engl. GPR für General Purpose Register). Diese Register lassen sich beliebig je nach Bedarf als Datenregister oder als Adressregister einsetzen.
Spezialregister
Spezialregister sind nicht vom Anwender programmierbar. Sie speichern den Betriebszustand des Prozessors, außerdem erfüllen sie Hilfsfunktionen für den Prozessor.
Bei den meisten Architekturen sind folgende Spezialregistertypen anzutreffen:
- Befehlszählregister, auch Programmzähler oder Befehlszähler, (englisch Instruction Pointer (IP (16-Bit)) bzw. Extended Instruction Pointer (EIP (32-Bit)) oder program counter (PC)): das Befehlszählregister enthält je nach Systemarchitektur die Speicheradresse des derzeitigen oder des nächsten auszuführenden Befehls;
- Befehlsregister (Instruction register): speichert den aktuellen Befehl;
- Basisregister, z. B. für die Basisvektortabelle;
- Statusregister (englisch: Condition Code Register, CCR oder auch Processor Status Word, PSW): geben bestimmte Zustände nach Ausführung eines Befehls an (bspw. Zero-Flag, Vorzeichen-Flag etc.);
- Interrupt-Steuerregister (englisch: Interrupt Control Register): Bei komplexeren CPUs, wo diese Funktionalität nicht mit einem oder zwei Bits im Statusregister (s. o.) abgehandelt werden kann, kann hierüber sehr differenziert vorgegeben werden, auf welche Interrupts überhaupt bzw. mit welcher Priorität reagiert werden soll. Durch Lesen kann die Software herausfinden, welcher der verschiedenen Interrupts überhaupt vorliegt.
Stackregister
Die Stackregister (englisch stack pointer (SP)) sind Adressregister zur Verwaltung von Stapelspeichern. Ein Stapelspeicher, auch Kellerspeicher oder nur Stack genannt, wird von einem Stackregister nach dem LIFO-Prinzip organisiert und kann mit Push- bzw. Pop-Operationen gefüllt bzw. geleert werden. Dabei zeigt das Stackregister immer auf die Speicheradresse am Ende des Stacks, je nach Architektur auf oder zumeist hinter das letzte Element. Auf den meisten Architekturen existiert ein System-Stack und ein Anwender-Stack. Das Betriebssystem nutzt den System-Stack zur Sicherung und Restauration des Prozessorstatus bei der Prozessumschaltung. Der Anwender-Stack kann vom Programmierer frei genutzt werden.
Ein-/Ausgaberegister
Neben Pufferplätzen in der Zentraleinheit des Rechnersystems können Register auch in der Elektronik angeschlossener Peripheriegeräte oder -chips auftreten, aber auch die CPU selbst kann über integrierte Ein-/Ausgaberegister verfügen. Sie lassen sich in der Regel in die gleichen Unterkategorien einteilen wie die obige Liste für reine CPU-Register. Ein paar repräsentative Beispiele:
- Die Statusregister der Steuerwerke der externen Massenspeicher umfassen neben Zustands- und Datenregistern in der Regel Adressregister, die sich auf Adressangaben des Massenspeichers beziehen, heute meistens Sektornummern.
- In Video-Chips steuern die Bits in den Zustandsregistern z. B. die verschiedenen Video-Modi, Datenregister können z. B. Sprite-Daten enthalten.
- Bei einer parallelen Schnittstelle enthält ein Datenregister die eigentlichen Druckdaten und ein Zustandsregister die Handshake-Bits. Oft gibt es hier zusätzlich ein Zustandsregister namens DDR (für data direction register), über das die Datenrichtung (Ein- oder Ausgang) der Datenleitungen programmiert werden kann (z. B. bei bidirektionaler Verwendung).
Diese I/O-Register sind häufig über Portnummern als I/O-Ports auch vom Programm der Zentraleinheit erreichbar, oder werden in den Adressraum des Hauptspeichers eingeblendet (Memory Mapped I/O). Je nach Sichtweise hat sich dabei dennoch die begriffliche Unterscheidung von Speicherplätzen in den RAM-Speicherbanken und Registerplätzen an Logikbausteinen erhalten.
Geschichte
Die Begriffsbildung der Register ist eng verknüpft mit der technischen Entwicklung des Arbeitsspeichers der frühesten elektronischen Computer: die ersten Computer hatten gar keinen Arbeitsspeicher im heutigen Sinne. Sämtliche Daten und das Programm selbst waren auf gänzlich anderen Medien, wie zum Beispiel Lochkarten und magnetischen Trommelspeichern, abgelegt. Damit das Rechenwerk eine Operation ausführen konnte, mussten vom nichtelektrischen Massenspeicher einige Worte in elektrische Pufferschaltungen übertragen werden, die einen Spannungswert in die Schaltlogik abgeben konnten. Der am Ausgang der Schaltlogik entstehende Wert musste wieder gepuffert werden, bis er auf den Massenspeicher ausgeschrieben werden konnte. Ebendiese Pufferplätze nannte man Register (englisch Eintragung aus Erfassung).
Schon früh erkannte man, dass der Programmablauf optimiert werden konnte, wenn man Zwischenwerte auch über einige wenige Operationen hinweg puffern konnte, und etwa in der übernächsten Operation aufaddieren konnte. So wurden aus Einzelregistern ein Registersatz, die zuerst ebenfalls noch aus Röhren oder Relais bestanden, mit fortschreitender technischer Entwicklung dann aber durch Ferritkernspeicher ersetzt wurden. Die damit mögliche Adressberechnung für den Kernspeicher führte zu einer Aufspaltung der Begriffe – die Nennung als Register meint weiterhin Pufferplätze, deren Ort im Befehlscode des Rechenwerks hart codiert ist, während der Kernspeicher über Indexregister indirekt adressiert wird.
Zur Zeit der Kernspeicher waren die Datenwerte im Arbeitsspeicher noch direkt mit dem Rechenwerk verknüpft. Ein Befehlscode enthielt neben Rechenregistern, deren Wert direkt in die Rechenlogik einging, die codierte Angabe von Indexregistern, deren Wert auf die Adressleitungen des Kernspeichers gelegt wurde, und der ausgehende Wert der Ferritkerne dann in die Rechenlogik geführt wird. Der Kernspeicher konnte dabei einige tausend Plätze umfassen. Mit immer schnellerem Rechenwerk und dem Übergang zu billigerem aber langsameren Hauptspeicher auf Basis von Kondensatoren (dynamischer RAM) wurden wieder Pufferplätze notwendig, bei dem Werte aus dem Hauptspeicher erst in Registerplätze am Rechenwerk kopiert werden, um von dort verarbeitet zu werden.