A központi feldolgozóegységekben az állapotregiszter (status register), jelzőregiszter (flag register) vagy feltételkód-regiszter (condition code register) olyan regiszter, amely állapotjelző bitek gyűjteményét tartalmazza. Ilyen regiszterek például a FLAGS regiszter az x86 architektúrában, a program állapotszó (PSW) regiszter az IBM System/360 architektúrában a z/Architecture-ig, valamint az alkalmazásprogram állapotregisztere (APSR) a (32 bites) ARM architektúrában és az NCSV rendszerregiszter a 64 bites ARM AArch64 architektúrában.

Az állapotregiszter a processzor állapotáról tartalmaz információkat. Az egyes biteket implicit vagy explicit módon olvassák vagy írják a processzoron végrehajtódó gépi kódú utasítások. Az állapotregiszter lehetővé teszi, hogy egy utasítás egy korábbi utasítás eredményétől függően műveletet hajtson végre.

Az állapotregiszterben található jelzők némelyike jellemzően módosul az aritmetikai-logikai egység (ALU) által végrehajtott aritmetikai és bitmanipulációs műveletek eredményeként. Például egy Z állapotbit beállítható, ha egy művelet eredménye nulla, vagy törlődik, ha nem nulla. Egy karakterlánc utasítás módosíthatja az állapotjelzőt, hogy jelezze, a művelet egyezés megtalálása vagy a karakterlánc végére érés miatt fejeződött-e be. Néhány jelzőt később feltételes utasítások használnak a program végrehajtásának vezérlésére.

Néhány CPU architektúra, mint például a MIPS és az Alpha, nem használ dedikált jelzőregisztert. Mások nem állítanak be vagy olvasnak implicit módon jelzőket. Az ilyen gépek vagy nem adnak át implicit állapotinformációkat az utasítások között, vagy egy általános célú regiszterben adják át azokat.

Egy állapotregiszter további mezőket tartalmazhat, például jogosultságjelzőket, megszakításengedélyező biteket és egyéb típusú információkat. Megszakítás során az aktuálisan futó szál állapota megőrizhető az állapotregiszter aktuális értékének (a programszámlálóval és más aktív regiszterekkel együtt) a gép veremébe vagy más memóriába történő tárolásával.

Általános jelzőbitek Íme egy lista a modern processzorokban általánosan alkalmazott CPU állapotregiszter-jelzőkről:

FlagNévLeírásZ Zero flag (nulla) Azt jelzi, hogy egy aritmetikai vagy logikai művelet (vagy néha egy betöltés) eredménye nulla volt.C Carry flag (átvitel) Lehetővé teszi egyetlen szónál nagyobb számok összeadását/kivonását azáltal, hogy szükség szerint egy bináris számjegyet visz át egy kisebb jelentőségű szóból egy legkevésbé jelentős bitjére. Számos processzoron hasonló módon biteltolások és -forgatások kiterjesztésére is használják (néha egy dedikált X jelzőn keresztül).S / N Sign flag Negative flag (előjel) Azt jelzi, hogy egy matematikai művelet eredménye negatív. Egyes processzorokban az N és S jelzők eltérő jelentéssel és használattal rendelkeznek: az egyik azt jelzi, hogy az utolsó eredmény negatív volt-e, míg a másik azt, hogy kivonás vagy összeadás történt-e.V / O / W Overflow flag (túlcsordulás) Azt jelzi, hogy egy művelet előjeles eredménye túl nagy ahhoz, hogy elférjen a regiszter szélességében a kettes komplemens ábrázolás használatával.

Egyéb flag-ek Egyes processzorokon az állapotregiszter az alábbi jelzőket tartalmazhatja:

FlagNévLeírásH / A / DC Half-carry flag – félátvitel Auxiliary flag – kisegítő jelzőbit Digit carry – számjegyek közti átvitel Decimal adjust flag – decimális kiigazítás Azt jelzi, hogy az utolsó aritmetikai művelet eredményeként bitátvitel keletkezett a nibble-ek között (jellemzően egy bájtoperandus 4 bites felei között). Egy ilyen jelző általában hasznos packed BCD aritmetikai műveletek bináris hardveren történő megvalósításához.P Parity flag (paritás) Azt jelzi, hogy az utolsó eredmény beállított bitjeinek száma páros vagy páratlan.I Interrupt flag (megszakítás) Egyes processzorokon ez a bit jelzi, hogy a megszakítások engedélyezve vannak-e vagy maszkolva. Ha a processzornak több megszakítási prioritási szintje van, mint például a PDP-11, akkor több bit is használható az aktuális szál prioritásának jelzésére, lehetővé téve, hogy azt csak a magasabb prioritásra beállított hardver szakítsa meg. Más architektúrákon egy bit jelezheti, hogy egy megszakítás jelenleg aktív, és hogy az aktuális szál egy megszakításkezelő része.S Supervisor flag (felügyelő) A két vagy több védelmi gyűrűt biztosító processzorokon az állapotregiszter egy vagy több bitje jelzi az aktuális szál gyűrűjét (mennyire megbízható, vagy hogy az operációs rendszert kell-e használnia azokhoz a kérésekhez, amelyek akadályozhatják a többi szálat). Egy csak két gyűrűvel rendelkező processzoron egyetlen bit is megkülönböztetheti a felügyelői és a felhasználói módot.Q Saturation flag (telítettség) Pl. (32 bites) Arm rendszeren (ARMv5TE, ARMv6 és újabb verziók) a „Q jelző 1-re van állítva, ha telítés történt a telítési aritmetikai utasításokban, vagy ha túlcsordulás történt, bizonyos szorzási utasításokban. A Q flag egy ragadós flag.”

CPU architektúrák aritmetikai jelzők nélkül Az állapotjelzők lehetővé teszik, hogy egy utasítás egy korábbi utasítás eredménye alapján cselekedjen. A pipeline processzorokban, például a szuperskalár és a spekulatív processzorokban ez olyan veszélyeket okozhat, melyek lelassítják a feldolgozást, vagy extra hardvert igényelnek a megkerüléshez.

Néhány nagyon hosszú utasításszó eltekint az állapotjelzőktől. Egyetlen utasítás végrehajt egy tesztet, és jelzi, hogy a teszt melyik eredményére vonatkozóan kell műveletet végrehajtani, például: „Hasonlítsa össze az a-t b-vel” és „Ugrás a c-re, ha egyenlő”. A teszt eredményét nem menti el a program a későbbi utasításokhoz.

Az állapotregiszter egy másik alternatívája, hogy a processzor utasításai az állapotinformációkat egy általános célú regiszterbe helyezik, amikor a program kéri azokat. A MIPS, az AMD 29000, a DEC Alpha és a RISC-V példák olyan architektúrákra, melyek összehasonlító utasításokat biztosítanak, melyek az összehasonlítás eredményét egy általános célú regiszterben tárolják egyetlen bitként vagy 0 vagy 1 numerikus értékként. A feltételes elágazások az általános célú regiszterben lévő érték alapján működnek.

Az összehasonlító utasítások általában egyenlőséget vagy előjeles/előjel nélküli nagyságot tesztelnek. Más feltételek teszteléséhez a program ekvivalenciaképletet használ. Például a MIPS-nek nincs „átviteli bitje” (carry flag), de egy több szavas összeadást végző program tesztelheti, hogy a regiszterek egyszavas összeadása túlcsordul-e, azáltal, hogy teszteli, hogy az összeg kisebb-e, mint egy operandus:

# alow = blow + clow addu alow, blow, clow # set tmp = 1 if alow < clow, else 0 sltu tmp, alow, clow addu ahigh, bhigh, chigh addu ahigh, ahigh, tmp

Az sltu utasítás a tmp értékét 1-re vagy 0-ra állítja a másik két operandusának megadott összehasonlítása alapján. (Itt az általános célú tmp regisztert nem állapotregiszterként használják a feltételes ugrás szabályozására; ehelyett az alacsony helyiértékű összeadásból származó átvitelt jelző lehetséges 1-es értéket adják hozzá a magasabb helyiértékű szóhoz.)

Ez a séma kevésbé kényelmessé válik három vagy több szó hozzáadásakor, mivel a b + c + tmp kiszámításakor két összeadás történik, melyek bármelyike átvitelt generálhat, amelyet két sltu utasítással kell detektálni. Szerencsére ez a két átvitel a túlcsordulás veszélye nélkül összeadható, így a helyzet szavanként öt utasításnál stabilizálódik.

Kapcsolódó szócikkek Regiszter Flag

Jegyzetek

Fordítás

Kategória:Mikroprocesszorok Kategória:CPU-architektúrák Kategória:Regiszterek