Rejestr FLAGI
Rejestr FLAGS jest rejestrem stanu , który zawiera aktualny stan procesora x86 . Rozmiar i znaczenie bitów flagi zależą od architektury. Zwykle odzwierciedla wynik operacji arytmetycznych, a także informacje o ograniczeniach nałożonych na pracę procesora w danym momencie. Niektóre z tych ograniczeń mogą obejmować zapobieganie wyzwalaniu niektórych przerwań, zakaz wykonywania klasy „uprzywilejowanych” instrukcji. Dodatkowe flagi stanu mogą omijać mapowanie pamięci i określać, jakie działania powinien podjąć procesor w przypadku przepełnienia arytmetycznego.
Flagi przeniesienia, parzystości, przeniesienia pomocniczego (lub przeniesienia połowy ), zera i znaku są zawarte w wielu architekturach.
W architekturze i286 rejestr ma szerokość 16 bitów . Jego następcy, EFLAGS i RFLAGS , mają odpowiednio 32 i 64 bity szerokości. Szersze rejestry zachowują kompatybilność ze swoimi mniejszymi poprzednikami.
FLAGI
Rejestr FLAGS 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ść parzysta) | PO (parzystość nieparzysta) |
3 | 0x0008 | — | Skryty | — | ||
4 | 0x0010 | AF | Pomocnicza flaga przenoszenia | Status | AC (przeniesienie pomocnicze) | NA (bez pomocniczego przenoszenia) |
5 | 0x0020 | — | Skryty | — | ||
6 | 0x0040 | ZF | Flaga zerowa | Status | ZR(zero) | Nowa Zelandia (nie zerowa) |
7 | 0x0080 | SF | Zarejestruj flagę | Status | NG (ujemne) | PL (dodatni) |
8 | 0x0100 | TF | Flaga pułapki (pojedynczy krok) | Kontrola | ||
9 | 0x0200 | JEŚLI | Flaga włączenia przerwania | 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ń I/O (tylko 286+), zawsze all-1 na 8086 i 186 |
System | ||
14 | 0x4000 | NT |
Flaga zadania zagnieżdżonego (tylko 286+), zawsze 1 na 8086 i 186 |
System | ||
15 | 0x8000 | lekarz medycyny |
Flaga trybu ( tylko seria NEC V ), zarezerwowana dla wszystkich procesorów Intel. Zawsze 1 na 8086/186, 0 na 286 i nowszych. |
Kontrola |
(tylko NEC) Tryb natywny ( kompatybilny z 186 ) |
(tylko NEC) Tryb emulacji ( kompatybilny z 8080 ) |
EFLAGI | ||||||
16 | 0x0001 0000 | RF | Flaga wznowienia (tylko 386+) | System | ||
17 | 0x0002 0000 | maszyna wirtualna | trybu wirtualnego 8086 (tylko 386+) | System | ||
18 | 0x0004 0000 | AC |
Kontrola wyrównania (486+, pierścień 3), Kontrola dostępu do SMAP ( Broadwell +, pierścień 0-2) |
System | ||
19 | 0x0008 0000 | VIF | Flaga wirtualnego przerwania (Pentium+) | System | ||
20 | 0x0010 0000 | VIP | Oczekiwanie na wirtualne przerwanie (Pentium+) | System | ||
21 | 0x0020 0000 | ID | Potrafi używać instrukcji CPUID (Pentium+) | System | ||
22-29 | 0x3FC0 0000 | — | Skryty | — | ||
30 | 0x4000 0000 | (nic) |
Flaga załadowanego harmonogramu kluczy AES (tylko procesory z VIA PadLock ) |
System | ||
31 | 0x8000 0000 | — | Skryty | — | ||
RFLAGI | ||||||
32‑63 |
0xFFFF FFFF… …0000 0000 |
— | Skryty | — |
Uwaga: Kolumna maski w tabeli to maska bitowa AND (jako wartość szesnastkowa ) służąca do odpytywania flag (flag) w wartości rejestru FLAGS.
Stosowanie
Wszystkie rejestry FLAGS zawierają kody warunków , bity flag, które pozwalają, aby wyniki jednej instrukcji języka maszynowego wpływały na inną instrukcję. Instrukcje arytmetyczne i logiczne ustawiają niektóre lub wszystkie flagi, a instrukcje skoku warunkowego wykonują zmienne działania w oparciu o wartość niektórych flag. Na przykład jz
(Skok, jeśli zero), jc
(Skok, jeśli przeniesienie) i jo
(Skok, 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 polegającego na zapisaniu i przywróceniu kontekstu procesora w stosunku do procedury takiej jak procedura obsługi przerwania, której zmiany w rejestrach nie powinny być widoczne dla kodu wywołującego. Oto odpowiednie instrukcje:
- Instrukcje PUSHF i POPF przesyłają 16-bitowy rejestr FLAGS.
- PUSHFD/POPFD (wprowadzony wraz z architekturą i386 ) przesyła 32-bitowy podwójny rejestr EFLAGS.
- PUSHFQ/POPFQ (wprowadzone z architekturą x64 ) przesyłają 64-bitowy rejestr czterosłowowy RFLAGS.
W trybie 64-bitowym PUSHF/POPF i PUSHFQ/POPFQ są dostępne, ale PUSHFD/POPFD nie.
Niższe 8 bitów rejestru FLAGS jest również otwarte na bezpośrednie ładowanie/zapisywanie manipulacji przez SAHF i LAHF (ładowanie/zapisywanie AH do flag).
Przykład
Możliwość wypychania i otwierania rejestrów FLAGS pozwala programowi manipulować informacjami we FLAGS w sposób, dla którego instrukcje w języku maszynowym nie istnieją. Na przykład cld
i std
odpowiednio kasują i ustawiają flagę kierunku (DF); ale nie ma instrukcji uzupełnienia DF. Można to osiągnąć za pomocą następującego kodu asemblera :
pushf ; Użyj stosu, aby przenieść topór pop FLAGS ; ...do rejestru AX wciśnij ax ; i skopiuj je z powrotem na stos w celu przechowywania xor ax , 400h ; Przełącz (uzupełnij) tylko DF; inne bity są niezmienione push axe ; Ponownie użyj stosu, aby przenieść zmodyfikowaną wartość popf ; ...do rejestru FLAGI ; Wstaw tutaj kod, który wymagał uzupełnienia flagi DF popf ; Przywróć pierwotną wartość FLAGI
Manipulując rejestrem FLAGS, program może określić model zainstalowanego procesora. Na przykład flagę wyrównania można zmienić tylko na 486 i wyższych. Jeśli program spróbuje zmodyfikować tę flagę i wyczuje, że modyfikacja nie została zachowana, oznacza to, że procesor jest starszy niż 486.
Począwszy od Intel Pentium , instrukcja CPUID podaje model procesora. Jednak powyższa metoda pozostaje przydatna do rozróżnienia między wcześniejszymi modelami.
Zobacz też
- Pole bitowe
- Rejestr kontrolny
- Flaga procesora (x86)
- Słowo stanu programu
- Rejestr stanu
- Język asemblera x86
- Listy instrukcji x86