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ż