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 cldi stdkasują 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ż

Bibliografia