Registr příznaků nebo stavové slovo procesoru (CSP) je specializovaný registr , který odráží aktuální stav procesoru.
V mikroprocesorech Intel 8086 se nazývá FLAGS a je 16bitový. Rozšířené registry EFLAGS a RFLAGS, představené v architektuře IA-32 ( procesory 80386 ) a x86-64 , jsou 32bitové a 64bitové. Rozšířené registry jsou zpětně kompatibilní.
Registr příznaků obsahuje skupinu stavových příznaků, řídící příznak a skupinu systémových příznaků [1] :
Registr příznaků Intel x86 | |||||
---|---|---|---|---|---|
Bit, Ne. | Označení | název | Popis | typ vlajky | Při představení |
VLAJKY | |||||
0 | CF | Nosit vlajku | Nosit vlajku | Stát | |
jeden | jeden | Rezervováno | |||
2 | PF | Vlajka parity | Vlajka parity | Stát | |
3 | 0 | Rezervováno | |||
čtyři | AF | Pomocná nosná vlajka | Pomocná nosná vlajka | Stát | |
5 | 0 | Rezervováno | |||
6 | ZF | Nulová vlajka | Nulová vlajka | Stát | |
7 | SF | Znamení vlajky | znamení vlajky | Stát | |
osm | TF | Vlajka pasti | Trace flag (krokování) | Systémový | |
9 | LI | Příznak povolení přerušení | Příznak povolení přerušení | Systémový | |
deset | D.F. | Směrová vlajka | Směrová vlajka | Manažer | |
jedenáct | Z | Vlajka přetečení | vlajka přetečení | Stát | |
12 | IOPL | Úroveň I/O oprávnění | Úroveň priority I/O | Systémový | 80286 |
13 | |||||
čtrnáct | NT | Vnořený úkol | Příznak vnoření úkolu | Systémový | 80286 |
patnáct | 0 | Rezervováno | |||
EFLAGS | |||||
16 | RF | Obnovit příznak | Obnovit příznak | Systémový | 80386 |
17 | VM | Režim Virtual-8086 | Režim virtuálního procesoru 8086 | Systémový | 80386 |
osmnáct | AC | Kontrola zarovnání | Kontrola zarovnání | Systémový | 80486SX _ |
19 | VIF | Příznak virtuálního přerušení | Příznak povolení virtuálního přerušení | Systémový | Pentium |
dvacet | VIP | Čeká se na virtuální přerušení | Čeká na virtuální přerušení | Systémový | Pentium |
21 | ID | ID příznak | Kontrola dostupnosti pokynůCPUID | Systémový | Pozdní 80486 [2] |
22 | 0 | Rezervováno | |||
… | |||||
31 | |||||
RFLAGS | |||||
32 | 0 | Rezervováno | |||
… | |||||
63 |
Hodnotu některých příznaků v registru příznaků lze změnit přímo pomocí speciálních instrukcí (například CLDpro reset příznaku směru), ale neexistují žádné instrukce, které by vám umožnily přistupovat (kontrolovat nebo měnit) registr příznaků jako běžný registr. . Je však možné uložit registr příznaků do zásobníku nebo registru (E)AX a obnovit z nich registr příznaků pomocí instrukcí LAHF, SAHF, PUSHF, PUSHFDa . POPFPOPFD
Při pozastavení úlohy (s využitím multitaskingových schopností procesoru) procesor automaticky uloží hodnotu příznaku registru do TSS (segment stavu úlohy), při aktivaci nové úlohy procesor načte příznakový registr z TSS nového úkolu.
Když je aktivována obsluha přerušení nebo obsluha výjimky , procesor automaticky uloží hodnotu registru příznaků do aktuálního zásobníku.
Stavové příznaky (bity 0, 2, 4, 6, 7 a 11) odrážejí výsledek provádění aritmetických instrukcí, jako jsou ADD, SUB, MUL, DIV.
Z uvedených příznaků lze přímo pomocí instrukcí a STCzměnit pouze příznak CF. Také bitové instrukce ( , a ) zkopírují zadaný bit do příznaku CF. CLCCMCBTBTSBTRBTC
Stavové příznaky umožňují stejné aritmetické instrukci vytvořit výsledek tří různých typů: bez znaménka, se znaménkem a binárně kódované dekadické (BCD) celé číslo. Pokud je výsledek považován za číslo bez znaménka, pak příznak CF ukazuje podmínku přetečení (přenést nebo vypůjčit), u výsledku se znaménkem (ve dvojkovém doplňku ) ukazuje přenos nebo výpůjčku příznak OF a pro výsledek BCD přenos/ půjčit ukazuje vlajku AF. Příznak SF odráží znaménko podepsaného výsledku, příznak ZF odráží jak nepodepsaný, tak podepsaný nulový výsledek.
V aritmetice dlouhých celých čísel se příznak CF používá ve spojení s instrukcemi add-with-carry ( ADC) a subtract-with-borrow ( SBB) k šíření přenosu nebo výpůjčky z jednoho vypočítaného bitu dlouhého čísla do druhého.
Instrukce podmíněného skoku (skok na podmínku cc - např. skok, pokud je výsledek nenulový), (nastavení výsledné hodnoty bajtu v závislosti na podmínce cc ), (smyčka) a (podmíněná kopie) používají jeden nebo více stavových příznaků ke kontrole podmínek. Například instrukce skoku (skok, pokud je menší nebo rovno - skok, pokud je „menší nebo rovno“, ≤) kontroluje podmínku „ZF=1 nebo SF ≠ OF“. JccJNZSETccLOOPccCMOVccJLE
Příznak PF byl zaveden kvůli kompatibilitě s jinými architekturami mikroprocesorů a pro svůj zamýšlený účel se používá jen zřídka. Častěji se používá ve spojení s jinými stavovými příznaky v aritmetice s plovoucí desetinnou čárkou [3] : porovnávací instrukce ( FCOMatd FCOMP.) v matematickém koprocesoru v něm nastavují příznaky podmínek C0, C1, C2 a C3 a tyto příznaky lze zkopírovat do registru příznaků. K tomu se doporučuje použít instrukci FSTSW AXpro uložení stavového slova koprocesoru do registru AX a instrukci SAHFk následnému zkopírování obsahu registru AH do spodních 8 bitů registru příznaků [4] , zatímco C0 přejde do příznak CF, C2 do PF a C3 do ZF. Příznak C2 se nastavuje např. v případě nesrovnatelných argumentů (NaN nebo nepodporovaný formát) v porovnávací instrukci FUCOM.
Příznak směru (DF, bit 10 v registru příznaků) řídí instrukce řetězce ( , , a MOVS) CMPS: SCASnastavení příznaku způsobí dekrementaci adres (procesní řádky z vysokých adres na nízké), nulování způsobí nárůst adres. Instrukce a nastavují a resetují příznak DF. LODSSTOSSTDCLD
Systémové příznaky a pole IOPL řídí operační prostředí a nejsou určeny k použití v aplikačních programech.
V pozdějších verzích procesoru 80486 se objevila instrukce CPUID , která umožňuje identifikovat procesor, na kterém program běží. U dřívějších procesorů je pro identifikaci nutné analyzovat chování instrukcí, včetně registru příznaků.
Například na procesorech 8086 a 80186 jsou bity 12-15 registru příznaků vždy nastaveny, na procesorech 80286 a novějších obsahují bity 12-14 pole IOPL a příznak NT a v reálném režimu jsou vždy vymazány . To umožňuje rozlišovat mezi procesory 808x/8018x, 80286 a 80386 (a novějšími) v 16bitovém kódu:
MASM kód assembleru pro rozlišení mezi procesory 8086 - 80386 pushf ; (Zachovat počáteční stav registru příznaků) pushf ; Copy flag case... pop sekera ; ...pro registraci AX xor ah , 11110000 b ; Změňte hodnotu vysoké 4 bitové push axe ; Kopírovat registr AX popf ; ...do registru příznaků pushf ; Copy flag case... pop bx ; ...pro registraci BX popf ; (Resetovat registr příznaků) xor ah , bh ; AH=0 (bity v registru příznaků se nezměnily) → 808x-80286, jinak 80386+ a bh , 11110000 b ; BH=F0h (nastaveny všechny 4 bity) → 808x/8018x, 0 → 80286Také příznak AC (bit 18) zavedený v 80486 je vždy vymazán v 80386, což umožňuje rozlišovat mezi těmito procesory:
MASM kód assembleru pro rozlišení mezi procesory 80386 a 80486 a sp , nikoli 3 ; Zarovnejte zásobník tak, aby při přístupu k němu nedocházelo k chybám zarovnání pushfd ; (Zachovat počáteční stav registru příznaků) pushfd ; Copy flag case... pop eax ; ...pro registraci EAX xor eax , 40000 h ; Změňte hodnotu bitu 18 (příznak AC) push eax ; Kopírovat registr EAX popfd ; ...do registru příznaků pushfd ; Kopírovat příznaky registru... pop ecx ; ...do ECX registru popfd ; (Resetovat registr příznaků) xor eax , ecx ; EAX=0 (bit v registru příznaků se nezměnil) → 80386Podobně u starších modelů 80486, kde instrukce CPUIDještě nebyla zadána, je příznak ID (bit 21) vždy vymazán, což umožňuje identifikaci procesorů 80386 a starších modelů 80486:
MASM kód assembleru pro definici starého 80486 pushfd ; (Zachovat počáteční stav registru příznaků) pushfd ; Copy flag case... pop eax ; ...do EAX registru mov ecx , eax ; ...a do registru ECX nebo eax , 200000 h ; Nastavit bit 21 (příznak ID) push eax ; Kopírovat registr EAX popfd ; ...do registru příznaků pushfd ; Copy flag case... pop eax ; ...do registru EAX popfd ; (Resetovat registr příznaků) xor eax , ecx ; EAX=0 (bit v registru příznaků není nastaven) → 80386/starý 80486procesorů | Technologie digitálních|||||||||
---|---|---|---|---|---|---|---|---|---|
Architektura | |||||||||
Architektura instrukční sady | |||||||||
strojové slovo | |||||||||
Rovnoběžnost |
| ||||||||
Implementace | |||||||||
Komponenty | |||||||||
Řízení spotřeby |