Flagregister

Flagregisteret eller  processorstatusordet (CSP) er et specialiseret register , der afspejler processorens aktuelle tilstand.

x86 arkitektur

I Intel 8086 mikroprocessorer kaldes det FLAGS og er 16-bit. De udvidede registre EFLAGS og RFLAGS, introduceret i arkitekturerne IA-32 ( 80386 processorer ) og x86-64 , er henholdsvis 32-bit og 64-bit. Udvidede registre er bagudkompatible.

Flagregisteret indeholder en gruppe af statusflag, et kontrolflag og en gruppe af systemflag [1] :

Intel x86 flag register
Lidt, nej. Betegnelse Navn Beskrivelse flag type Når introduceret
FLAG
0 CF Bær flag Bær flag Stat
en en Reserveret
2 PF Paritetsflag Paritetsflag Stat
3 0 Reserveret
fire AF Auxiliary Carry Flag Hjælpe bære flag Stat
5 0 Reserveret
6 ZF Nul flag Nul flag Stat
7 SF Tegn Flag skilt flag Stat
otte TF Trap Flag Spor flag (stepping) Systemisk
9 HVIS Afbrydelse Aktiver flag Afbrydelsesaktiveringsflag Systemisk
ti D.F. Retning Flag Retning flag Manager
elleve AF Overløbsflag overløbsflag Stat
12 IOPL I/O Privilege niveau I/O prioritetsniveau Systemisk 80286
13
fjorten NT Indlejret opgave Opgave rede flag Systemisk 80286
femten 0 Reserveret
EFLAGS
16 RF Genoptag flag Genoptag flag Systemisk 80386
17 VM Virtual-8086 tilstand 8086 virtuel processortilstand Systemisk 80386
atten AC Justeringstjek Kontrol af justering Systemisk 80486SX _
19 VIF Virtual Interrupt Flag Flag til virtuel afbrydelse Systemisk Pentium
tyve VIP Virtuel afbrydelse afventer Afventer virtuel afbrydelse Systemisk Pentium
21 ID ID flag Kontrollerer tilgængeligheden af ​​instruktionerCPUID Systemisk Sen 80486 [2]
22 0 reserveret
31
RFLAG
32 0 reserveret
63

Værdien af ​​nogle flag i flagregistret kan ændres direkte ved hjælp af specielle instruktioner (for eksempel CLDfor at nulstille retningsflaget), men der er ingen instruktioner, der giver dig adgang til (tjekke eller ændre) flagregistret som et almindeligt register . Det er dog muligt at gemme flagregistret i stakken eller (E)AX- registret og gendanne flagregistret fra dem ved hjælp af LAHF, SAHF, PUSHF, PUSHFD, POPFog instruktionerne POPFD.

Når en opgave er suspenderet (ved at bruge processorens multitasking-funktioner), gemmer processoren automatisk værdien af ​​registerflaget i TSS (task state segment), når en ny opgave aktiveres, indlæser processoren flagregisteret fra TSS'en af den nye opgave.

Når en interrupt-behandler eller undtagelsesbehandler er aktiveret , gemmer processoren automatisk værdien af ​​flagregisteret på den aktuelle stak.

Aktive tilstandsflag

Statusflag (bit 0, 2, 4, 6, 7 og 11) afspejler resultatet af udførelse af aritmetiske instruktioner såsom ADD, SUB, MUL, DIV.

Af de anførte flag kan kun CF-flaget ændres direkte med STC, CLCog instruktionerne CMC. Bitinstruktionerne ( BT, BTS, BTRog BTC) kopierer også den angivne bit til CF-flaget.

Statusflag tillader den samme aritmetiske instruktion at producere et resultat af tre forskellige typer: usigneret, signeret og binært kodet decimal (BCD) heltal. Hvis resultatet betragtes som et tal uden fortegn, så viser CF-flaget overløbstilstanden (carry eller borrow), for et signeret resultat (i to- komplement ) viser carry eller borrow OF-flaget, og for BCD-resultatet, carry/ lån viser AF-flaget. SF-flaget afspejler tegnet på et underskrevet resultat, ZF-flaget afspejler både et usigneret og et underskrevet nulresultat.

I aritmetik med lange heltal bruges CF-flaget sammen med instruktionerne add-with-carry ( ADC) og subtract-with-borrow ( SBB) for at udbrede en carry eller lån fra én beregnet bit af et langt tal til en anden.

Betingede springinstruktioner (spring på cc -tilstand  - f.eks. for at hoppe, hvis resultatet ikke er nul), (indstil resultatbyteværdi afhængigt af cc -tilstand ), (loop) og (betinget kopi) bruger et eller flere statusflag til at kontrollere termer. For eksempel kontrollerer springinstruktionen (hop hvis mindre eller lig - hop hvis "mindre end eller lig med", ≤) betingelsen "ZF=1 eller SF ≠ OF". JccJNZSETccLOOPccCMOVccJLE

PF-flaget blev introduceret for kompatibilitet med andre mikroprocessorarkitekturer og bruges sjældent til det tilsigtede formål. Det er mere almindeligt at bruge det sammen med andre statusflag i flydende kommaaritmetik [3] : sammenligningsinstruktionerne ( FCOM, FCOMPosv.) i matematisk coprocessor sætter betingelsesflag C0, C1, C2 og C3 i den, og disse flag kan kopieres til flagregister. For at gøre dette anbefales det at bruge en instruktion FSTSW AXtil at lagre coprocessor -statusordet i AX -registeret og en instruktion SAHFom efterfølgende at kopiere indholdet af AH -registeret ind i de nederste 8 bit af flagregisteret [4] , mens C0 går ind i CF-flaget, C2 til PF og C3 til ZF. C2-flaget indstilles f.eks. i tilfælde af uforlignelige argumenter (NaN eller ikke-understøttet format) i FUCOM-sammenligningsinstruktionen.

Kontrolflag

Retningsflaget (DF, bit 10 i flagregisteret) styrer strenginstruktionerne ( MOVS, CMPS, SCAS, LODSog STOS): indstilling af flaget får adresser til at dekrementere (behandle linjer fra høje adresser til lave), nulstilling får adresser til at stige. Instruktionerne STDog CLDangiver og nulstiller henholdsvis DF-flaget.

Systemflag og IOPL-feltet

Systemflag og IOPL-feltet styrer driftsmiljøet og er ikke beregnet til at blive brugt i applikationsprogrammer.

Processor identifikation

I senere versioner af 80486-processoren dukkede CPUID- instruktionen op , som giver dig mulighed for at identificere den processor, som programmet kører på. I tidligere processorer er det for identifikation nødvendigt at analysere adfærden af ​​instruktioner, herunder flagregisteret.

For eksempel på 8086- og 80186-processorerne er bit 12-15 i flagregisteret altid indstillet, på 80286 og senere processorer indeholder bit 12-14 IOPL-feltet og NT-flaget og ryddes altid i reel tilstand . Dette gør det muligt at skelne mellem 808x/8018x, 80286 og 80386 (og nyere) processorer i 16-bit kode:

MASM assembly sprogkode til at skelne mellem 8086 - 80386 processorer pushf ; (Behold initial flagregistertilstand) pushf ; Kopier flagkasse... pop økse ; ...for at registrere AX xor ah , 11110000 b ; Ændre værdien af ​​de høje 4 bits push axe ; Kopiregister AX popf ; ...til flagregistret pushf ; Kopier flagkasse... pop bx ; ...for at registrere BX popf ; (Nulstil flagregister) xor ah , bh ; AH=0 (bit i flagregister ikke ændret) → 808x-80286, ellers 80386+ og bh , 11110000 b ; BH=F0h (alle 4 bit indstillet) → 808x/8018x, 0 → 80286

AC-flaget (bit 18) introduceret i 80486 er også altid slettet i 80386, hvilket gør det muligt at skelne mellem disse processorer:

MASM assembly sprogkode til at skelne mellem 80386 og 80486 processorer og sp , ikke 3 ; Juster stakken, så der ikke er nogen justeringsfejl, når du får adgang til den pushfd ; (Behold indledende tilstand af flagregister) pushfd ; Copy flag case... pop eax ; ...for at registrere EAX xor eax , 40000 h ; Ændre værdien af ​​bit 18 (AC flag) push eax ; Kopiregister EAX popfd ; ...til flagregistret pushfd ; Kopier registerflag... pop ecx ; ...til ECX registrere popfd ; (Nulstil flagregister) xor eax , ecx ; EAX=0 (bit i flagregister ikke ændret) → 80386

På samme måde, i ældre 80486-modeller, hvor instruktionen CPUIDendnu ikke er indtastet, er ID-flaget (bit 21) altid ryddet, hvilket tillader identifikation af 80386-processorer og ældre 80486-modeller:

MASM assembly sprogkode til at definere gammel 80486 pushfd ; (Behold indledende tilstand af flagregister) pushfd ; Copy flag case... pop eax ; ...til EAX -registrering mov ecx , eax ; ...og ind i registeret ECX eller eax , 200000 h ; Indstil bit 21 (ID flag) push eax ; Kopiregister EAX popfd ; ...til flagregistret pushfd ; Copy flag case... pop eax ; ...til EAX-registret popfd ; (Nulstil flagregister) xor eax , ecx ; EAX=0 (bit i flagregister ikke indstillet) → 80386/gammel 80486

Se også

Noter

  1. 3.4.3. EFLAGS Register // IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - T. 1: Grundlæggende arkitektur . Ordrenummer: 253665-013
  2. 1 2 Instruktionen CPUIDblev tilføjet i senere versioner af 80486-processoren og Pentium-processoren. Se: CPUID - CPU-identifikation // IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - V. 2A: Instruktionssætreference, AM . Ordrenummer: 253666-013
  3. 8.1.3. Forgrening og betingede bevægelser på tilstandskoder // IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - Vol. 1: Grundlæggende arkitektur. Ordrenummer: 253665-013
  4. ↑ I P6- arkitekturen blev der indført instruktioner mv ., som som følge af sammenligningen sætter flagene i flagregisteret direkte. Tidligere var dette ikke muligt, da coprocessoren blev implementeret på en separat chip, og først fra 80486DX begyndte coprocessoren at blive indbygget i processoren.FCOMIFCOMIP