سجل الأعلام
سجل FLAGS هو سجل الحالة الذي يحتوي على الحالة الراهنة لوحدة المعالجة المركزية x86 . يعتمد حجم ومعنى بتات العلم على بنية المعالج. ويعكس عادةً نتيجة العمليات الحسابية، بالإضافة إلى معلومات حول القيود المفروضة على عمليات وحدة المعالجة المركزية في الوقت الحالي. قد تتضمن بعض هذه القيود منع بعض المقاطعات من التفعيل، أو حظر تنفيذ فئة من التعليمات "المميزة". قد تتجاوز أعلام الحالة الإضافية عملية تعيين الذاكرة، وتحدد الإجراء الذي يجب على وحدة المعالجة المركزية اتخاذه عند حدوث تجاوز في العمليات الحسابية.
يتم تضمين علامات الحمل والتكافؤ والحمل المساعد (أو الحمل النصفي ) والصفر والإشارة في العديد من البنى (العديد من البنى الحديثة (RISC) لا تحتوي على علامات، مثل الحمل، وحتى إذا كانت تستخدم علامات، فإن الحمل النصفي نادر، لأن عمليات BCD الحسابية لم تعد شائعة، وحتى أنها تتمتع بدعم محدود في الوضع الطويل على x86-64 ).
في معالج إنتل 8086 ، يبلغ عرض المسجل 16 بت . أما المسجلان اللذان خلفاه، وهما EFLAGS و RFLAGS (في معالجات x86-64 الحديثة )، فيبلغ عرضهما 32 بت و 64 بت على التوالي. وتحافظ المسجلات الأوسع على التوافق مع سابقاتها الأصغر.
الأعلام
| سجل علامات Intel x86 [ 1 ] | ||||||
|---|---|---|---|---|---|---|
| قليل # | قناع | اختصار | وصف | فئة | =1 | =0 |
| الأعلام | ||||||
| 0 | 0x0001 | التليف الكيسي | حمل العلم | حالة | CY (حمل) | كارولاينا الشمالية (ممنوع حمل السلاح) |
| 1 | 0x0002 | BRKI | مصيدة الإدخال/الإخراج ( NEC V25 /V35/V55 فقط)، [ 2 ] محجوزة ودائمًا 1 في EFLAGS على جميع معالجات x86 الأخرى [ 3 ] [ 4 ] | يتحكم | (خاص بـ NEC فقط) يُسمح بالإدخال/الإخراج | (خاص بشركة NEC فقط) تم احتجاز الإدخال/الإخراج |
| 2 | 0x0004 | PF | علم التكافؤ | حالة | PE (تكافؤ متساوٍ) | PO (التكافؤ الفردي) |
| 3 | 0x0008 | — | محجوز [ 4 ] | — | ||
| 4 | 0x0010 | AF | علم حمل مساعد [ 5 ] | حالة | AC (حمل إضافي) | غير متاح (ممنوع حمل سلاح إضافي) |
| 5 | 0x0020 | — | محجوز [ 4 ] | — | ||
| 6 | 0x0040 | ZF | علم الصفر | حالة | ZR (صفر) | نيوزيلندا (ليست صفرًا) |
| 7 | 0x0080 | سان فرانسيسكو | علم اللافتة | حالة | NG (سلبي) | PL (إيجابي) |
| 8 | 0x0100 | تي إف | علم الفخ (خطوة واحدة) | يتحكم | ||
| 9 | 0x0200 | لو | علامة تمكين المقاطعة | يتحكم | EI (تمكين المقاطعة) | DI (تعطيل المقاطعة) |
| 10 | 0x0400 | دي إف | علم الاتجاه | يتحكم | DN (أسفل) | أعلى (أعلى) |
| 11 | 0x0800 | ل | علم الفائض | حالة | OV (الفيضان) | NV (ليس في حالة تجاوز) |
| 12-13 | 0x3000 | IOPL | مستوى امتياز الإدخال/الإخراج (286+ فقط)، دائمًا جميع القيم 1 على 8086 و186 | نظام | ||
| 14 | 0x4000 | العهد الجديد | علامة المهمة المتداخلة (286+ فقط)، دائمًا 1 على 8086 و186 | نظام | ||
| 15 | 0x8000 | طبيب | علامة الوضع ( خاصة بسلسلة NEC V فقط)، [ 6 ] محجوزة في جميع معالجات Intel. قيمتها دائمًا 1 في معالجات 8086/186، و0 في معالجات 286 وما بعدها. | يتحكم | (خاص بشركة NEC فقط) الوضع الأصلي ( متوافق مع 186 ) | (خاص بشركة NEC فقط) وضع المحاكاة ( متوافق مع 8080 ) |
| أعلام إلكترونية | ||||||
| 16 | 0x0001 0000 | الترددات اللاسلكية | استئناف العلم (إصدار 386+ فقط) | نظام | ||
| 17 | 0x0002 0000 | آلة افتراضية | علامة وضع 8086 الافتراضي (386+ فقط) | نظام | ||
| 18 | 0x0004 0000 | مكيف هواء | فحص المحاذاة (486+، الحلقة 3)، فحص الوصول إلى SMAP ( Broadwell +، الحلقة 0-2) | نظام | ||
| 19 | 0x0008 0000 | VIF | علامة المقاطعة الافتراضية (بنتيوم+) | نظام | ||
| 20 | 0x0010 0000 | كبار الشخصيات | مقاطعة افتراضية معلقة (بنتيوم+) | نظام | ||
| 21 | 0x0020 0000 | بطاقة تعريف | قادر على استخدام تعليمات CPUID (Pentium+) | نظام | ||
| 22-29 | 0x3FC0 0000 | — | محجوز | — | ||
| 30 | 0x4000 0000 | (لا أحد) | تم تحميل علامة جدولة مفتاح AES [ 7 ] ( وحدات المعالجة المركزية VIA C3 / C7 المزودة بـ VIA PadLock فقط) [ أ ] | نظام | ||
| 31 | 0x8000 0000 | الذكاء الاصطناعي | تم تمكين مجموعة التعليمات البديلة ( معالجات VIA C5XL فقط) [ 9 ] | نظام | ||
| RX32 | "REX32" (بديل لوضع التوافق يسمح بالوصول إلى 16 GPRs) [ 10 ] | |||||
| أعلام RF | ||||||
| 32-63 | 0xFFFF FFFF… …0000 0000 | — | محجوز | — | ||
- ↑ لم تعد معالجات VIA Nano والمعالجات اللاحقة من VIA/Zhaoxin التي تدعم PadLock تستخدم البت 30 من EFLAGS. [ 8 ]
ملاحظة: عمود القناع في الجدول هو قناع البت AND ( كقيمة سداسية عشرية ) للاستعلام عن العلامة (العلامات) داخل قيمة سجل FLAGS.
الاستخدام
تحتوي جميع سجلات FLAGS على رموز الحالة ، وهي بتات تسمح لنتائج تعليمة لغة الآلة بالتأثير على تعليمة أخرى. تقوم التعليمات الحسابية والمنطقية بتعيين بعض أو كل هذه البتات، وتتخذ تعليمات القفز الشرطي إجراءات متغيرة بناءً على قيمة بتات معينة. على سبيل المثال، تعتمد تعليمات jz(القفز إذا كان الناتج صفرًا)، و jc(القفز إذا كان الناتج حملًا)، و jo(القفز إذا كان الناتج تجاوزًا) على بتات محددة. تختبر قفزات شرطية أخرى مجموعات من عدة بتات.
يمكن نقل سجلات FLAGS من وإلى المكدس. هذا جزء من عملية حفظ واستعادة سياق وحدة المعالجة المركزية، وذلك في مقابل روتين مثل روتين خدمة المقاطعة الذي لا ينبغي أن يرى الكود المُستدعي تغييراته في السجلات. إليك التعليمات ذات الصلة:
- تقوم تعليمات PUSHF و POPF بنقل سجل FLAGS ذي 16 بت.
- PUSHFD/POPFD (التي تم تقديمها مع بنية i386 ) تنقل سجل EFLAGS المزدوج ذو 32 بت.
- PUSHFQ/POPFQ (التي تم تقديمها مع بنية x86-64 ) تنقل سجل الكلمات الرباعية 64 بت RFLAGS.
في وضع 64 بت، يتوفر كل من PUSHF/POPF وPUSHFQ/POPFQ، بينما لا يتوفر PUSHFD/POPFD. [ 11 ] : 4-349، 4-432
كما أن البتات الثمانية السفلى من سجل FLAGS مفتوحة أيضًا للتلاعب المباشر بالتحميل/التخزين بواسطة SAHF و LAHF (تحميل/تخزين AH في العلامات).
مثال
تتيح إمكانية إضافة وحذف سجلات FLAGS للبرنامج معالجة المعلومات الموجودة في هذه السجلات بطرق لا توجد لها تعليمات في لغة الآلة. على سبيل المثال، تقوم التعليمات cld` push` و`pop` بمسح وتعيين علامة الاتجاه (DF) على التوالي؛ ولكن لا توجد تعليمات لتكملة DF. يمكن تحقيق ذلك باستخدام كود التجميعstd التالي :
هذا كود 8086، مع سجلات 16 بت تُدفع إلى المكدس، وسجل العلامات هو 16 بت فقط مع هذا المعالج. pushf ؛ استخدم المكدس لنقل FLAGS pop ax ؛ ... إلى سجل AX push ax ؛ وانسخها مرة أخرى إلى المكدس للتخزين xor ax , 400h ؛ قم بتبديل (عكس، "مكمل") DF فقط؛ البتات الأخرى تبقى دون تغيير push ax ؛ استخدم المكدس مرة أخرى لنقل القيمة المعدلة popf ؛ ... إلى سجل FLAGS ؛ أدخل هنا الكود الذي تطلب مكمل علامة DF popf ؛ استعادة القيمة الأصلية لـ FLAGSمن خلال التلاعب بسجل FLAGS، يستطيع البرنامج تحديد طراز المعالج المُثبّت. على سبيل المثال، لا يمكن تغيير علامة المحاذاة إلا على معالجات 486 وما فوقها. إذا حاول البرنامج تعديل هذه العلامة واكتشف أن التعديل لم يُحفظ، فهذا يعني أن المعالج أقدم من معالج 486.
ابتداءً من معالجات إنتل بنتيوم ، تُبلغ تعليمة CPUID عن طراز المعالج. ومع ذلك، تظل الطريقة المذكورة أعلاه مفيدة للتمييز بين الطرازات السابقة.
انظر أيضاً
مراجع
- ↑ دليل مطوري البرامج لبنيتي Intel 64 و IA-32 (ملف PDF) . المجلد 1. مايو 2012. الصفحات 3-21. مؤرشف ( ملف PDF) من الأصل بتاريخ 6 ديسمبر 2013. تاريخ الاطلاع: 11 مارس 2024 .
- ↑ NEC، كتاب بيانات المعالج الدقيق من سلسلة V ذو 16 بت ، 1991، الصفحات 429-433.
- ↑ دليل مطوري البرامج لبنيتي Intel 64 و IA-32 (ملف PDF) . المجلد 1. ديسمبر 2016. صفحة 78. مؤرشف (ملف PDF) من الأصل بتاريخ 25 مايو 2019. تم الاطلاع عليه بتاريخ 7 فبراير 2017 .
- ١ ٢ ٣ "الهندسة العكسية للسيليكون: علامات المعالج 8085 غير الموثقة" . www.righto.com . مؤرشف من الأصل بتاريخ ٢٢ أكتوبر ٢٠١٨. تم الاطلاع عليه بتاريخ ٢١ أكتوبر ٢٠١٨ .
- ↑ دليل مطوري البرامج لبنيتي Intel 64 و IA-32، المجلد 1. ديسمبر 2022. الصفحات 3-16. مؤرشف من الأصل بتاريخ 2023-06-02 . تم الاطلاع عليه بتاريخ 2023-02-02 .
- ↑ دليل مستخدم سلسلة V من NEC ذات 16 بت، مؤرشف بتاريخ 2021-12-02 في Wayback Machine ، رقم الوثيقة U11301E، سبتمبر 2000، صفحة 186
- ↑ VIA، دليل برمجة PadLock ، الإصدار 1.66، 4 أغسطس 2005، الصفحات 7-8. مؤرشف من الأصل في 26 مايو 2010.
- ↑ بريلي وو، ردًا على: (تحديث) KVM: إضافة دعم CPUID لمعالجات VIA ، قائمة عناوين KVM، 21 أبريل 2011 - يصف التغيير في استخدام EFLAGS[30] بين VIA C7 وVIA Nano. مؤرشف في 14 مارس 2026.
- ↑ VIA، VIA C3 Processor Alternate Instruction Set Application Note Archived 2024-01-19 at the Wayback Machine , version 0.24, 2002 - انظر الشكل 2 في الصفحة 12 والفصل 4 في الصفحة 21 للحصول على تفاصيل حول علامة EFLAGS.AI.
- ↑ "سجل rFLAGS" . sandpile.org . تم الاطلاع عليه بتاريخ 26-02-2026 .
- ↑ دليل مطوري البرامج لبنيتي Intel 64 و IA-32 (ملف PDF) . المجلد 2B. مايو 2012. مؤرشف (ملف PDF) من الأصل بتاريخ 17 يوليو 2013. تم الاطلاع عليه بتاريخ 11 مارس 2024 .
- السجلات الرقمية
- معمارية X86
