ثبات پرچمها
ثبات پرچمها(FLAG register)، یک ثبات وضعیت در ریزپردازندهها اینتل x86 است که شامل وضعیت فعلی پردازنده است. این ثبات از 16 بیتی است..جانشینان آن ثباتهای EFLAGS و RFLAGS که به ترتیب 32 بیتی و 64 بیتی هستند. ثباتهای گستردهتر قابلیت سازگاری با نسخههای پیشین خودشان را حفظ کردهاند.
بیتهای ثابت که در موقعیت بیتی 1، 3 و 5 و پرچمهای سربار(carry)، برابری(parity)، تنظیم(adjust)، صفر(zero) و علامت(sign) از معماری پیشین 8080 و 8085 به ارث برده است. پرچم تنظیم به عنوان بیت سربار کمکی به در 8080 و بیت نیمه-سربار(half-carry) در معماری Zilog Z80 استفاده میشد.
پرچم ها
Intel x86 FLAGS register | ||||||
---|---|---|---|---|---|---|
Bit # | Mask | Abbreviation | Description | Category | =1 | =0 |
FLAGS | ||||||
0 | 0x0001 | CF | Carry flag | Status | CY(Carry) | NC(No Carry) |
1 | 0x0002 | Reserved, always 1 in EFLAGS | ||||
2 | 0x0004 | PF | Parity flag | Status | PE(Parity Even) | PO(Parity Odd) |
3 | 0x0008 | Reserved | ||||
4 | 0x0010 | AF | Adjust flag | Status | AC(Auxiliary Carry) | NA(No Auxiliary Carry) |
5 | 0x0020 | Reserved | ||||
6 | 0x0040 | ZF | Zero flag | Status | ZR(Zero) | NZ(Not Zero) |
7 | 0x0080 | SF | Sign flag | Status | NG(Negative) | PL(Positive) |
8 | 0x0100 | TF | Trap flag (single step) | Control | ||
9 | 0x0200 | IF | Interrupt enable flag | Control | EI(Enable Interrupt) | DI(Disable Interrupt) |
10 | 0x0400 | DF | Direction flag | Control | DN(Down) | UP(Up) |
11 | 0x0800 | OF | Overflow flag | Status | OV(Overflow) | NV(Not Overflow) |
12-13 | 0x3000 | IOPL | I/O privilege level (286+ only), always 1 on 8086 and 186 | System | ||
14 | 0x4000 | NT | Nested task flag (286+ only), always 1 on 8086 and 186 | System | ||
15 | 0x8000 | Reserved, always 1 on 8086 and 186, always 0 on later models | ||||
EFLAGS | ||||||
16 | 0x0001 0000 | RF | Resume flag (386+ only) | System | ||
17 | 0x0002 0000 | VM | Virtual 8086 mode flag (386+ only) | System | ||
18 | 0x0004 0000 | AC | Alignment check (486SX+ only) | System | ||
19 | 0x0008 0000 | VIF | Virtual interrupt flag (Pentium+) | System | ||
20 | 0x0010 0000 | VIP | Virtual interrupt pending (Pentium+) | System | ||
21 | 0x0020 0000 | ID | Able to use CPUID instruction (Pentium+) | System | ||
22-31 | 0xFFC0 0000 | Reserved | System | |||
RFLAGS | ||||||
32-63 | 0xFFFF FFFF... ...0000 0000 | Reserved |
توجه: ستون mask در جدول، AND bitmask است تا (به عنوان مقدار هگزادسیمال ) پرچم(ها) در مقدار ثبات پرچمها پیدا کند.
کاربرد
تمام ثباتهای پرچمها حاوی کدهای وضعیت هستند، بیت های پرچم که نتایج یک دستورالعمل زبان ماشین را تحت تاثیر دستورالعمل دیگری قرار میدهند. دستورالعملهای ریاضی و منطقی برخی یا همه پرچم ها را تنظیم می کنند و دستورالعمل های پرش شرطی بر اساس مقدار پرچمهای خاصی عملیات را انجام می دهند. به عنوان مثال، jz
(Jump if Zero)، jc
(Jump if Carry) و jo
(Jump if Overflow) به پرچم های خاصی بستگی دارند. سایر پرشهای شرطی ترکیبی از چندین پرچم را آزمایش میکند.
ثباتهای پرچمها را می توانند از پشته یا به پشته انتقال داده شوند. این بخشی از کار صرفه جویی و بازگرداندن جزئیات پردازنده است، در صورتی که یک روال مانند یک روال سرویس وقفه که تغییرات آن در ثباتها نباید توسط کد فراخوانی دیده شود. در اینجا دستورالعمل مربوطه وجود دارد:
- دستورالعمل های PUSHF و POPF، ثبات پرچمها 16بیتی را انتقال میدهند.
- PUSHFD / POPFD (که با معماری i386 معرفی شده است) ثبات 32بیتی EFLAGS را انتقال میدهد.
- PUSHFQ / POPFQ (معرفی شده با معماری x64 ) ثبات 64بیتی RFLAGS را منتقل می کند.
در حالت 64 بیتی، PUSHF / POPF و PUSHFQ / POPFQ موجود هستند، اما در صورتی که PUSHFD / POPFD وجود ندارند.
توانایی وارد یا خارج کردن(push and pop) ثباتهای پرچمها اجازه میدهد که یک برنامه، اطلاعات در پرچمها را به صورتی که عملیاتهای زبان ماشین وجود ندارند، دستکاری کند. به عنوان مثال، دستورالعمل های cld
و std
به ترتیب پرچم مسیر (DF) را صفر و یک می کنند. اما دستورالعملی برای برعکس کردن(complement) DF وجود ندارد. این را می توان با کد اسمبلی زیر بدست آورد:
pushf ; Use the stack to transfer the FLAGS
pop ax ; ...into the AX register
push ax ; and copy them back onto the stack for storage
xor ax, 400h ; Toggle (complement) DF only; other bits are unchanged
push ax ; Use the stack again to move the modified value
popf ; ...into the FLAGS register
; Insert here the code that required the DF flag to be complemented
popf ; Restore the original value of the FLAGS
با دستکاری کردن ثبات پرچمها، یک برنامه می تواند مدل پردازنده نصب شده را تعیین کند. به عنوان مثال، پرچم تنظیم(alignment) تنها می تواند در 486 و بالاتر تغییر کند. اگر برنامه تلاش کند تا این پرچم را تغییر دهد و حس کند که تغییر ادامه نیافته است، پردازنده پیش از 486 است.
دستورالعمل CPUID، با استفاده از اینتل پنتیوم ، مدل پردازنده را گزارش می دهد. با این حال، روش فوق برای تشخیص بین مدل های قبلی مفید است.
همچنین نگاه کنید
- ثبات وضعیت
- بایت پرچم
- پرچم (محاسبات)
- کلمه وضعیت برنامه
- ثبات کنترل
- پرچم CPU (x86)
- x86
- زبان اسمبلی x86
- فهرست دستورات x86
منابع
- ↑ Intel 64 and IA-32 Architectures Software Developer's Manual (PDF). Vol. 1. May 2012. pp. 3–21.
- ↑ Intel 64 and IA-32 Architectures Software Developer’s Manual (PDF). Vol. 1. Dec 2016. p. 78.
- ↑ "Silicon reverse engineering: The 8085's undocumented flags". www.righto.com. Retrieved 2018-10-21.
- ↑ Intel 64 and IA-32 Architectures Software Developer’s Manual (PDF). Vol. 2B. May 2012.