Flagregisteret eller processorstatusordet (CSP) er et specialiseret register , der afspejler processorens aktuelle tilstand.
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.
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.
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 styrer driftsmiljøet og er ikke beregnet til at blive brugt i applikationsprogrammer.
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 → 80286AC-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) → 80386På 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 80486processorteknologier | Digitale|||||||||
---|---|---|---|---|---|---|---|---|---|
Arkitektur | |||||||||
Instruktionssæt arkitektur | |||||||||
maskinord | |||||||||
Parallelisme |
| ||||||||
Implementeringer | |||||||||
Komponenter | |||||||||
Strømstyring |