سؤال

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

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

المحلول

حل بسيط:

أحد المقاربات الشائعة هو إضافة التجميع المضمّن ، وترميز بايت التعليمات مباشرة.

فمثلا:

int main()
{
    asm __volatile__ (".byte 0x90\n");
    return 0;
}

التجميع (GCC -O3) إلى:

00000000004005a0 <main>:
  4005a0:       90                      nop
  4005a1:       31 c0                   xor    %eax,%eax
  4005a3:       c3                      retq

لذلك فقط استبدل 0x90 ببايت Inst. بالطبع لن ترى التعليمات الفعلية على OBJDump منتظم ، ومن المحتمل ألا يتم تشغيل البرنامج على نظامك (إلا إذا كنت تستخدم إحدى مجموعات NOP) ، ولكن يجب أن يتعرف المحاكي إذا تم تنفيذه بشكل صحيح هناك.

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


حل معقد

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

إذا قررت تنفيذ ذلك في LLVM ، فإن أفضل رهان لك هو تعريفه كدالة جوهرية ، فهناك المزيد من الوثائق حول هذا هنا - http://llvm.org/docs/extendingllvm.html

نصائح أخرى

يمكنك إضافة تعليمات جديدة ، أو تغيير موجودة عن طريق تعديل مجموعة من الملفات في GCC تسمى "وصف الجهاز". أنماط التعليمات في <target>.md ملف ، بعض التعليمات البرمجية في <target>.c الملف ، المتوقع ، القيود وما إلى ذلك. كل هذه تضع في $GCCHOME/gcc/config/<target>/ مجلد. كل هذه الأشياء باستخدام رمز ASM في خطوة الجيل من RTL. يمكنك أيضًا تغيير حالات تعليمات تنبعث عن طريق تغيير بعض ملفات مصدر GCC العامة الأخرى ، وتغيير جيل شجرة SSA ، وتوليد RTL ، ولكن كل هذا معقد بعض الشيء. شرح بسيط ما حدث:

https://www.cse.iitb.ac.in/grc/slides/cgotut-gcc/topic5-md-intro.pdf

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

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