Flaggregister

Flaggregistret eller  processorstatusordet (CSP) är ett specialiserat register som återspeglar processorns aktuella tillstånd.

x86-arkitektur

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.

Aktiva tillståndsflaggor

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.

Kontrollflagga

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.

Systemflaggor och IOPL-fältet

Systemflaggorna och IOPL-fältet styr operativmiljön och är inte avsedda att användas i applikationsprogram.

Processoridentifiering

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 → 80286

AC-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) → 80386

På 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 80486

Se även

Anteckningar

  1. 3.4.3. EFLAGS Register // IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - T. 1: Grundläggande arkitektur . Beställningsnummer: 253665-013
  2. 1 2 Instruktionen CPUIDlades till i senare versioner av 80486-processorn och Pentium-processorn. Se: CPUID - CPU Identification // The IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - V. 2A: Instruktionsuppsättningsreferens, AM . Beställningsnummer: 253666-013
  3. 8.1.3. Förgrening och villkorliga rörelser på tillståndskoder // IA-32 Intel Architecture Software Developer's Manual. - Intel , 2004. - Vol 1: Grundläggande arkitektur. Beställningsnummer: 253665-013
  4. ↑ I P6- arkitekturen infördes instruktioner etc. som, som ett resultat av jämförelsen, sätter flaggorna i flaggregistret direkt. Tidigare var detta inte möjligt, eftersom samprocessorn implementerades på ett separat chip, och först från 80486DX började samprocessorn byggas in i processorn.FCOMIFCOMIP