لماذا لا يمكنني تغيير قيمة الجزء من التسجيل ؟ (MASM)

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

  •  02-07-2019
  •  | 
  •  

سؤال

قررت أن أدرس نفسي لغة التجميع.

لقد أدركت أن البرنامج لن تجميع إن محاولة تغيير قيمة أي جزء من التسجيل.

كل المادة التي وجدت يقول أنه لا يمكن في الواقع تغيير قيمة على الأقل 4 سجلات القطاع ، وذلك ما يعطي ؟

أنا حقا مهتم فقط لماذا في هذه المرحلة ليس لدي أي غرض حقيقي في تغيير هذه العناوين.

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

المحلول

أنت قلت أنك مهتم لما لذلك:

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

من هنا على كل ما أقول يشير إلى الوضع المحمي.

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

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

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

هناك واحد التحذير النهائي:في x86 مجموعة التعليمات, لا يمكنك تحميل فوري القيم في سجلات القطاع.يجب استخدام وسيطة تسجيل أو الذاكرة المعامل أو البوب في سجل قطاع.

MOV DS, 160  ;INVALID - won't assemble

MOV AX, 160  ;VALID - assembles, but will probably result in an
MOV DS, AX   ;exception, and thus the death of your program

أعتقد أنه يجب أن يكون أشار إلى أن يسمح للحصول على أكوام من القطاعات.ولكن AFAIK ، عندما يتعلق الأمر التيار x86 أنظمة التشغيل, شريحة يسجل تخدم سوى عدد قليل من الأغراض:

  • آليات الأمن ، مثل حفظ الفضاء المستخدم العمليات من إيذاء بعضهم البعض أو نظام التشغيل
  • التعامل مع متعددة/المعالجات متعددة النواة
  • موضوع التخزين المحلي:كما الأمثل ، بعض أنظمة التشغيل (بما في ذلك لينكس و ويندوز) استخدام سجلات شريحة الموضوع المحلية التخزين (TLS).منذ المواضيع حصة نفس العنوان الفضاء ، فمن الصعب على موضوع "معرفة" حيث TLS المنطقة دون استخدام نظام الاتصال أو إضاعة سجل...ولكن منذ الجزء السجلات غير مجدية عمليا لا يوجد ضرر في "إضاعة" لهم من أجل سريع TLS.لاحظ أنه عند تحديد هذا الأمر ، OS قد تخطي هذا الجزء سجلات الكتابة مباشرة إلى واصف ذاكرة التخزين المؤقت السجلات التي هي "خفية" سجلات تستخدم ذاكرة التخزين المؤقت GDT/LDT عمليات البحث سببها إشارات إلى سجلات القطاع ، وفي هذه الحالة إذا كنت تحاول قراءة من سجلات القطاع لن ترى ذلك.

وبصرف النظر عن شريحة في موضوع TLS, حقا سوى حفنة من شرائح (مرات عدد المعالجات) تستخدم فقط من قبل نظام التشغيل.تطبيق برامج تماما تجاهل الجزء السجلات.

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

نصائح أخرى

هل الكتابة ويندوز التنفيذية?

في الوضع المحمي (Win32), سجلات شريحة لا تستخدم أي أكثر من ذلك.

المرجعية:

نموذج الذاكرة هو أيضا بشكل كبير مختلفة عن الأيام القديمة 16-بت العالم.تحت Win32 ، لا نحتاج إلى أن يكون المعنية مع نموذج الذاكرة أو الجزء بعد الآن!هناك واحد فقط نموذج الذاكرة:شقة نموذج الذاكرة.لا يوجد المزيد من 64 كيلو شرائح.على الذاكرة الكبيرة الفضاء المستمر من 4 جيجابايت.وهذا يعني أيضا أنك لا تملك للعب مع سجلات القطاع.لك يمكن استخدام أي شريحة التسجيل عنوان أي نقطة في مساحة الذاكرة.هذا هو مساعدة كبيرة المبرمجين.هذا هو ما يجعل Win32 الجمعية البرمجة سهلة كما C.

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