Rejestr FLAGI - FLAGS register
FLAGI rejestr jest rejestrem stanu , który zawiera bieżący stan procesora . Rozmiar i znaczenie bitów flagi zależą od architektury. Zwykle odzwierciedla wynik operacji arytmetycznych, a także informację o ograniczeniach nałożonych na działanie procesora w bieżącym czasie. Niektóre z tych ograniczeń mogą obejmować zapobieganie wyzwalaniu niektórych przerwań, zakaz wykonywania klasy „uprzywilejowanych” instrukcji. Dodatkowe flagi stanu mogą ominąć mapowanie pamięci i określić, jakie działanie powinien podjąć procesor w przypadku przepełnienia arytmetycznego.
Flagi przeniesienia, parzystości, regulacji, zera i znaku są zawarte w wielu architekturach. Flaga dostosowania była kiedyś nazywana pomocniczym bitem przeniesienia w 8080 i bitem połowy przeniesienia w architekturze Zilog Z80 .
W architekturze i386 rejestr ma szerokość 16 bitów . Jego następcy, rejestry EFLAGS i RFLAGS , mają odpowiednio 32 bity i 64 bity . Szersze rejestry zachowują kompatybilność ze swoimi mniejszymi poprzednikami.
FLAGI
Rejestr FLAGI Intel x86 | ||||||
---|---|---|---|---|---|---|
Fragment # | Maska | Skrót | Opis | Kategoria | =1 | =0 |
FLAGI | ||||||
0 | 0x0001 | CF | Noś flagę | Status | CY (przenoszenie) | NC (bez przenoszenia) |
1 | 0x0002 | Zarezerwowane, zawsze 1 w EFLAGS | ||||
2 | 0x0004 | PF | Flaga parzystości | Status | PE (parzystość) | PO (parzystość nieparzysta) |
3 | 0x0008 | Skryty | ||||
4 | 0x0010 | AF | Dostosuj flagę | Status | AC (przenoszenie pomocnicze) | Nie dotyczy (brak nośnika pomocniczego) |
5 | 0x0020 | Skryty | ||||
6 | 0x0040 | ZF | Zerowa flaga | Status | ZR(zero) | Nowa Zelandia (nie zero) |
7 | 0x0080 | SF | Podpisz flagę | Status | NG (ujemny) | PL(dodatni) |
8 | 0x0100 | TF | Flaga pułapki (pojedynczy krok) | Kontrola | ||
9 | 0x0200 | JEŚLI | Flaga włączenia przerwań | Kontrola | EI (włącz przerwanie) | DI (wyłącz przerwanie) |
10 | 0x0400 | DF | Flaga kierunku | Kontrola | DN (w dół) | Coraz wyżej i wyżej) |
11 | 0x0800 | Z | Flaga przepełnienia | Status | OV(przepełnienie) | NV (bez przepełnienia) |
12-13 | 0x3000 | IOPL |
Poziom uprawnień we/wy (tylko 286+), zawsze 1 na 8086 i 186 |
System | ||
14 | 0x4000 | NT | Zagnieżdżona flaga zadania (tylko 286+), zawsze 1 na 8086 i 186 |
System | ||
15 | 0x8000 | Zarezerwowane, zawsze 1 w 8086 i 186, zawsze 0 w późniejszych modelach |
||||
EFLAGI | ||||||
16 | 0x0001 0000 | RF | Flaga wznowienia (tylko 386+) | System | ||
17 | 0x0002 0000 | maszyna wirtualna | Flaga trybu wirtualnego 8086 (tylko 386+) | System | ||
18 | 0x0004 0000 | AC | Kontrola wyrównania (tylko 486SX+) | System | ||
19 | 0x0008 0000 | VIF | Wirtualna flaga przerwań (Pentium+) | System | ||
20 | 0x0010 0000 | VIP | Oczekujące przerwanie wirtualne (Pentium+) | System | ||
21 | 0x0020 0000 | NS | Możliwość korzystania z instrukcji CPUID (Pentium+) | System | ||
22‑31 | 0xFFC0 0000 | Skryty | System | |||
RFLAGS | ||||||
32-63 | 0xFFFF FFFF… …0000 0000 |
Skryty |
Uwaga: Kolumna maski w tabeli to maska bitowa AND (jako wartość szesnastkowa ) do zapytania o flagi w wartości rejestru FLAGS.
Stosowanie
Wszystkie rejestry FLAGS zawierają kody warunków , bity flag, które pozwalają wynikom jednej instrukcji języka maszynowego wpływać na inną instrukcję. Instrukcje arytmetyczne i logiczne ustawiają niektóre lub wszystkie flagi, a instrukcje skoku warunkowego podejmują działania zmienne w oparciu o wartości określonych flag. Na przykład jz
(Skocz, jeśli zero), jc
(Skocz, jeśli przeniesie) i jo
(Skocz, jeśli przepełnienie) zależą od określonych flag. Inne skoki warunkowe testują kombinacje kilku flag.
Rejestry FLAGS można przenosić ze stosu lub na stos. Jest to część zadania zapisywania i przywracania kontekstu procesora, w stosunku do procedury takiej jak procedura obsługi przerwań, której zmiany w rejestrach nie powinny być widoczne przez kod wywołujący. Oto odpowiednie instrukcje:
- Instrukcje PUSHF i POPF przesyłają 16-bitowy rejestr FLAGS.
- PUSHFD/POPFD (wprowadzony w architekturze i386 ) przesyła 32-bitowy podwójny rejestr EFLAGS.
- PUSHFQ/POPFQ (wprowadzony w architekturze x64 ) przesyła 64-bitowy rejestr czterech słów RFLAGS.
W trybie 64-bitowym, PUSHF/POPF i PUSHFQ/POPFQ są dostępne, ale PUSHFD/POPFD nie.
Dolne 8 bitów rejestru FLAGS jest również otwartych na bezpośrednie manipulowanie ładowaniem/zapisywaniem przez SAHF i LAHF (ładowanie/zapisywanie AH do flag).
Przykład
Możliwość wypychania i usuwania rejestrów FLAGS pozwala programowi manipulować informacjami w FLAGS w sposób, dla którego nie istnieją instrukcje w języku maszynowym. Na przykład instrukcje cld
i std
kasują i ustawiają odpowiednio flagę kierunku (DF); ale nie ma instrukcji uzupełniającej DF. Można to osiągnąć za pomocą następującego kodu asemblera :
pushf ; Use the stack to transfer the FLAGS
pop ax ; ...into the AX register
push ax ; and copy them back onto the stack for storage
xor ax, 400h ; Toggle (complement) DF only; other bits are unchanged
push ax ; Use the stack again to move the modified value
popf ; ...into the FLAGS register
; Insert here the code that required the DF flag to be complemented
popf ; Restore the original value of the FLAGS
Manipulując rejestrem FLAGS, program może określić model zainstalowanego procesora. Na przykład flagę wyrównania można zmienić tylko w 486 i nowszych. Jeśli program próbuje zmodyfikować tę flagę i wykryje, że modyfikacja nie została zachowana, procesor jest starszy niż 486.
Począwszy od Intel Pentium , instrukcja CPUID informuje o modelu procesora. Jednak powyższa metoda pozostaje użyteczna do rozróżnienia między wcześniejszymi modelami.
Zobacz też
- Pole bitowe
- Rejestr kontrolny
- Flaga procesora (x86)
- Słowo statusu programu
- Rejestr statusu
- język asemblera x86
- Wykazy instrukcji x86