VLAJKY registr - FLAGS register
The VLAJKY Registrovat je stavový registr v Intel x86 mikroprocesory který obsahuje aktuální stav procesoru. Tento registr je 16 bitů široký. Jeho nástupci, EFLAGS a RFLAGS registry, jsou 32 bitů a 64 bitů široký, resp. Širší registry si zachovávají kompatibilitu se svými menšími předchůdci.
Pevné bity na bitových pozicích 1, 3 a 5 a příznaky carry, parity, adjust, zero a sign jsou zděděny z ještě dřívější architektury, 8080 a 8085. Příznaku úpravy se v roce 8080 říkalo pomocný nosný bit a v Zilog Z80 architektura.
VLAJKY
Registrace Intel x86 FLAGS[1] | ||||||
---|---|---|---|---|---|---|
Bit # | Maska | Zkratka | Popis | Kategorie | =1 | =0 |
VLAJKY | ||||||
0 | 0x0001 | CF | Nést vlajku | Postavení | CY (nést) | NC (No Carry) |
1 | 0x0002 | Vyhrazeno, vždy 1 palec EFLAGS [2][3] | ||||
2 | 0x0004 | PF | Vlajka parity | Postavení | PE (sudá parita) | PO (parita lichá) |
3 | 0x0008 | Rezervováno[3] | ||||
4 | 0x0010 | AF | Upravit příznak | Postavení | AC (Auxiliary Carry) | NA (bez pomocného nošení) |
5 | 0x0020 | Rezervováno[3] | ||||
6 | 0x0040 | ZF | Nulová vlajka | Postavení | ZR (nula) | NZ (není nula) |
7 | 0x0080 | SF | Podepsat vlajku | Postavení | NG (negativní) | PL (pozitivní) |
8 | 0x0100 | TF | Vlajka pasti (jeden krok) | Řízení | ||
9 | 0x0200 | LI | Příznak povolení přerušení | Řízení | EI (Povolit přerušení) | DI (Zakázat přerušení) |
10 | 0x0400 | DF | Směrová vlajka | Řízení | DN (dolů) | Nahoru nahoru) |
11 | 0x0800 | Z | Vlajka přetečení | Postavení | OV (přetečení) | NV (není přetečení) |
12-13 | 0x3000 | IOPL | Úroveň oprávnění I / O (Pouze 286+), vždy 1[je zapotřebí objasnění ] ve dnech 8086 a 186 | Systém | ||
14 | 0x4000 | NT | Vnořený příznak úkolu (pouze 286+), vždy 1 na 8086 a 186 | Systém | ||
15 | 0x8000 | Rezervováno, vždy 1 na 8086 a 186, na pozdějších modelech vždy 0 | ||||
EFLAGS | ||||||
16 | 0x0001 0000 | RF | Obnovit příznak (Pouze 386+) | Systém | ||
17 | 0x0002 0000 | VM | Virtuální režim 8086 vlajka (pouze 386+) | Systém | ||
18 | 0x0004 0000 | AC | Kontrola vyrovnání (pouze 486SX +) | Systém | ||
19 | 0x0008 0000 | VIF | Příznak virtuálního přerušení (Pentium +) | Systém | ||
20 | 0x0010 0000 | VIP | Virtuální přerušení čeká na vyřízení (Pentium +) | Systém | ||
21 | 0x0020 0000 | ID | Možnost použití instrukce CPUID (Pentium +) | Systém | ||
22‑31 | 0xFFC0 0000 | Rezervováno | Systém | |||
RFLAGS | ||||||
32‑63 | 0xFFFF FFFF… …0000 0000 | Rezervováno |
Poznámka: Sloupec masky v tabulce je AND bitová maska (tak jako hexadecimální value) k dotazu na příznak (y) v hodnotě registru FLAGS.
Používání
Všechny registry VLAJKŮ obsahují stavové kódy, bity příznaků, které umožňují výsledky jednoho strojový jazyk instrukce ovlivní jinou instrukci. Aritmetické a logické instrukce nastavují některé nebo všechny příznaky a instrukce podmíněného skoku provádějí různé akce na základě hodnoty určitých příznaků. Například, jz
(Jump if Zero), jc
(Jump if Carry), a jo
(Skok, pokud přetečení) závisí na konkrétních vlajkách. Další podmíněné skoky testují kombinace několika příznaků.
VLAJKY registry lze přesouvat z nebo do zásobníku. Toto je součást úlohy ukládání a obnovování kontextu procesoru proti rutině, jako je rutina služby přerušení, jejíž změny v registrech by volající kód neměl vidět. Zde jsou příslušné pokyny:
- Pokyny PUSHF a POPF přenášejí 16bitový registr FLAGS.
- PUSHFD / POPFD (představeno s i386 architektura) přenáší 32bitový dvojitý registr EFLAGS.
- PUSHFQ / POPFQ (představeno s x64 architektura) přeneste 64bitový čtyřslovný registr RFLAGS.
V 64bitovém režimu jsou k dispozici PUSHF / POPF a PUSHFQ / POPFQ, ale PUSHFD / POPFD nejsou.[4]:4–349,4–432
Dolních 8 bitů registru FLAGS je také otevřeno pro přímou manipulaci načítání / ukládání pomocí SAHF a LAHF (načítání / ukládání AH do příznaků).
Příklad
Schopnost push and pop FLAGS registrů umožňuje programu manipulovat s informacemi ve FLAGS způsoby, pro které neexistují strojové jazykové instrukce. Například cld
a std
pokyny zrušte a nastavte směrový praporek (DF); ale neexistuje žádný návod k doplnění DF. Toho lze dosáhnout následujícími způsoby montážní kód:
pushf ; Pomocí zásobníku přeneste VLAJKYpop sekera ; ... do registru AXtlačit sekera ; a zkopírujte je zpět do stohu pro uloženíxor sekera, 400h ; Přepnout (doplnit) pouze DF; ostatní bity se nezměnítlačit sekera ; Pomocí zásobníku znovu přesuňte upravenou hodnotupopf ; ... do rejstříku VLAJKŮ; Sem vložte kód, který vyžadoval doplnění příznaku DFpopf ; Obnovte původní hodnotu VLAJKŮ
Manipulací s registrem FLAGS může program určit model nainstalovaného procesoru. Například příznak zarovnání lze změnit pouze na 486 a výše. Pokud se program pokusí upravit tento příznak a zjistí, že úprava nepřetrvávala, je procesor starší než 486.
Počínaje Intel Pentium, CPUID instrukce hlásí model procesoru. Výše uvedená metoda však zůstává užitečná k rozlišení mezi dřívějšími modely.
Viz také
- Bitové pole
- Řídicí registr
- Příznak CPU (x86)
- Stavové slovo programu
- Stavový registr
- x86 assembler
- Výpisy instrukcí x86
Reference
- ^ Příručka vývojáře softwaru Intel 64 a IA-32 Architectures (PDF). 1. Květen 2012. str. 3–21.
- ^ Příručka pro vývojáře softwaru Intel 64 a IA-32 Architectures (PDF). 1. Prosince 2016. str. 78.
- ^ A b C „Silicon reverse engineering: the 8085's undocumented flags“. www.righto.com. Citováno 2018-10-21.
- ^ Příručka pro vývojáře softwaru Intel 64 a IA-32 Architectures (PDF). 2B. Květen 2012.