# Registergeheugen

Registergeheugen is intern geheugen dat gebruikt wordt in processors om waarden op te slaan waar de processor direct toegang toe moet hebben om zijn werk te kunnen voltooien.

## Gebruik

Een processor, zoals die normaal voorkomt in computers, is een Von Neumannmachine die voortdurend de drie stappen van Von Neumann uitvoert: Haal de volgende instructie op - decodeer de instructie - voer de instructie uit.
Alle data in de computer zijn gecodeerd in de vorm van bitrijen - rijen van 1'en en 0'en. Om de bovengenoemde stappen uit te kunnen voeren, moet de processor een instructie in de vorm van een bitrij ophalen, vervolgens uit deze bitrij afleiden welke instructie de bitrij voorstelt en ten slotte de instructie uitvoeren. Tijdens het uitvoeren van dit werk heeft de processor een plaats nodig om de invoer en eventuele tussenresultaten op te slaan. Dit is bijvoorbeeld nodig voor het optellen of vermenigvuldigen van twee waarden: invoer, uitvoer en tussenresultaten moeten allemaal ergens opgeslagen worden, totdat de processor het resultaat wegzet en met de volgende instructie kan beginnen. Hiervoor zou een deel van het RAM, het zogenaamde werkgeheugen, waarmee Iedere computer uitgerust is, gebruikt kunnen worden. Dit geheugen is via een bus verbonden met de processor. De afstand tussen processor en dit geheugen (te overbruggen via de bus) maakt een dergelijke oplossing echter ondoenlijk: voor iedere microstap van de processor zouden de bits af- en aangevoerd moeten worden over die enorm lange bus. Om deze reden beschikt de processor over een hoeveelheid geïntegreerd geheugen dat hij directer kan benaderen. Deze groepen cellen worden registers genoemd en vormen samen het registergeheugen.

## Kosten en baten

Zoals eerder opgemerkt, bevindt het registergeheugen zich direct op de processor. De processor heeft hierdoor veel sneller toegang tot de data die in zijn registers opgeslagen liggen - de datapaden tussen de registers en de bewerkingseenheden van de processor zijn extreem kort. Het gebruik van registergeheugen is dan ook ettelijke malen sneller dan het gebruik van RAM, zowel in de toegangstijd tot het geheugen als in de opzoektijd (die gelijk is aan 0 μs).
Hier staat tegenover dat de registers in de processor geïntegreerd zijn; registers zijn dus vele malen duurder per eenheid van opslag dan RAM en nog eens veel duurder dan bijvoorbeeld opslagruimte op een harde schijf. Bovendien is het aantal registers gelimiteerd door de beschikbare oppervlakte van de processor, hoewel steeds verdergaande miniaturisering de mogelijke hoeveelheid geheugen op de processor wel vergroot. Het is dus vooral zaak voor de besturing van de computer (zowel in de hardware-zin als in de zin van de programma's) om een optimale verdeling van de benodigde geheugencapaciteit tussen registergeheugen en RAM te bereiken.

## Registersoorten

In grote lijnen zijn er twee soorten bitrijen waar een processor mee te maken krijgt tijdens zijn werk:
* Informatiedragende bitrijen: Dit zijn bitrijen die pure data bevatten, zoals een karakter dat op de monitor moet verschijnen of een getal dat ergens bij opgeteld moet worden
* Besturingsgevoelige bitrijen: Dit zijn bitrijen die invloed hebben op de werking van de processor. Ze bevatten instructies voor de processor en verwijzingen naar cellen in het RAM waar de processor weer andere bitrijen kan vinden die van belang zijn voor het uitvoeren van zijn werk. Deze verwijzingen worden adressen genoemd.
Hoewel beide bitrijen feitelijk niet meer zijn dan rijen 1'en en 0'en (strikt volgens het principe van John von Neumann), zijn er toch verscheidene processors die hun beschikbare registers "specialiseren" naar toepassing (adressen of data). Hoewel de fysieke opbouw van de twee soorten registers niet verschilt, is het door deze onderverdeling vaak mogelijk om betere prestaties te behalen in de werking van de processor, omdat er bij de implementatie van een aantal instructies in de processor van uit kan worden gegaan dat bepaalde registers bepaalde soorten data bevatten.
Overigens is de bovengenoemde scheiding niet absoluut. Er zijn genoeg processors op de markt die een dergelijk onderscheid niet aanbrengen, of die wel een onderscheid aanbrengen, maar dan ook een derde groep van registers hebben die beide soorten data mogen bevatten, of waarvan de adresregisters puur voor adressen zijn en de dataregisters data of adressen mogen bevatten.

### Overzicht van typen

Er zijn verschillende soorten registers te onderscheiden:
* Dataregisters slaan gehele getallen op. In sommige oudere architecturen en eenvoudige moderne processors is er een speciaal dataregister, de accumulator, dat impliciet wordt gebruikt voor veel bewerkingen.
* Adresregisters bevatten geheugenadressen en worden gebruikt om computergeheugen te benaderen. In sommige processoren is er een speciaal adresregister, het indexregister.
* General purpose-registers (GPRs) Deze registers kunnen zowel getallen als adressen bevatten.
* Floating point-registers (FPRs) worden gebruikt om floating point-getallen op te slaan.
* Constante-registers bevatten waarden die constant zijn (nul, een, pi, ...).
* Vectorregisters bevatten gegevens voor vectorprocessoren uitgevoerd met SIMD-instructies.
* Special purpose-registers bevatten de status van een programma. Over het algemeen worden hier de instructiepointer, de stackpointer en het statusregister bijgehouden.
** Instructieregisters bevatten de instructies die op dat moment worden uitgevoerd.
** Indexregisters worden gebruikt voor het aanpassen van operand-adressen tijdens de uitvoering van een programma.
* Registers die worden gebruikt voor het lezen van gegevens uit het hoofdgeheugen, een verzameling van opslagregisters die op andere chips dan de processor aanwezig zijn:
** Geheugenbufferregister
** Geheugendataregister
** Geheugenadresregister

### Registers en compilerbouw

Deze wildgroei aan mogelijkheden zorgt voor een aanzienlijke uitdaging aan schrijvers van compilers. Hun compilers vertalen programma's in machine-instructies en bouwen daarbij ook een verdeling op van opslag van data over registers en geheugen, registerallocatie genoemd. Het is voor de programmeur een grote uitdaging om programma's zo te vertalen dat de opgebouwde verdeling optimaal is en zo de beste prestaties uit het gehele systeem haalt.