ثبات پرچم‌ها

ثبات پرچم‌ها(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 registerBit #MaskAbbreviationDescriptionCategory=1=0FLAGS00x0001CFCarry flagStatusCY(Carry)NC(No Carry)10x0002Reserved, always 1 in EFLAGS  20x0004PFParity flagStatusPE(Parity Even)PO(Parity Odd)30x0008Reserved 40x0010AFAdjust flagStatusAC(Auxiliary Carry)NA(No Auxiliary Carry)50x0020Reserved 60x0040ZFZero flagStatusZR(Zero)NZ(Not Zero)70x0080SFSign flagStatusNG(Negative)PL(Positive)80x0100TFTrap flag (single step)Control90x0200IFInterrupt enable flagControlEI(Enable Interrupt)DI(Disable Interrupt)100x0400DFDirection flagControlDN(Down)UP(Up)110x0800OFOverflow flagStatusOV(Overflow)NV(Not Overflow)12-130x3000IOPLI/O privilege level (286+ only),always 1 on 8086 and 186System140x4000NTNested task flag (286+ only),always 1 on 8086 and 186System150x8000Reserved,always 1 on 8086 and 186,always 0 on later models EFLAGS160x0001 0000RFResume flag (386+ only)System170x0002 0000VMVirtual 8086 mode flag (386+ only)System180x0004 0000ACAlignment check (486SX+ only)System190x0008 0000VIFVirtual interrupt flag (Pentium+)System200x0010 0000VIPVirtual interrupt pending (Pentium+)System210x0020 0000IDAble to use CPUID instruction (Pentium+)System22-310xFFC0 0000ReservedSystemRFLAGS32-630xFFFF FFFF......0000 0000Reserved 
توجه: ستون 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 

 منابع 

رده:ثبت‌های دیجیتال
رده:صفحات با ترجمه بازبینی‌نشده
رده:معماری اکس۸۶