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
- Bitfält
- Kontrollregister
- CPU-flagga (x86)
- Programstatusord
- Statusregister
- x86 assemblerspråk
- x86-instruktionslistor