Flaggregistret eller processorstatusordet (CSP) är ett specialiserat register som återspeglar processorns aktuella tillstånd.
I Intel 8086 - mikroprocessorer kallas det FLAGS och är 16-bitars. De utökade registren EFLAGS och RFLAGS, introducerade i arkitekturerna IA-32 ( 80386 processorer ) och x86-64 , är 32-bitars respektive 64-bitars. Utökade register är bakåtkompatibla.
Flaggaregistret innehåller en grupp statusflaggor, en kontrollflagga och en grupp av systemflaggor [1] :
Intel x86 flaggregister | |||||
---|---|---|---|---|---|
Lite, nej. | Beteckning | namn | Beskrivning | flaggtyp | När den introducerades |
FLAGGOR | |||||
0 | CF | Bär flagga | Bär flagga | stat | |
ett | ett | Reserverad | |||
2 | PF | Paritetsflagga | Paritetsflagga | stat | |
3 | 0 | Reserverad | |||
fyra | AF | Auxiliary Carry Flagga | Extra bärflagga | stat | |
5 | 0 | Reserverad | |||
6 | ZF | Noll flagga | Noll flagga | stat | |
7 | SF | Tecken Flagga | tecken flagga | stat | |
åtta | TF | Trap Flagga | Spårningsflagga (stegring) | Systemisk | |
9 | OM | Avbrott Aktivera flagga | Avbrott aktivera flagga | Systemisk | |
tio | D.F. | Riktningsflagga | Riktningsflagga | Chef | |
elva | AV | Overflow Flagga | översvämningsflagga | stat | |
12 | IOPL | I/O-privilegienivå | I/O-prioritetsnivå | Systemisk | 80286 |
13 | |||||
fjorton | NT | Kapslad uppgift | Uppgift häckande flagga | Systemisk | 80286 |
femton | 0 | Reserverad | |||
EFLAGS | |||||
16 | RF | Fortsätt flagga | Fortsätt flagga | Systemisk | 80386 |
17 | VM | Virtual-8086-läge | 8086 virtuellt processorläge | Systemisk | 80386 |
arton | AC | Inriktningskontroll | Inriktningskontroll | Systemisk | 80486SX _ |
19 | VIF | Virtuell avbrottsflagga | Flagga för aktivering av virtuell avbrott | Systemisk | Pentium |
tjugo | VIP | Virtuellt avbrott väntar | Väntar på virtuellt avbrott | Systemisk | Pentium |
21 | ID | ID-flagga | Kontrollerar om det finns instruktionerCPUID | Systemisk | Sen 80486 [2] |
22 | 0 | reserverad | |||
… | |||||
31 | |||||
RFLAGS | |||||
32 | 0 | reserverad | |||
… | |||||
63 |
Värdet på vissa flaggor i flaggregistret kan ändras direkt med hjälp av speciella instruktioner (till exempel CLDför att återställa riktningsflaggan), men det finns inga instruktioner som låter dig komma åt (kontrollera eller ändra) flaggregistret som ett vanligt register . Det är dock möjligt att spara flaggregistret i stacken eller (E)AX- registret och återställa flaggregistret från dem med hjälp av LAHF, SAHF, PUSHF, PUSHFD, POPFoch instruktionerna POPFD.
När en uppgift är avstängd (med hjälp av processorns multitasking-kapacitet), sparar processorn automatiskt värdet på registerflaggan i TSS (task state segment), när en ny uppgift aktiveras laddar processorn flaggregistret från TSS av den nya uppgiften.
När en avbrottshanterare eller undantagshanterare är aktiverad , sparar processorn automatiskt värdet på flaggregistret på den aktuella stacken.
Statusflaggor (bitarna 0, 2, 4, 6, 7 och 11) återspeglar resultatet av exekvering av aritmetiska instruktioner som ADD, SUB, MUL, DIV.
Av de listade flaggorna kan endast CF-flaggan ändras direkt med STC, CLCoch instruktionerna CMC. Bitinstruktionerna ( BT, BTS, BTRoch BTC) kopierar också den angivna biten till CF-flaggan.
Statusflaggor tillåter samma aritmetiska instruktion att producera ett resultat av tre olika typer: osignerat, signerat och binärt kodat decimaltal (BCD). Om resultatet anses vara ett osignerat nummer, visar CF-flaggan överflödesvillkoret (carry eller borrow), för ett signerat resultat (i tvåkomplement ) visar carry eller borrow OF-flaggan, och för BCD-resultatet, carry/ lån visar AF-flaggan. SF-flaggan reflekterar tecknet på ett signerat resultat, ZF-flaggan reflekterar både ett osignerat och ett signerat nollresultat.
I aritmetik med långa heltals används CF-flaggan tillsammans med instruktionerna add-with-carry ( ADC) och subtrahera-med-låna ( SBB) för att sprida en carry eller lån från en beräknad bit av ett långt tal till en annan.
Villkorliga hoppinstruktioner (hoppa på cc- villkor - t.ex. att hoppa om resultatet inte är noll), (ställ in resultatbytevärde beroende på cc- villkor ), (loop) och (villkorlig kopia) använder en eller flera statusflaggor för att kontrollera termer. Till exempel kontrollerar hoppinstruktionen (hopp om mindre eller lika - hoppa om "mindre än eller lika med", ≤) villkoret "ZF=1 eller SF ≠ OF". JccJNZSETccLOOPccCMOVccJLE
PF-flaggan introducerades för kompatibilitet med andra mikroprocessorarkitekturer och används sällan för sitt avsedda syfte. Det är vanligare att använda det tillsammans med andra statusflaggor i flyttalsaritmetik [3] : jämförelseinstruktionerna ( FCOM, FCOMPetc.) i den matematiska samprocessorn sätter villkorsflaggorna C0, C1, C2 och C3 i den, och dessa flaggor kan kopieras till flaggregistret. För att göra detta rekommenderas det att använda en instruktion FSTSW AXför att lagra samprocessorns statusord i AX- registret och en instruktion SAHFatt därefter kopiera innehållet i AH- registret till de nedre 8 bitarna i flaggregistret [4] , medan C0 går in i CF-flaggan, C2 till PF och C3 till ZF. C2-flaggan sätts till exempel vid ojämförbara argument (NaN eller format som inte stöds) i FUCOM-jämförelseinstruktionen.
Riktningsflaggan (DF, bit 10 i flaggregistret) styr stränginstruktionerna ( MOVS, CMPS, SCAS, LODSoch STOS): inställning av flaggan gör att adresserna minskar (bearbeta linjer från höga adresser till låga), nollning gör att adresserna ökar. Instruktionerna STDoch CLDställer in respektive återställer DF-flaggan.
Systemflaggorna och IOPL-fältet styr operativmiljön och är inte avsedda att användas i applikationsprogram.
I senare versioner av 80486-processorn dök CPUID- instruktionen upp , som låter dig identifiera processorn som programmet körs på. I tidigare processorer, för identifiering, är det nödvändigt att analysera beteendet hos instruktioner, inklusive flaggregistret.
Till exempel, på 8086- och 80186-processorerna ställs alltid bitarna 12-15 i flaggregistret in, på 80286 -processorerna och senare innehåller bitarna 12-14 IOPL-fältet och NT-flaggan och rensas alltid i realmode . Detta gör det möjligt att skilja mellan 808x/8018x, 80286 och 80386 (och nyare) processorer i 16-bitars kod:
MASM assembly språkkod för att skilja mellan 8086 - 80386 processorer pushf ; (Behåll initial flaggregisterstatus) pushf ; Kopiera flaggfodral... pop axe ; ...för att registrera AX xor ah , 11110000 b ; Ändra värdet på den höga 4-bitars push- axen ; Kopieringsregister AX popf ; ...till flaggregistret pushf ; Kopiera flaggfodral... pop bx ; ...för att registrera BX popf ; (Återställ flaggregistret) xor ah , bh ; AH=0 (bitar i flaggregistret ej ändrade) → 808x-80286, annars 80386+ och bh , 11110000 b ; BH=F0h (alla 4 bitar satta) → 808x/8018x, 0 → 80286AC-flaggan (bit 18) som introducerades i 80486 rensas alltid i 80386, vilket gör det möjligt att skilja mellan dessa processorer:
MASM assembly språkkod för att skilja mellan 80386 och 80486 processorer och sp , inte 3 ; Rikta in stacken så att det inte finns några inriktningsfel när du kommer åt den pushfd ; (Behåll flaggregistrets initiala tillstånd) pushfd ; Kopiera flaggfodral... pop eax ; ...för att registrera EAX xor eax , 40000 h ; Ändra värdet på bit 18 (AC-flagga) push eax ; Kopiera register EAX popfd ; ...till flaggregistret pushfd ; Kopiera registerflaggor... pop ecx ; ...till ECX registrera popfd ; (Återställ flaggregistret) xor eax , ecx ; EAX=0 (biten i flaggregistret har inte ändrats) → 80386På liknande sätt, i äldre 80486-modeller där instruktionen CPUIDännu inte har matats in, rensas alltid ID-flaggan (bit 21), vilket möjliggör identifiering av 80386-processorer och äldre 80486-modeller:
MASM assembly-språkkod för att definiera gamla 80486 pushfd ; (Behåll flaggregistrets initiala tillstånd) pushfd ; Kopiera flaggfodral... pop eax ; ...för att EAX -registrera mov ecx , eax ; ...och in i register ECX eller eax , 200000 h ; Ställ in bit 21 (ID-flagga) push eax ; Kopiera register EAX popfd ; ...till flaggregistret pushfd ; Kopiera flaggfodral... pop eax ; ...till EAX-registret popfd ; (Återställ flaggregistret) xor eax , ecx ; EAX=0 (bit i flaggregistret ej inställt) → 80386/gammal 80486Processor Technologies | Digital|||||||||
---|---|---|---|---|---|---|---|---|---|
Arkitektur | |||||||||
Instruktionsuppsättning arkitektur | |||||||||
maskinord | |||||||||
Parallellism |
| ||||||||
Genomföranden | |||||||||
Komponenter | |||||||||
Energihantering |