لماذا ليس هناك سجل الذي يحتوي على أعلى بايت من EAX?

StackOverflow https://stackoverflow.com/questions/228200

  •  03-07-2019
  •  | 
  •  

سؤال

%AX = (%AH + %AL)

فلماذا لا %EAX = (%SOME_REGISTER + %AX) لبعض التسجيل %SOME_REGISTER?

هل كانت مفيدة؟

المحلول

وفقط لبعض التوضيح. في الأيام المعالجات الدقيقة الأولى من عام 1970، كان وحدات المعالجة المركزية سوى عدد قليل من سجلات ومجموعة تعليمات محدودة للغاية. عادة، وحدة حسابية يمكن أن تعمل فقط على السجل CPU واحد، وغالبا ما يشار إليها باسم "تراكم". كان يسمى تراكم على 8 بت المعالجات 8080 و Z80 "A". هناك 6 أخرى للأغراض العامة 8 بت سجلات: B، C، D، E، H & L. من الممكن أن يصاحب هذه السجلات ستة لتشكل 3 16 سجلات قليلا: BC، DE & HL. داخليا، تم الجمع بين تراكم مع مسجل الأعلام لتشكيل السجل AF 16 بت.

عند ضعت إنتل الأسرة 16 بت 8086 أرادوا أن تكون قادرة على المنفذ 8080 الرمز، بحيث حافظت على نفس هيكل السجل الأساسي:

8080/Z80  8086
A         AX
BC        BX
DE        CX
HL        DX
IX        SI    
IY        DI

ونظرا للحاجة إلى رمز قليلا ميناء 8 أنها تحتاج إلى أن تكون قادرة على الرجوع إلى الفردية أجزاء 8 بت من AX، BX، CX و DX. وتسمى هذه AL، AH للبايت منخفضة وعالية من AX وهلم جرا لBL / BH، CL / CH & DL / DH. IX وIY على Z80 كانت تستخدم فقط من أي وقت مضى كما يسجل المؤشر 16 بت لذلك ليست هناك حاجة للوصول إلى شطري SI و DI.

وعندما تم الإفراج عن 80386 في منتصف 1980s أنشأوا "الموسعة" إصدارات كافة السجلات. لذلك، أصبح AX أصبح EAX، BX EBX الخ لم يكن هناك حاجة للوصول إلى أعلى 16 بت من هذه السجلات طويلة جديدة، حتى أنها لم تقم بإنشاء السجل EAXH الزائفة.

وAMD تطبيق نفس الخدعة عندما أنتجت أول 64 المعالجات قليلا. ويطلق على إصدار 64 بت من تسجيل AX RAX. حتى الآن، لديك شيء يشبه هذا:

|63..32|31..16|15-8|7-0|
               |AH.|AL.|
               |AX.....|
       |EAX............|
|RAX...................|

نصائح أخرى

هناك الكثير من الإجابات المنشورة هنا, ولكن لا شيء حقا الإجابة على السؤال المطروح:لماذا لا يوجد سجل مباشرة بترميز عالية 16 بت من EAX, أو ارتفاع 32 بت من RAX ؟ الجواب يتلخص في حدود x86 تعليمات الترميز نفسها.

16-بت درس التاريخ

عندما إنتل تصميم 8086 كانوا ذو طول متغير نظام ترميز العديد من التعليمات.هذا يعني أن بعض للغاية-مشتركة التعليمات ، مثل POP AX, يمكن أن تكون ممثلة على النحو بايت واحد (58) ، في حين نادرة (ولكن لا يزال يمكن أن تكون مفيدة) تعليمات مثل MOV CX, [BX*4+BP+1023] يمكن أن يكون لا يزال يمثل حتى لو استغرق الأمر عدة بايت لتخزين لهم (في هذا المثال ، 8B 8C FF 03).

وهذا قد يبدو وكأنه حل معقول ، ولكن عندما صمموا عليه ، التي تملأ معظم المساحة المتاحة.لذا, فعلى سبيل المثال, كان هناك ثمانية POP تعليمات ثمانية الفردية يسجل (AX, CX, DX, BX, SP, بي بي, سي, دي), و التي تملأ opcodes 58 من خلال 5F, و شفرة تشغيل 60 كان شيئا آخر تماما (PUSHA) ، كما كان شفرة تشغيل 57 (PUSH DI).ليس هناك مجال للقيام بأي شيء بعد أو قبل تلك.حتى دفع ظهرت سجلات القطاع — الذي هو من الناحية النظرية متطابقة تقريبا إلى دفع ظهرت مسجلات الأغراض العامة — أن يكون المشفرة في موقع مختلف (أسفل في جميع أنحاء 06/0E/16/1E) فقط لأنه لم يكن هناك غرفة بجانب بقية دفع/البوب التعليمات.

وبالمثل ، فإن "وزارة الدفاع r/m" البايت المستخدمة تعليمات معقدة مثل MOV CX, [BX*4+BP+1023] فقط ثلاثة بت لترميز السجل ، مما يعني أنها يمكن أن تمثل فقط ثمانية سجلات الكلية.لا بأس إذا كان لديك فقط ثمانية يسجل, ولكن يعرض مشكلة حقيقية إذا كنت تريد أن يكون أكثر من ذلك.

(هناك خريطة ممتازة من كل هذه بايت المخصصات في الهندسة المعمارية x86 هنا: http://i.imgur.com/xfeWv.png .لاحظ كيف لا يوجد مساحة كافية في الخريطة الرئيسية ، مع بعض التعليمات تداخل بايت, و حتى كم من ثانوية "0F" خريطة يستخدم الآن بفضل MMX و SSE التعليمات.)

نحو 32 و 64 بت

وذلك حتى يسمح تصميم وحدة المعالجة المركزية إلى أن تمتد من 16 بت إلى 32 بت, لديهم بالفعل مشكلة التصميم ، وأنها حلها مع بادئة بايت:من خلال إضافة خاصة "66" بايت أمام كل معيار 16-بت تعليمات وحدة المعالجة المركزية يعلم تريد نفس التعليمات ولكن الإصدار 32 بت (EAX) بدلا من 16 بت (الفأس).بقية التصميم بقيت نفس:لا يزال هناك ثمانية فقط من إجمالي مسجلات الأغراض العامة في مجمل العمارة وحدة المعالجة المركزية.

مماثلة hackery كان ينبغي القيام به لتوسيع المعمارية 64 بت (RAX والأصدقاء);هناك تم حل المشكلة عن طريق إضافة مجموعة أخرى من البادئة رموز (REX, 40-4F) التي تعني "64 بت" (،وأضاف فعال آخر بت اثنين إلى "وزارة الدفاع r/m" الميدان) و أيضا تجاهل غريب من العمر تعليمات لا أحد من أي وقت مضى تستخدم وإعادة بهم بايت رموز أحدث الأشياء.

جانبا على 8 بت يسجل

واحد من أكبر الأسئلة ، إذن ، هو كيف هيك أشياء مثل آه و آل عملت من أي وقت مضى في المقام الأول إذا كان هناك في الواقع سوى غرفة في تصميم ثمانية السجلات.الجزء الأول من الجواب هو أنه لا يوجد شيء مثل "PUSH AL"— بعض التعليمات ببساطة لا يمكن أن تعمل على بايت الحجم يسجل في كل شيء!الوحيدة التي يمكن أن عدد قليل الخاصة الشذوذ (مثل AAD و XLAT) و إصدارات خاصة من "وزارة الدفاع r/m" تعليمات:من خلال وجود مجموعة محددة جدا بت انقلبت في "وزارة الدفاع r/m" بايت, تلك "تمديد تعليمات" يمكن أن يكون انقلبت تعمل على 8 بت سجلات بدلا من 16 بت منها.انها مجرد أن ذلك يحدث هناك بالضبط ثمانية 8 بت يسجل أيضا:AL, CL, DL, BL, آه, CH, DH ، BH (بهذا الترتيب) ، وأن يصطف بشكل جيد جدا مع ثمانية فتحات السجل المتوفرة في "وزارة الدفاع r/m" بايت.

إنتل وأشار في الوقت الذي 8086 التصميم كان من المفترض أن تكون "المصدر متوافق" مع 8080/8085:كان هناك ما يعادل التعليمات في 8086 لكل من 8080/8085 تعليمات ، ولكنها لم تستخدم نفس بايت رموز (أنها ليست حتى قريبة) ، يجب أن ترجمة (تجميع) البرنامج الخاص بك للحصول عليه إلى استخدام جديد بايت رموز.ولكن "المصدر متوافق" كان الطريق إلى الأمام البرامج القديمة ، وأنه سمح 8085 الفردية A, B, C,.... الخوالسرد "ق" و "دي" السجلات لا تزال تعمل على المعالج الجديد ، حتى لو كانوا تسمى الآن "آل" و "ب. ل" و "ب س" و "DX" (أو أيا كان تعيين).

وهذا هو الجواب الحقيقي:ليس هذا إنتل أو AMD عمدا "تركت" عالية 16-بت التسجيل في EAX, أو ارتفاع 32 بت التسجيل RAX:هو أن ارتفاع 8 بت ود غريب بقايا التاريخية الشذوذ و تكرار تصميمها على أعلى قليلا أحجام سيكون من الصعب حقا نظرا شرط أن العمارة تكون متوافقة.

أداء النظر

هناك اعتبار آخر لماذا هذه "سجلات عالية" لم يتم إضافتها منذ،:داخل المعالج الحديث أبنية ، لأسباب تتعلق بالأداء ، وبنسب مختلفة الحجم يسجل في الواقع لا تتداخل الحقيقي:آه و آل ليسوا جزءا من الفأس الفأس ليس جزءا من EAX, EAX و ليس جزءا من RAX:أنهم جميعا سجلات منفصلة تحت غطاء محرك السيارة, و المعالج مجموعات إبطال العلم على الآخرين عند التعامل مع واحد منهم حتى يعلم أنها سوف تحتاج إلى نسخ البيانات عندما تقرأ عن الآخرين.

(على سبيل المثال:إذا قمت بتعيين AL = 5, المعالج لا تحديث الفأس.ولكن إذا كنت ثم قراءة من الفأس المعالج بسرعة نسخ 5 من آل الفأس في أسفل بت.)

عن طريق الحفاظ على سجلات منفصلة ، وحدة المعالجة المركزية يمكن أن تفعل كل أنواع الأشياء الذكية مثل غير مرئية تسجيل تسمية لجعل الكود الخاص بك تشغيل أسرع ، ولكن هذا يعني أن تشغيل التعليمات البرمجية الخاصة بك أبطأ إذا كنت لا تستخدم النمط القديم لعلاج صغيرة يسجل مثل قطع من أكبر يسجل, لأن المعالج سوف تضطر إلى المماطلة وتحديثها.للحفاظ على جميع الداخلية مسك الدفاتر من الخروج من جهة ، وحدة المعالجة المركزية المصممين اختاروا بحكمة لإضافة سجلات منفصلة على أحدث المعالجات بدلا من إضافة المزيد من تداخل السجلات.

(ونعم هذا يعني أنه حقا هو أسرع على المعالجات الحديثة بشكل صريح "MOVZX EAX, value"من يفعل ذلك في القديم, sloppier طريقة "MOV AX, value / use EAX".)

الختام

مع كل ما قال ، أن Intel و AMD إضافة المزيد من "تداخل" تسجل إذا كانوا حقا يريدون حقا ؟ بالتأكيد.هناك طرق worm لهم في ما إذا كان هناك ما يكفي من الطلب.ولكن نظرا التاريخية الهامة الأمتعة, المعمارية الحالية القيود الملحوظة في أداء القيود ، وحقيقة أن معظم التعليمات البرمجية في هذه الأيام يتم إنشاؤها بواسطة المجمعين الأمثل غير متداخلة السجلات ، فإنه من المستبعد جدا أنها سوف تضيف مثل هذه الأمور في أي وقت قريب.

في الأيام 8 بت القديمة، كان هناك بسجل.

في الأيام 16 بت، كان هناك تسجيل AX 16 بت، والتي انقسمت إلى قسمين 8 أجزاء الشيء، AH و آل، لتلك الأوقات عندما كنت لا تزال تريد العمل مع القيم 8 بت.

في الأيام 32 بت، تم إدخال EAX تسجيل 32 بت، ولكن AX، AH، وسجلات AL تم الاحتفاظ بها جميعا. لم المصممين لا يشعر أنه من الضروري تقديم الجديد سجل 16 بت التي تعالج 16 بت إلى 31 من EAX.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top