Register (arvutitehnika)

**Register** arvutitehnikas tähistab väikesemahulist mälu arvuti keskprotsessoris, millega andmevahetus toimub väga kiirelt, ühe protsessoritakti jooksul. Võrdluseks, ligipääs põhimälule võib aega nõuda mitmesaja takti jagu. Registrid on realiseeritud trigeritel, mistõttu voolukatkestusel neis info hävib. Kõik arvutused toimuvad reaalselt protsessori registrites, mitte põhimälus asuvate andmetega.

## Protsessori registrid
Protsessoris on terve hulk arhitektuurist tingitud spetsiifiliste ülesannetega registreid. Osa neist on "avalikud" (*user-accessible*), programmeerijale masinkoodi vahendusel vabalt manipuleeritavad; teine osa on "peidetud" (*internal*), ainult riistvara toimimiseks tarvilikud registrid.

Mitmetuumalistel protsessoritel on iga tuuma jaoks oma komplekt registreid. *[[Hüper-hargtöötlus|Hyper-threading]]* tehnoloogia puhul on ühe füüsilise protsessorituuma kohta kaks komplekti registreid, mis võimaldab ühel virtuaalsel tuumal tööd poolelijäänud kohast jätkata, niipea kui teine virtuaalne tuum pausi teeb.
### Avalikud registrid
* Andmeregister (*data register*) – hoiab arvutustehete operande ja resultaati, täisarve, ujukomaarve, tärksümboleid vm andmeid.
* Aadressiregister (*address register*) – sisaldab viita põhimälu aadressile. Mäluadresseerimiseks on kasutusel erinevaid meetodeid. 
** Üheks aadressiregistri näiteks on pinuviit (*stack pointer*), mis osutab pinu vabale kohale. 
** Programmiloendur e. käsuloendur (*program counter*) viitab parasjagu täitmises oleva käsu aadressile. Iga käsu täitmisel suurendatakse seda automaatselt. Hargnemiskäsud e. hüpped koodi läbimisel kirjutavad programmiloendurisse uue väärtuse. 
** Segmendiregister osutab parasjagu adresseeritava mälusegmendi alusaadressile.  
* Olekuregister (*status register*) säilitab infot protsessori oleku kohta, ja muud olulist metainfot – kas eelmise tehte tulemus oli null või negatiivne; resultaadi paarsus; kas toimus ületäitumine; kas katkestused on parasjagu lubatud; mis moodis protsessor parajasti on jpm. Sellest infost lähtudes saavad toimuda koodis tingimuslikud hargnemised. 
* Mitmes arhitektuuris on tarvitusel spetsiaalsed ujukoma-registrid (*floating-point registers*) ujukomaarvudega optimaalseks opereerimiseks.
* Konstant-registrid sisaldavad arvutuste kiirendamiseks sageli tarvitatavaid konstante – näiteks arvud 0; 1; 10; pii.
* SIMD (*Single Instruction Multiple Data*) arhitektuuri juures on kasutusel vektor-registrid (andmeregistrite jada), kus üks masinkoodi käsk teostab tehte mitte ühe registri, vaid korraga terve jada peal.
* Aku- või kogumis- või sihtregistrisse (*accumulator register*) kirjutatakse aritmeetika-loogikaseadmes sooritatud tehte tulemus.
* Sõltuvalt arhitektuurist võivad registrid täita rohkem kui ühte ülesannet, mistõttu nimetatakse neid universaalseteks või üldotstarbelisteks (*general-purpose register*).

### Peidetud registrid
*käsuregister (*instruction register*) sisaldab parasjagu täitmisel olevat masinkoodi käsku ennast. Et käsu laadimisele, ettevalmistamisele ja täitmisele kulub reeglina mitu takti, siis moodsad protsessorid kasutavad korraga mitut käsuregistrit – "toru" e konveierit (*pipeline*), mis võimaldab töödelda mitut käsku paralleelselt. Käsuregistri laius määrab ära kasutatava käsusõna (*instruction word*) pikkuse.
*mälupuhver (*MBR – memory buffer register või MDR – memory data register*) vahendab protsessori suhtlust välismäluga. Et protsessor ei peaks mälu järel ootama, kirjutatakse info esmalt mälupuhvrisse, kust mälukontroller selle esimesel võimalusel üles korjab. Niisamuti toimitakse ka mälust lugemisel.
*mäluaadressipuhver (*MAR – memory aadress register*) säilitab seni loetava/kirjutatava aadressi.

## Näited

### AVR 8-bit

Atmeli AVR mikroprotsessorid on odavuse, lihtsuse ja madala voolutarbe tõttu väga laialt levinud, ja muuhulgas kasutusel Arduino platvormil. AVR RISC arhitektuur rakendab 32tk 8-bitist universaalset registrit (R0-R31). Neist viimased kolm registripaari (X, Y ja Z vastavalt R26:R27, R28:R29, R30:R31) on paralleelselt tarvitatavad 16-bitiste aadressiregistritena. R0 ja R1 on mõne käsu jaoks reserveeritud sihtregistriteks. Ujukomaregistreid ei ole.

Lisaks on tarvitusel 
* 8-bitiline olekuregister (SREG);
* 16/8-bitine pinuviit (SP);
* 16/22-bitine programmiloendur (PC);
* suurema mäluga kiipidel 8-bitilised segmendiregistrid (RAMPX-Z), mille XYZ viidale liitmisel saadakse 24-bitine aadressiruum.

### x86-64 arhitektuur
on tänapäeval levinud süle- ja lauaarvutites. Siin on aadressiregistrid ja universaalsed registrid 64-bitised. Kasutatav aadressiruum on praegustes implementatsioonides kuni 2^48 = 256 TB.

Võrreldes AVRiga on x86 CISC arhitektuuris suhteliselt rohkem spetsiifilise ülesandega registreid ja vähem üldotstarbelisi registreid (16 tk – mida omakorda on 2x rohkem kui eelnevas x86 32-bitises arhitektuuris).

Olekuregister (RFLAGS) on samuti 64 bitti lai, ent suurem osa bittidest ei ole tarvitusel. Äramärkimist väärivad suunalipp (*direction flag*), mis määrab stringioperatsioonidel alguspunktist lähtuva suuna; mitu virtuaalmoodi kirjeldavat lippu ja CPUID lipp.

Lisaks on kasutusel on mitu kontrollregistrit (*control register*), mis reguleerivad protsessori töömoodi; mitu veahaldusregistrit (*debug register*) jm spetsiifilisi registreid.

Ujukoma arvutusteks on 8 tk 80-bitist ujukoma-registrit (FPR). Vektoroperatsioonideks on eraldatud 16 tk 128-bitist registrit (XMM), või ka 256-bitist registrit (YMM).

### CUDA arhitektuur
NVIDIA CUDA arhitektuuriga graafikaprotsessoris võib olla tuhandeid täitmisüksusi, mis omavad ainult ühte 32/64-bitilist täisarvuregistrit ja kuni 128 tk kuni 512 biti laiust vektorregistrit (Maxwelli mikroarhitektuuris).

## Viiteid

## Vaata ka
Register (elektroonika)

https://en.wikipedia.org/wiki/Processor_register Aluseks on võetud artikkel ingliskeelses Wikipedias