سؤال

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

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

المحلول

NOPs تخدم عدة أغراض:

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

نصائح أخرى

إليك كيفية استخدام NOPS بواسطة تصحيح الأخطاء:

يتم استخدام NOPs بواسطة مجمعين اللغة (C#، VB ، إلخ) لتحديد نقاط التسلسل الضمنية. هذه تخبر برنامج التحويل البرمجي JIT أين يمكن تعيين تعليمات الماكينة إلى تعليمات IL.

إدخال مدونة ريك باير debuggingmodes.ignoresymbolstoresequencepoints, يشرح بعض التفاصيل.

يضع C# أيضًا NOPs بعد تعليمات المكالمات بحيث يكون موقع موقع الإرجاع في المصدر هو المكالمات بدلاً من الخط بعد المكالمة.

يوفر فرصة للعلامات المستندة إلى الخط (مثل نقاط التوقف) في الكود الذي لا ينبعث منه بناء الإصدار.

قد يؤدي أيضًا إلى تشغيل التعليمات البرمجية بشكل أسرع ، عند التحسين لمعالجات أو بنيات محددة:

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

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

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

في أحد المعالجات ، عملت مؤخرًا (لمدة أربع سنوات) تم استخدام NOP للتأكد من انتهاء العملية السابقة قبل بدء العملية التالية. على سبيل المثال:

قيمة التحميل للتسجيل (تأخذ 8 دورات) NOP 8 إضافة 1 للتسجيل

لقد تأكد هذا من أن التسجيل كان له القيمة الصحيحة قبل عملية إضافة.

كان استخدامًا آخر هو ملء وحدات التنفيذ ، مثل متجهات المقاطعة التي كان يجب أن يكون حجمًا معينًا (32 بايت) لأن عنوان Vector0 كان ، على سبيل المثال ، للمتجه 1 0x20 وهكذا بحاجة.

يتمثل أحد الاستخدامات الكلاسيكية بالنسبة لهم في أن يتمكن الأخطاء دائمًا من ربط خط رمز المصدر بتعليمات IL.

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

NOP ضروري في الحمولة النافعة لاستغلال الفائض العازلة.

كما قال DDAA ، تتيح لك NOPs حساب التباين في المكدس ، بحيث عند الكتابة فوق عنوان الإرجاع ، فإنه يقفز إلى مزلقة NOP (الكثير من NOPs على التوالي) ثم يضرب الكود القابل للتنفيذ بشكل صحيح ، بدلاً من القفز إلى البعض بايت في التعليمات التي ليست البداية.

50 سنة متأخرة جدا ولكن مهلا.

تعد NOP مفيدة إذا كنت تكتب رمز التجميع باليد. إذا اضطررت إلى إزالة الكود ، فيمكنك nop nop opcodes القديمة.

Similary ، يمكنك إدراج رمز جديد عن طريق الكتابة فوق بعض الرمز أو القفز في مكان آخر. هناك وضعت الرموز العكسية المكتوبة ، وأدخل رمزك الجديد. عندما تكون جاهزًا للقفز.

في بعض الأحيان كان عليك استخدام الأدوات التي كانت متوفرة. في بعض الحالات ، كان هذا مجرد محرر Machinecode أساسي للغاية.

في الوقت الحاضر مع المترجمين ، لم تعد التقنيات لا معنى لها على الإطلاق.

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

لقد رأيت أيضًا NOPs في الكود الذي يعدل نفسه لتلقي ما يفعله كمكافأة نائبة (حماية النسخ القديمة VEEERY).

الاستخدام غير التقليدي إلى حد ما NOP Slides, ، المستخدمة في استغلال الفائض العازلة.

إنها تسمح للرابط باستبدال تعليمات أطول (عادةً ما تكون طويلة) مع تقنية أقصر (قفزة قصيرة). يأخذ NOP المساحة الإضافية - لا يمكن نقل الكود لأنه سيوقف القفزات الأخرى من العمل. يحدث هذا في وقت الرابط ، لذلك لا يمكن للمترجم معرفة ما إذا كانت القفزة الطويلة أو القصيرة ستكون مناسبة.

على الأقل ، هذا واحد من استخداماتهم التقليدية.

هذه ليست إجابة على سؤالك المحدد ، ولكن في الأيام الخوالي يمكنك استخدام NOP لملء أ فتحة تأخير الفرع, ، إذا لم تتمكن من ملء تعليمات مفيدة على خلاف ذلك.

هل يقوم المترجمون .NET بمحاذاة إخراج MSIL؟ أتصور أنه قد يكون من المفيد تسريع الوصول إلى IL ... أيضًا ، فهمي هو أنه مصمم ليكون محمولًا ومحاذاة الوصول إلى بعض منصات الأجهزة الأخرى.

كانت أول مجموعة تعلمتها هي SPARC ، لذا فأنا على دراية بفتحة تأخير الفرع ، إذا لم تتمكن نوب.

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

لقد استخدمت NOPs لضبط الكمون المتراكم تلقائيًا بعد إدخال ISR. مفيد جدا لتوقيت الأظافر ميت على.

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