ثبات پرچم‌ها

از ویکی‌پدیا، دانشنامهٔ آزاد

ثبات پرچم‌ها(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 وجود ندارند. [۴] : 4–349, 4–432 

توانایی وارد یا خارج کردن(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، با استفاده از اینتل پنتیوم ، مدل پردازنده را گزارش می دهد. با این حال، روش فوق برای تشخیص بین مدل های قبلی مفید است.

همچنین نگاه کنید[ویرایش]

منابع[ویرایش]

  1. Intel 64 and IA-32 Architectures Software Developer's Manual (PDF). Vol. 1. May 2012. pp. 3–21.
  2. Intel 64 and IA-32 Architectures Software Developer’s Manual (PDF). Vol. 1. Dec 2016. p. 78.
  3. ۳٫۰ ۳٫۱ ۳٫۲ "Silicon reverse engineering: The 8085's undocumented flags". www.righto.com. Retrieved 2018-10-21.
  4. Intel 64 and IA-32 Architectures Software Developer’s Manual (PDF). Vol. 2B. May 2012.