FLAGGAR register

FLAGS - registret är statusregistret som innehåller det aktuella tillståndet för en x86- processor . Storleken och betydelsen av flaggbitarna är arkitekturberoende. Det återspeglar vanligtvis resultatet av aritmetiska operationer såväl som information om restriktioner för CPU-operationen vid den aktuella tidpunkten. Några av dessa restriktioner kan inkludera att förhindra att vissa avbrott utlöses, förbud mot exekvering av en klass av "privilegierade" instruktioner. Ytterligare statusflaggor kan kringgå minnesmappning och definiera vilken åtgärd CPU:n ska vidta vid aritmetiskt spill.

Bär-, paritets-, hjälpbärar- (eller halvbärande ), noll- och teckenflaggor ingår i många arkitekturer.

I i286 -arkitekturen är registret 16 bitar brett. Dess efterföljare, EFLAGS- och RFLAGS -registren, är 32 bitar respektive 64 bitar breda. De bredare registren behåller kompatibilitet med sina mindre föregångare.

FLAGGOR

Intel x86 FLAGS register
bit # Mask Förkortning Beskrivning Kategori =1 =0
FLAGGOR
0 0x0001 CF Bär flagga Status CY(Carry) NC (Ingen transport)
1 0x0002 Reserverad, alltid 1 i EFLAGS
2 0x0004 PF Paritetsflagga Status PE (Jämnt paritet) PO(Paritet udda)
3 0x0008 Reserverad
4 0x0010 AF Auxiliary Carry flagga Status AC(Auxiliary Carry) NA (ingen hjälpbärare)
5 0x0020 Reserverad
6 0x0040 ZF Noll flagga Status ZR(Noll) NZ (inte noll)
7 0x0080 SF Sign flagga Status NG(negativ) PL(positiv)
8 0x0100 TF Trap-flagga (enkelsteg) Kontrollera
9 0x0200 OM Avbrott aktivera flagga Kontrollera EI (Aktivera avbrott) DI (Inaktivera avbrott)
10 0x0400 DF Riktningsflagga Kontrollera DN(Ner) Upp upp)
11 0x0800 AV Overflow flagga Status OV (överflöd) NV (Inte överflöd)
12-13 0x3000 IOPL
I/O-behörighetsnivå (endast 286+), alltid alla-1 på 8086 och 186
Systemet
14 0x4000 NT
Kapslad uppgiftsflagga (endast 286+), alltid 1 på 8086 och 186
Systemet
15 0x8000 MD

Lägesflagga ( endast NEC V-serien ), reserverad på alla Intel-processorer. Alltid 1 på 8086/186, 0 ​​på 286 och senare.
Kontrollera

(endast NEC) Native Mode ( 186- kompatibla)


(endast NEC) Emuleringsläge ( 8080- kompatibelt)
EFLAGS
16 0x0001 0000 RF Återuppta flagga (endast 386+) Systemet
17 0x0002 0000 VM Virtuell 8086-lägesflagga (endast 386+) Systemet
18 0x0004 0000 AC
Inriktningskontroll (486+, ring 3), SMAP- åtkomstkontroll ( Broadwell +, ring 0-2)
Systemet
19 0x0008 0000 VIF Virtuell avbrottsflagga (Pentium+) Systemet
20 0x0010 0000 VIP Virtuellt avbrott väntar (Pentium+) Systemet
21 0x0020 0000 ID Kan använda CPUID- instruktioner (Pentium+) Systemet
22-29 0x3FC0 0000 Reserverad
30 0x4000 0000 (ingen)
AES-nyckelschema laddad flagga ( endast CPU:er med VIA PadLock )
Systemet
31 0x8000 0000 Reserverad
RFLAGS
32-63
0xFFFF FFFF… …0000 0000
Reserverad

Obs! Maskkolumnen i tabellen är OCH- bitmasken (som hexadecimalt värde) för att fråga flaggan/flaggan inom FLAGS-registervärdet.

Användande

Alla FLAGS-register innehåller villkorskoderna , flaggbitar som låter resultatet av en maskinspråksinstruktion påverka en annan instruktion. Aritmetiska och logiska instruktioner ställer in några eller alla flaggorna, och villkorliga hoppinstruktioner vidtar varierande åtgärder baserat på värdet på vissa flaggor. Till exempel, jz (hopp om noll), jc (hopp om bär) och jo (hopp om översvämning) beror på specifika flaggor. Andra villkorliga hopp testar kombinationer av flera flaggor.

FLAGS-register kan flyttas från eller till stacken. Detta är en del av jobbet att spara och återställa CPU-kontext, mot en rutin som en avbrottstjänstrutin vars ändringar i register inte ska ses av den anropande koden. Här är de relevanta instruktionerna:

  • PUSHF- och POPF-instruktionerna överför 16-bitars FLAGS-registret.
  • PUSHFD/POPFD (introducerad med i386 -arkitekturen) överför 32-bitars dubbelregistret EFLAGS.
  • PUSHFQ/POPFQ (introducerad med x64- arkitekturen) överför 64-bitars fyrordsregistret RFLAGS.

I 64-bitarsläge är PUSHF/POPF och PUSHFQ/POPFQ tillgängliga men PUSHFD/POPFD är det inte.

De nedre 8 bitarna i FLAGS-registret är också öppna för direkt belastning/lagringsmanipulation av SAHF och LAHF (ladda/lagra AH i flaggor).

Exempel

Möjligheten att trycka och poppa FLAGS-register låter ett program manipulera information i FLAGS på sätt för vilka maskinspråksinstruktioner inte existerar. Till exempel, cld- och std -instruktionerna rensar och ställer in riktningsflaggan (DF), respektive; men det finns ingen instruktion för att komplettera DF. Detta kan uppnås med följande monteringskod :

          
          
         
     
         
           

           pushf  ; Använd stapeln för att överföra FLAGS   pop  yxan  ; ...in i AX-registret   push  ax  ; och kopiera dem tillbaka till stapeln för lagring   xor  yxa  ,  400h  ; Växla (komplement) endast DF;  andra bitar är oförändrade   push  axe  ; Använd stacken igen för att flytta det modifierade värdet   popf  ; ...in i FLAGS-registret   ; Infoga här koden som krävde att DF-flaggan skulle kompletteras   popf  ; Återställ det ursprungliga värdet för FLAGSNA  

Genom att manipulera FLAGS-registret kan ett program bestämma modellen för den installerade processorn. Till exempel kan inriktningsflaggan endast ändras på 486: an och uppåt. Om programmet försöker modifiera denna flagga och känner av att modifieringen inte bestod, är processorn tidigare än 486.

Från och med Intel Pentium rapporterar CPUID - instruktionen processormodellen. Ovanstående metod är dock fortfarande användbar för att skilja mellan tidigare modeller.

Se även