اصطلاح استدعاء إكس 86 (x86 calling conventions) تصف هذه المقالة بنية اصطلاح الاستدعاء المستخدم عند البرمجة في بنية المعالجات الدقيقة إكس 86، تصف اصطلاحات الاستدعاء واجهة التعليمات البرمجية المستدعاة:
- الترتيب الذي يتم به تخصيص المعلمات الذرية (العددية) أو الأجزاء الفردية من معلمة معقدة.
- كيفية تمرير المعلمات.
- تسجيل الوظيفة المستدعاة والحفاظ عليها لأجل المستدعي.
- كيفية تقسيم مهمة الإعداد والتنظيف بعد استدعاء دالة ما بين المستدعي والوجهة.
ويرتبط ذلك ارتباطا وثيقا بتعيين الأحجام والأشكال لأنواع لغة البرمجة. موضوع آخر وثيق الصلة هو تغييرات الاسم (Name mangling)، الذي يحدد كيفية وضع أسماء الرموز في خريطة التعليمات البرمجية لأسماء الرموز المستخدمة من قبل الرابط. اسطلاح الاستدعاء وتمثيلات النوع و تغييرات الاسم كلها أجزاء مما يعرف باسم واجهة التطبيق الثنائية (Application binary interface)، وغالباً ما تكون هناك اختلافات طفيفة في كيفية تنفيذ محولات البرمجة لاصطلاحات الاستدعاء هذه.
خلفية تاريخية
قبل الحواسيب الصغيرة، كانت الشركات المصنعة توفر عموما ً نظام تشغيل ومحولا برمجيا لعدة لغات برمجة.وكذلك اصطلاح (اصطلاحات) الاستدعاء لكل منصة والتي تم تعريفها بواسطة أدوات البرمجة الخاصة بالشركة المصنعة.
تنظيف الوسائط من قبل المستدعي
في هذه الاصطلاحات، يقوم المتصل بتنظيف الوسيطات من المكدس.
تصريح سي
تصريح سي (C declaration) هو اصطلاح استدعاء نشأ من لغة البرمجة سي وهو مستخدم من قبل العديد من المحولات البرمجية للغة سي لبنية إكس 86.
مقتطف من الشفرة المصدرية من لغة البرمجة سي:
int callee(int, int, int); int caller(void) { return callee(1, 2, 3) + 5; }
نداء سيس
نداء سيس (syscall) وهو مشابه لتصريح سي ويتم فيه دقع اصطلاحات الاستدعاءات من اليمين إلى اليسار.
أوبت لينك
أوبت لينك (optlink)
تنظيف الوسائط من قبل الوجهة
في هذه الاصطلاحات، تنظف الوجهة الوسائط من المكدس. كما أنه من السهل التعرف على الوظائف التي تستخدم هذه الاصطلاحات في كود لغة التجميع (Assembly language)
باسكال
استناداً إلى اصطلاح استدعاء لغة البرمجة باسكال، يتم دفع المعلمات على المكدس بترتيب من اليسار إلى اليمين (على العكس من تصريح سي)، وفيه ويكون المستدعي مسؤولاً عن إزالتها من المكدس.
نداء إس تي دي
نداء إس تي دي (stdcall) اصطلاح استدعاء إس تي دي هو شكل آخر من اصطلاح استدعاء باسكال حيث يكون المستدعي مسؤولاً عن تنظيف المكدس، ويتم فيه دفع المعلمات إلى المكدس بترتيب من اليمين إلى اليسار، كما هو الحال في اصطلاح استدعاء تصريح سي. يتم تعيين سجلات EAX و ECX و EDX للاستخدام داخل الدالة. يتم تخزين قيم الإرجاع في سجل EAX.
نداء مايكروسوف السريع
نداء مايكروسوف السريع (Microsoft fastcall) يمرر أول وسيطتين (تقييم من اليسار إلى اليمين) والتي تناسب ECX و EDX. يتم دفع الوسائط المتبقية إلى المكدس من اليمين إلى اليسار. عندما يقوم محول مايكروسوف البرمجي بالتحويل البرمجي لـ IA64 أو AMD64، فإنه يتجاهل الكلمة الأساسية __fastcall ويستخدم اصطلاح استدعاء 64 بت بدلاً من ذلك.
نداء فيكتور مايكروسوف
نداء فيكتور مايكروسوف (Microsoft vectorcall) قدمت مايكروسوف اتفاقية النداء فيكتور في برنامجها مايكروسوف فيجوال استوديو استجابة لمخاوف مطوري الألعاب والرسومات والفيديو المتعلقة بالكفاءة. يسمح هذا النداء بتمرير أنواع متجهات أكبر إلى السجل بدلاً من المكدس.
سجل بورلاند
سجل بورلاند (Borland register)
سجل واتكوم
سجل واتكوم (Watcom register) يتم تعيين ما يصل إلى 4 سجلات إلى الوسيطات على الترتيب التالي EAX، EDX، EBX، ECX. يتم تعيين الوسيطات للسجلات من اليسار إلى اليمين. إذا تعذر تعيين أي وسيطة إلى سجل (لنقل أنها كبيرة جداً) يتم تعيينها ويتم تعيين كافة الوسائط اللاحقة إلى المكدس.
توب سبيد كلاريون جي بي آي
توب سبيد كلاريون جي بي آي (TopSpeed / Clarion / JPI) يتم تمرير المعلمات الصحيحة الأربعة الأولى في سجلات eax و ebx و ecx و edx. يتم تمرير معلمات النقطة العائمة على كومة النقاط العائمة - تسجل st0 و st1 و st2 و st3 و st4 و st5 و st6. يتم تمرير معلمات البنية دائمًا على المكدس. يتم تمرير معلمات إضافية على المكدس بعد استنفاد السجلات. يتم إرجاع قيم الأعداد الصحيحة في eax والمؤشرات في أنواع edx والنقاط العائمة في st0.
النداء الآمن
النداء الآمن (safecall)
التنظيف من قبل المستدعي أو الوجهة
هذا النداء (thiscall)
حفظ السجل
جزء آخر من اصطلاح استدعاء حيث يتم ضمان السجلات للاحتفاظ بقيمها بعد استدعاء الروتين.
سجلات (متقلبة) محفوظة للمستدعي
وفقا لـ واجلهة التطبيق الثنائية من إنتل والتي تتوافق مع الغالبية العظمى من المحولات البرمجية، فإن EAX و EDX و ECX يجب أن تكون متاحة للاستخدام داخل أي إجرائية أو وظيفة.
السجلات المحفوظة (غير المتقلبة) التي تم حفظها من قبل الوجهة
يتم استخدام السجلات الأخرى للاحتفاظ بالقيم غير المتقلبة، التي يجب الحفاظ عليها عبر الاستدعاءات. بمعنى آخر، عندما يقوم المصدر بطلب استدعاء إجراء، فمن الممكن أن نتوقع أن هذه السجلات سوف تحمل نفس القيمة الراجعة من الوجهة.