ثبات پرچم‌ها

ثبات **پرچم‌ها**(FLAG register)، یک ثبات وضعیت در ریزپردازنده‌ها اینتل x86 است که شامل وضعیت فعلی پردازنده است. این ثبات از 16&nbsp;بیتی است..جانشینان آن ثبات‌های **EFLAGS** و **RFLAGS** که به ترتیب 32&nbsp;بیتی و 64 بیتی هستند. ثبات‌های گسترده‌تر قابلیت سازگاری با نسخه‌های پیشین خودشان را حفظ کرده‌اند.

بیت‌های ثابت که در موقعیت بیتی 1، 3 و 5 و پرچم‌های سربار(carry)، برابری(parity)، تنظیم(adjust)، صفر(zero) و علامت(sign) از معماری پیشین 8080 و 8085 به ارث برده است. پرچم تنظیم به عنوان بیت سربار کمکی به در 8080 و بیت نیمه-سربار(half-carry) در معماری Zilog Z80 استفاده میشد. 

## پرچم ها

توجه: ستون 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 وجود ندارد. این را می توان با کد اسمبلی زیر بدست آورد: 
```nasm
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 

## منابع

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