حل بسيط:
أحد المقاربات الشائعة هو إضافة التجميع المضمّن ، وترميز بايت التعليمات مباشرة.
فمثلا:
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