Regiszter (számítástechnika)

A regiszterek a számítógépek központi feldolgozó egységeinek (CPU-inak), illetve mikroprocesszorainak gyorsan írható-olvasható, ideiglenes tartalmú, és általában egyszerre csak 1 gépi szó (word) (rövid karakterlánc, 1-2 szó általában 2-4 bájt) feldolgozására alkalmas tárolóegységei.

A regiszterek felépülhetnek statikus memóriaelemekből (például billenőáramkörökből (= flipflop áramkörből)) vagy egy RAM (Random Access Memory) memória részeként. Néhány géptípusnál egyetlen chipben mind a két megoldást alkalmazzák. Egy-egy regiszter hozzáférési ideje általában néhányszor 10 ns (10−8 másodperc nagyságrendű).

A legtöbb mai processzor tartalmaz 10-1000 általános regisztert, és ezen kívül jó néhányféle, szigorúan adott funkciót ellátó, speciális célú dedikált regisztert. A főbb dedikált regiszter-típusok:

  • akkumulátorregiszter (a processzor által végzett művelet bemenő adatait tárolja),
  • címregiszterek vagy számláló regiszterek,
  • állapotregiszterek stb.

Központi egység szerkesztés

A sok regiszterrel rendelkező központi egységekben (CPU) a regiszterek halmaza tulajdonképpen valami gyors működésű tárként fogható fel, amely a központi egység és a tényleges operatív tár közötti adatcserét igyekszik gyorsítani.

A gyors működésű regiszterek mintájára a legtöbb gépet továbbfejlesztették, ami más szóval azt jelenti, hogy az operatív tár sem egységes. Általában kis kapacitású, de rövidebb elérési idejű gyorsítótárból és az eredeti operatív tárból épül fel.

A két tároló között legalább egy nagyságrend sebességkülönbség van, ugyanakkor a gyorstárak jóval drágábbak (viszont még mindig olcsóbbak, mint a regiszterek). A gyorsítótárat az egyes gyártó cégek általában saját elnevezésükkel látták el (buffer, cache, scratch pad stb.). A gyorsítótár kezelése erősen eltérő. Van, ahol a felhasználó is hozzáfér legalább egy részéhez, de sok esetben csak az operációs rendszer végzi az adatmozgatást a gyors és a normál operatív tár között.

A processzor közvetlenül csak a gyorsítótárból dolgozik, s ha a hivatkozott adat nincs ott, a felhasználást egy implicit adatátvitel előzi meg az operatív tár és a gyorsítótár között. A rendszer teljesítménye szempontjából meghatározó a gyorsítótár találati valószínűsége. A mérések azt mutatják, hogy a találati valószínűség 5%-os növelése a processzor utasítás-végrehajtási sebességét mintegy 25%-kal is javíthatja.

A gyorsítótárak gyorsító szerepének alapja a lokalitás elve: a számítógépes algoritmusokra jellemző, hogy viszonylag hosszú ideig foglalkoznak az operatív tár egy szűk környezetével.


Visszatérve a regiszterekre: a regiszterek általában nagyobb egységet alkotnak, melyeket regisztertáraknak nevezünk. Fontos, hogy a regisztertárak megfeleljenek a velük szemben állított elvárásoknak. Ilyen követelmény lehet például: a regisztertár általános volta, vagyis, hogy a tár általánosan felhasználható regisztereket tartalmazzon, vagy hogy minél több regisztert tartalmazzon (100-500), hogy támogassa a 3 címes elérési formát, avagy legyen képes egyszerre az első operandus (az első művelethez szükséges adat), a második operandus, ill. az eredmény címét is értelmezni; meghatározni. A regisztertárak tartalmának koordinálására több módszert alkalmaznak, melyek a következők lehetnek:

Ablaktechnika szerkesztés

A regisztertárak csoportokra – ablakokra – vannak osztva, melyek segítségével sokban megkönnyebbül az adatok „átvitele”. Tegyük fel, hogy a regisztertár processzor számára látható tartományát négy ablakra osztjuk, s minden ablakban 8 regiszter található. Az első ablakban található 8 regiszter a globális változók tömbje, vagyis minden program használhatja. Van olyan konstrukció, melyben a 0. regiszterben fixen huzalozott (áramkörileg meghatározott) módon a nulla számkonstans található. A 2. 8 regiszter a kimenő változók tömbje, a 3. a lokális -helyi- változók tömbje, míg a 4. a bejövő, vagyis input változók tömbje. a 2. ill 4. tömb utolsó regisztere(r15,r31) a szubrutin (egy futó programból hívott alprogram) visszatérési értékeit(a kiinduló program szubrutinhívást követő utasításának címe, és adatai) tárolja. Az ablakok fontos jellemzője, hogy a bennük tárolt értékek adatátvitel nélkül az ablak kezdetére mutató pointer megváltoztatásával történik.

Blokktechnika szerkesztés

Az ablaktechnika hátrányait hivatott kijavítani, (merthogy az ablakok nagysága meghatározott, s néha túl nagy vagy túl kicsi) de további problémákat vetett fel. A blokkok méretét ugyanis ellenőrizni kell, ügyelve a túlcsordulásra (overflow – mikor egy adott adatmennyiség a rendelkezésre álló tárolóhelyen nem fér el; túlcsordul) s ez olyan figyelőrendszer létét igényli, melynek kialakítása több plusz igénnyel rendelkezik, mint az ablaktechnikákból adódó kellemetlenségek.

Regisztertípusok (funkció szerint) szerkesztés

Akkumulátorregiszter szerkesztés

Az akkumulátorregiszter az aritmetikai-logikai műveletek operandusait, vagyis a műveletek tárgyát képező mennyiségeket vagy azoknak az eredményeit tárolja. A korszerű számítógépekben az akkumulátor helyett már egy vagy több regisztertömb van, amelyben akár 512 regiszter is elhelyezkedhet. Így csökkenthető a tárhoz fordulások száma, illetve növelhető a végrehajtás sebessége.

Adatszámláló regiszter szerkesztés

Az adatok kiolvasásakor vagy beírásakor azonosított memóriarekesz címét tárolja. Mérete függ a mikroprocesszor által címezhető memóriakapacitástól. Egyszerre több is lehet belőle a CPU-ban.

Utasításregiszter szerkesztés

A végrehajtás alatt álló programutasítást tároló regiszter.

Utasításszámláló regiszter szerkesztés

A soron következő utasítás címét tárolja. Az utasításszámláló tartalmát a program maga is változtathatja. Fontos különbség az utasításszámláló és az adatszámláló regiszter között, hogy az utasításszámláló regiszternél a problémamegoldás az utasításkódok címeinek sorrendjében megy végbe. Vagyis az utasításszámláló által címzett első memóriarekesz elérésekor kihozunk a memóriából egy utasításkódot, így az utasításszámláló tartalma eggyel nő és így a memória következő rekeszét címezi, ahol a program szerint a következő utasításkód található. Az adatszámláló regiszter csak akkor fut végig az adatcímeken, ha az adatok sokszavas egységben vagy táblázatban vannak tárolva.

Ld. még: programszámláló

Bázis(cím)regiszter szerkesztés

Az operandusok címzéséhez felhasznált regiszter, amely nem általános használatú. A báziscím egy alapcím, amelyhez viszonyítva adhatjuk meg az utasításban az operandus helyét.

Indexregiszterek szerkesztés

Szintén nem minden processzorban találhatók és ezek is az operandusok címzését segítik elő, különösen adatsorok feldolgozásánál.

Állapotregiszterek, vezérlő regiszterek szerkesztés

Egy vagy több regiszteren belül tárolnak vezérlő és ellenőrző jeleket. Az állapotregiszter az ALU műveleti eredményeit jellemzi.

Veremmutató regiszter (Stack Pointer) szerkesztés

A veremmutató regiszter a verem legfelső elemét jelöli ki.

A verem egy LIFO (last in, first out) szervezésű struktúra, amely fizikailag a memória valamelyik részén helyezkedik el. Egyes architektúrák hardveresen támogatják a verem megvalósítását, másokban ezt szoftveresen kell megvalósítani, és vannak olyanok, amelyekben a verem nem értelmezett (pl. a TMS9900). Léteznek több vermet használó kialakítások is, például az Ignite, RTX2010 processzorok kétvermes gépek, míg a Burroughs large systems gépek sok vermet használnak. Veremszervezésű eszköz az Intel 8087 koprocesszor: ebben a verem a belső regisztertömbben van kialakítva. A verem helye a memóriában lehet rögzített – ilyen például a MOS 6502-es processzor – vagy változó: ebben az esetben a veremhez tartozik egy olyan regiszter is, amelyik a verem kezdetére mutat (pl. bázismutató).

A veremmutató a verembe való írás és az abból való kiolvasás helyét jelöli ki. Egyes megvalósításokban a veremből való olvasás csak a verem „tetejéről” lehetséges, ebben az esetben a kiolvasás is a veremmutató segítségével történik. Egyes processzorok címzési módjai lehetővé teszik az indexelt címzési módokat, amelyben a memóriacímet a regiszter és egy másik érték határozza meg; ha ezek a címzési módok kiterjednek a veremmutatóra is, vagy a verem címezhető egy indexelt címzést biztosító regiszterrel, akkor a veremmutatóhoz képest címezhető ill. hozzáférhető a verem „belseje” is, nem csak az utolsónak beírt elem. Ilyen pl. az Intel x86 architektúra.

A veremműveletek közben a veremmutató értéke változik: az x86, 6502/6510, Z80 vagy a PDP-11-es architektúrákban beírásnál csökken, kiolvasásnál növekszik, de ettől eltérő rendszer is lehetséges. Az ilyen rendszerben a verembe való írás (push művelet) során a vezérlő logika az operandus (a címzett adat) méretével csökkenti a veremmutató értékét, majd az ebből számított memóriacímre beírja az adatot. A veremből való olvasás (pop) fordított művelet: elsőnek az adat kiolvasása történik meg a veremmutató által címzett memóriaterületről, ezután a vezérlés megnöveli a veremmutató értékét a kiolvasott adat méretével. Egyes processzoroknál a veremmutató értékét automatikusan csökkenti vagy növeli a vezérlés, másoknál ezt külön elő kell írni az utasításokban. A PDP-11-es architektúrában pl. nincs PUSH és POP utasítás, ezeket a műveleteket az általános MOV adatmozgató utasítással végzik, előzetesen csökkentő (pre-dekremens) és utólagosan növelő (poszt-inkremens) címzési móddal együtt. A MIPS processzorok esetén nincs automatikus növelés vagy csökkentés, itt a veremműveletek során külön utasítással kell a veremmutató értékét beállítani, ezután azonban indexelt címzéssel elérhetők a verem elemei. Szélsőséges a TMS 1000 esete: ez a processzor egy 1 elemű „vermet” tartalmaz, amit talán nem is lehet veremnek nevezni – ebben a szubrutinok visszatérési címét egyetlen pufferregiszter tárolja.


További információk szerkesztés