Registr vlajek

Registr příznaků nebo  stavové slovo procesoru (CSP) je specializovaný registr , který odráží aktuální stav procesoru.

architektura x86

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.

Příznaky aktivních států

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.

Kontrolní příznak

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

Systémové příznaky a pole IOPL řídí operační prostředí a nejsou určeny k použití v aplikačních programech.

Identifikace procesoru

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 → 80286

Také 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) → 80386

Podobně 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ý 80486

Viz také

Poznámky

  1. 3.4.3. EFLAGS Register // IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - T. 1: Základní architektura . Číslo objednávky: 253665-013
  2. 1 2 Instrukce CPUIDbyla přidána v pozdějších verzích procesoru 80486 a procesoru Pentium. Viz: CPUID - CPU Identification // The IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - V. 2A: Reference sady instrukcí, AM . Číslo objednávky: 253666-013
  3. 8.1.3. Větvení a podmíněné přesuny na stavové kódy // Příručka vývojáře IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - Vol. 1: Základní architektura. Číslo objednávky: 253665-013
  4. V architektuře P6 byly zavedeny instrukce FCOMIatd FCOMIP., které v důsledku porovnání nastavují příznaky přímo v registru příznaků. Dříve to nebylo možné, protože koprocesor byl implementován na samostatném čipu a teprve od 80486DX se koprocesor začal zabudovávat do procesoru.