اتفاقية الاتصال

في علوم الحاسوب ، تُعرف اتفاقية الاستدعاء بأنها مخطط تنفيذي (منخفض المستوى) يحدد كيفية استقبال الإجراءات الفرعية أو الدوال للمعاملات من البرنامج المُستدعي وكيفية إرجاعها للنتائج. [ 1 ] عند استدعاء دالة ما، تُتخذ خيارات تصميمية بشأن مكان وكيفية تمرير المعاملات إليها، ومكان وكيفية إرجاع النتائج منها، حيث تتم هذه العمليات عادةً عبر سجلات معينة أو ضمن إطار مكدس الاستدعاءات . كما توجد خيارات تصميمية لكيفية توزيع مهام التحضير لاستدعاء الدالة واستعادة بيئة التشغيل بعد اكتمالها بين البرنامج المُستدعي والبرنامج المُستدعى. تُحدد اتفاقية الاستدعاء الطريقة المُثلى لاستدعاء كل دالة. يجب استخدام اتفاقية الاستدعاء الصحيحة لكل استدعاء دالة، لضمان التنفيذ الصحيح والموثوق للبرنامج بأكمله باستخدام هذه الدوال.

مقدمة

تُعتبر اصطلاحات الاستدعاء عادةً جزءًا من واجهة التطبيق الثنائية (ABI). ويمكن اعتبارها بمثابة عقد بين المُستدعي والدالة المُستدعاة. [ 1 ]

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

لا تتضمن اصطلاحات الاستدعاء عادةً معلومات حول إدارة دورة حياة الهياكل والكائنات المُخصصة ديناميكيًا. وقد توضح وثائق تكميلية أخرى الجهة المسؤولة عن تحرير الذاكرة المُخصصة.

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

بالنسبة لبعض اللغات، يتضمن اصطلاح الاستدعاء تفاصيل معالجة الأخطاء أو الاستثناءات (مثل Go و Java )، وبالنسبة للغات أخرى، لا يتضمن ذلك (مثل C++ ).

بالنسبة لاستدعاءات الإجراءات عن بعد ، يوجد مفهوم مماثل يسمى التنسيق .

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

اصطلاحات اتصال مختلفة

قد تختلف اصطلاحات الاتصال في:

  • أين يتم وضع المعلمات؟ تشمل الخيارات السجلات ، أو على مكدس الاستدعاءات ، أو مزيج من الاثنين، أو في هياكل ذاكرة أخرى.
  • ترتيب تمرير المعاملات. تشمل الخيارات الترتيب من اليسار إلى اليمين، أو من اليمين إلى اليسار، أو ترتيب أكثر تعقيدًا.
  • كيفية التعامل مع الدوال التي تأخذ عددًا متغيرًا من الوسائط ( الدوال ذات عدد متغير من الوسائط ). تشمل الخيارات تمريرها بالترتيب (بافتراض أن المعامل الأول في موضع واضح) أو تمرير الأجزاء المتغيرة في مصفوفة.
  • كيفية إرجاع القيم من الدالة المستدعاة إلى الدالة المستدعِية. تشمل الخيارات: على المكدس، أو في سجل، أو كمرجع إلى شيء مُخصَّص في الذاكرة الديناميكية.
  • كيف يتم التعامل مع القيم الطويلة أو المعقدة، ربما عن طريق تقسيمها عبر سجلات متعددة، داخل إطار المكدس، أو بالرجوع إلى الذاكرة.
  • ما هي السجلات التي يُضمن أن تحتفظ بنفس قيمتها عند عودة الدالة المستدعاة كما كانت عليه عند استدعائها؟ يُقال إن هذه السجلات محفوظة أو مُعتمَدة ، لذا فهي غير متطايرة .
  • كيف يتم تقسيم مهمة تهيئة وتنظيف ما بعد استدعاء الدالة بين الدالة المستدعِية والدالة المستدعاة؟ وبالتحديد، كيف يتم استعادة إطار المكدس لكي تتمكن الدالة المستدعِية من المتابعة بعد انتهاء الدالة المستدعاة؟
  • ما إذا كانت البيانات الوصفية التي تصف الوسائط يتم تمريرها وكيفية ذلك
  • يُخزَّن في هذا المكان القيمة السابقة لمؤشر الإطار ، والتي تُستخدم لاستعادة إطار المكدس عند انتهاء الروتين الفرعي. تشمل الخيارات التخزين داخل مكدس الاستدعاءات، أو في سجل مُحدد. في بعض الأحيان، لا تُستخدم مؤشرات الإطار على الإطلاق. [ 2 ]
  • أين يتم وضع أي روابط نطاق ثابتة للوصول إلى البيانات غير المحلية للروتين (عادةً في موضع واحد أو أكثر في إطار المكدس، ولكن في بعض الأحيان في سجل عام، أو بالنسبة لبعض البنى، في سجلات ذات أغراض خاصة)
  • بالنسبة للغات البرمجة الكائنية، كيفية الإشارة إلى كائن الدالة

اتفاقيات الاتصال ضمن منصة واحدة

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

تعتمد العديد من البنى المعمارية على اصطلاح استدعاء واحد شائع الاستخدام، غالبًا ما يقترحه المصمم. بالنسبة لمعالجات RISC ، بما في ذلك SPARC وMIPS و RISC-V ، تُستخدم أسماء السجلات بناءً على هذا الاصطلاح. على سبيل المثال، تحمل سجلات MIPS $4من إلى $7أسماء ABI $a0من إلى $a3، مما يعكس استخدامها لتمرير المعاملات في اصطلاح الاستدعاء القياسي. (تحتوي معالجات RISC على العديد من السجلات العامة المكافئة، لذا لا يوجد عادةً سبب مادي لتسميتها بأسماء أخرى غير الأرقام).

قد تختلف اصطلاحات استدعاء الدوال في لغة برنامج معين عن اصطلاحات الاستدعاء في النظام الأساسي أو نظام التشغيل أو المكتبة المرتبطة به. على سبيل المثال، في نظام ويندوز 32 بت ، تستخدم استدعاءات النظام اصطلاح stdcall ، بينما تستخدم العديد من برامج C التي تعمل عليه اصطلاح cdecl . ولمراعاة هذه الاختلافات في اصطلاحات الاستدعاء، تسمح المترجمات عادةً باستخدام كلمات مفتاحية تُحدد اصطلاح الاستدعاء لدالة معينة. تتضمن تعريفات الدوال كلمات مفتاحية إضافية خاصة بالنظام الأساسي تُشير إلى اصطلاح الاستدعاء المُستخدم. عند التعامل مع هذه الاختلافات بشكل صحيح، يُولّد المترجم شيفرة لاستدعاء الدوال بالطريقة المناسبة.

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

الهندسة المعمارية

x86 (32 بت)

تُستخدم نسخة 32 بت من معمارية x86 مع العديد من اصطلاحات الاستدعاء المختلفة. ونظرًا لقلة عدد سجلات المعمارية، والتركيز التاريخي على البساطة وصغر حجم الكود، فإن العديد من اصطلاحات استدعاء x86 تمرر الوسائط على المكدس. وتُعاد القيمة المُعادة (أو مؤشر إليها) في سجل. تستخدم بعض الاصطلاحات سجلات للمعاملات القليلة الأولى، مما قد يُحسّن الأداء، خاصةً بالنسبة للروتينات الطرفية القصيرة والبسيطة التي يتم استدعاؤها بشكل متكرر (أي الروتينات التي لا تستدعي روتينات أخرى).

مثال على المكالمة:

push EAX ; مرر نتيجة سجل ما push dword [ EBP + 20 ] ; مرر متغير ذاكرة ما (صيغة FASM/TASM) push 3 ; مرر ثابتًا call calc ; النتيجة المُعادة موجودة الآن في EAX

بنية الاستدعاء النموذجية: (يمكن تحسين بعض أو كل التعليمات أدناه (باستثناء ret) في إجراءات بسيطة). تترك بعض الاصطلاحات مساحة المعاملات محجوزة، باستخدام plain retبدلاً من ret imm16. في هذه الحالة، يمكن للمستدعي add esp,12في هذا المثال، أو التعامل مع التغيير إلى ESP بطريقة أخرى.

calc: push EBP ; حفظ مؤشر الإطار القديم mov EBP , ESP ; الحصول على مؤشر الإطار الجديد sub ESP , localsize ; حجز مساحة في المكدس للمتغيرات المحلية . . ; إجراء العمليات الحسابية، وترك النتيجة في EAX . mov ESP , EBP ; تحرير مساحة للمتغيرات المحلية pop EBP ; استعادة مؤشر الإطار القديم ret paramsize ; تحرير مساحة المعلمات والعودة.

x86-64

يستخدم الإصدار 64 بت من معمارية x86، المعروف باسم x86-64 وAMD64 وIntel 64، تسلسلين شائعين للاستدعاء. يُستخدم أحد التسلسلين، الذي حددته مايكروسوفت، في نظام ويندوز؛ أما التسلسل الآخر، المحدد في واجهة التطبيق الثنائية (ABI) لنظام AMD64 System V، فيُستخدم في الأنظمة الشبيهة بنظام يونكس ، ومع بعض التعديلات، في نظام OpenVMS . ولأن x86-64 يحتوي على سجلات للأغراض العامة أكثر من x86 ذي 32 بت، فإن كلا النظامين يمرران بعض الوسائط عبر السجلات.

ARM (A32)

يُخصص اصطلاح استدعاء ARM القياسي ذو 32 بت السجلات العامة الستة عشر على النحو التالي:

  • r15: عداد البرنامج (وفقًا لمواصفات مجموعة التعليمات).
  • r14: سجل الربط . تقوم تعليمة BL، المستخدمة في استدعاء روتين فرعي، بتخزين عنوان العودة في هذا السجل.
  • r13: مؤشر المكدس . تستخدم تعليمات الدفع/السحب في وضع التشغيل "Thumb" هذا السجل فقط.
  • r12: سجل مؤقت لاستدعاء الإجراء الداخلي.
  • r4 إلى r11: المتغيرات المحلية.
  • r0 إلى r3: قيم الوسائط التي تم تمريرها إلى روتين فرعي والنتائج التي تم إرجاعها من روتين فرعي.

إذا كان نوع القيمة المُعادة كبيرًا جدًا بحيث لا يمكن وضعه في r0 إلى r3، أو لا يمكن تحديد حجمه بشكل ثابت في وقت الترجمة، فيجب على المُستدعي تخصيص مساحة لتلك القيمة في وقت التشغيل، وتمرير مؤشر إلى تلك المساحة في r0.

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

يشترط اصطلاح استدعاء الدوال في معمارية ARM استخدام مكدس كامل تنازلي. إضافةً إلى ذلك، يجب أن يكون مؤشر المكدس محاذيًا دائمًا لأربعة بايتات، ويجب أن يكون محاذيًا دائمًا لثمانية بايتات عند استدعاء دالة ذات واجهة عامة. [ 3 ]

يؤدي هذا الأسلوب في استدعاء الدوال إلى قيام روتين فرعي "نموذجي" في معالجات ARM بما يلي:

  • في المقدمة، ادفع r4 إلى r11 إلى المكدس، وادفع عنوان الإرجاع في r14 إلى المكدس (يمكن القيام بذلك بتعليمات STM واحدة)؛
  • انسخ أي وسيطات تم تمريرها (في r0 إلى r3) إلى سجلات الخدش المحلية (r4 إلى r11)؛
  • قم بتخصيص المتغيرات المحلية الأخرى لسجلات الخدش المحلية المتبقية (من r4 إلى r11)؛
  • قم بإجراء العمليات الحسابية واستدعاء الإجراءات الفرعية الأخرى حسب الضرورة باستخدام BL، بافتراض أن r0 إلى r3 و r12 و r14 لن يتم الاحتفاظ بها؛
  • ضع النتيجة في r0؛
  • في الخاتمة، اسحب r4 إلى r11 من المكدس، واسحب عنوان العودة إلى عداد البرنامج r15. يمكن القيام بذلك باستخدام تعليمة LDM واحدة.

ARM (A64)

يقوم اصطلاح استدعاء ARM ذو 64 بت ( AArch64 ) بتخصيص السجلات العامة الـ 31 على النحو التالي: [ 4 ]

  • x31 (SP): مؤشر المكدس أو سجل صفري ، حسب السياق.
  • x30 (LR): سجل ربط الإجراء، يستخدم للعودة من الإجراءات الفرعية.
  • x29 (FP): مؤشر الإطار .
  • x19 إلى x28: تم حفظ المكالمة.
  • x18 (PR): سجل النظام الأساسي. يُستخدم لغرض خاص بنظام التشغيل، أو كسجل إضافي محفوظ من قبل المُستدعي.
  • x16 (IP0) و x17 (IP1): سجلات مؤقتة لاستدعاءات الإجراءات الداخلية.
  • من x9 إلى x15: متغيرات محلية، تم حفظ المتصل.
  • x8 (XR): عنوان قيمة الإرجاع غير المباشر.
  • x0 إلى x7: قيم الوسائط التي تم تمريرها إلى روتين فرعي والنتائج التي تم إرجاعها منه.

جميع السجلات التي تبدأ بالحرف x لها سجل مطابق مكون من 32 بت مسبوق بالحرف w . وبالتالي، يُطلق على السجل x0 المكون من 32 بت اسم w0.

وبالمثل، يتم تخصيص سجلات الفاصلة العائمة الـ 32 على النحو التالي: [ 5 ]

  • من الإصدار v0 إلى الإصدار v7: قيم الوسائط التي تم تمريرها إلى روتين فرعي والنتائج التي تم إرجاعها منه.
  • من الإصدار 8 إلى الإصدار 15: تم حفظها بواسطة callee، ولكن يجب الاحتفاظ فقط بالـ 64 بت السفلية.
  • من الإصدار 16 إلى الإصدار 31: المتغيرات المحلية، تم حفظ المتصل.

مجموعة تعليمات RISC-V

تعتمد معمارية RISC-V على اصطلاح استدعاء محدد بنوعين، أحدهما يدعم معالجة الفاصلة العائمة والآخر لا يدعمها. [ 6 ] وهي تمرر الوسائط في المسجلات كلما أمكن ذلك.

باور، باور بي سي، وباور آي إس إيه

تتميز معمارية POWER و PowerPC و Power ISA بوجود عدد كبير من المسجلات، مما يسمح لمعظم الدوال بتمرير جميع الوسائط في المسجلات عند استدعاء الدوال على مستوى واحد . أما الوسائط الإضافية فتُمرر عبر المكدس، كما يُخصص دائمًا مساحة للوسائط المُمررة عبر المسجلات على المكدس لتسهيل عمل الدالة المُستدعاة في حال استخدام استدعاءات متعددة المستويات (سواءً كانت تكرارية أو غير ذلك) حيث يجب حفظ المسجلات. يُفيد هذا أيضًا في الدوال ذات الوسائط المتغيرة ، مثل printf()الدوال التي تتطلب الوصول إلى وسائطها كمصفوفة. ويُستخدم اصطلاح استدعاء موحد لجميع لغات البرمجة الإجرائية.

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

نظام MIPS

يُعدّ O32 [ 7 ] واجهة التطبيق الثنائية (ABI) الأكثر استخدامًا، نظرًا لكونه واجهة System V ABI الأصلية لمعالجات MIPS. [ 8 ] وهي تعتمد كليًا على المكدس، مع $a0-$a3توفر أربعة سجلات فقط لتمرير الوسائط. وقد شجع هذا البطء الملحوظ، إلى جانب نموذج الفاصلة العائمة القديم الذي يحتوي على 16 سجلًا فقط، على انتشار العديد من اصطلاحات الاستدعاء الأخرى. ظهرت واجهة التطبيق الثنائية هذه في عام 1990 ولم يتم تحديثها منذ عام 1994. وهي مُعرّفة فقط لمعالجات MIPS ذات 32 بت، لكن مُجمّع GCC أنشأ نسخة 64 بت تُسمى O64. [ 9 ]

بالنسبة للأنظمة ذات 64 بت، يُستخدم عادةً واجهة برمجة التطبيقات N64 ABI (لا علاقة لها بجهاز نينتندو 64 ) من شركة سيليكون غرافيكس. ويتمثل التحسين الأهم في توفير ثمانية سجلات لتمرير الوسائط، بالإضافة إلى زيادة عدد سجلات الفاصلة العائمة إلى 32. يوجد أيضًا إصدار ILP32 يُسمى N32، يستخدم مؤشرات 32 بت لبرمجة أصغر حجمًا، على غرار واجهة برمجة التطبيقات x32 ABI . يعمل كلا الإصدارين في وضع 64 بت لوحدة المعالجة المركزية. [ 9 ]

بُذلت بعض المحاولات لاستبدال O32 بواجهة برمجة تطبيقات ثنائية (ABI) ذات 32 بت تُشبه N32 إلى حدٍ كبير. وقد انبثقت عن مؤتمر عام 1995 واجهة MIPS EABI، التي كان إصدارها ذو 32 بت مشابهًا لها إلى حدٍ كبير. [ 10 ] ألهمت EABI شركة MIPS Technologies لاقتراح واجهة برمجة تطبيقات ثنائية (ABI) أكثر جذرية تُسمى "NUBI"، والتي تُعيد استخدام سجلات الوسائط لقيمة الإرجاع. [ 11 ] يدعم GCC واجهة MIPS EABI، لكنه لا يدعمها LLVM ؛ كما لا يدعم أيٌّ منهما واجهة NUBI.

في جميع معالجات O32 و N32/N64، يُخزَّن عنوان العودة في $raسجل. ويتم ضبط هذا العنوان تلقائيًا باستخدام تعليمات JAL(القفز والربط) أو JALR(القفز وربط السجل). وينمو المكدس نزولًا.

سبارك

تعتمد بنية SPARC ، على عكس معظم بنى RISC ، على نوافذ السجلات . تحتوي كل نافذة سجل على 24 سجلاً يمكن الوصول إليها: 8 سجلات إدخال (%i0-%i7)، و8 سجلات محلية (%l0-%l7)، و8 سجلات إخراج (%o0-%o7). تُستخدم سجلات الإدخال لتمرير الوسائط إلى الدالة المُستدعاة، ويجب دفع أي وسائط إضافية إلى المكدس . مع ذلك، تُخصص الدالة المُستدعاة مساحةً دائمًا للتعامل مع أي تجاوز محتمل في نافذة السجل، والمتغيرات المحلية، وإرجاع بنية بيانات (في SPARC 32 بت) بالقيمة. لاستدعاء دالة، تُوضع وسائطها في سجلات الإخراج؛ وعند استدعاء الدالة، تُصبح سجلات الإخراج هي سجلات الإدخال، وتصل الدالة المُستدعاة إلى الوسائط في سجلات الإدخال الخاصة بها. عندما تكتمل الدالة المستدعاة، فإنها تضع قيمة الإرجاع في سجل "in" الأول، والذي يصبح سجل "out" الأول عندما تعود الدالة المستدعاة.

يقوم نظام System  V ABI ، [ 12 ] الذي تتبعه معظم الأنظمة الحديثة الشبيهة بنظام Unix ، بتمرير الوسائط الستة الأولى في سجلات "in" من %i0 إلى %i5، مع حجز %i6 لمؤشر الإطار و%i7 لعنوان الإرجاع.

نظام IBM System/360 وما خلفه

يُعد نظام IBM System/360 بنيةً أخرى لا تعتمد على حزمة مكونات مادية. توضح الأمثلة أدناه اصطلاح الاستدعاء الأصلي الذي استخدمه نظام التشغيل OS/360 والإصدارات اللاحقة قبل إدخال بنية أنظمة المؤسسات (ESA) وXPLINK وبنية z/Architecture ذات 64 بت ؛ قد تستخدم أنظمة التشغيل الأخرى لنظام System/360 والإصدارات اللاحقة اصطلاحات استدعاء مختلفة.

برنامج الاتصال:

 LA 1,ARGS تحميل عنوان قائمة الوسائط L 15,=V(SUB) تحميل عنوان الروتين الفرعي 1 BALR 14,15 الانتقال إلى الروتين المستدعى 2 ... ARGS DC A(FIRST) عنوان الوسيط الأول DC A(ثانية) ... DC A(THIRD)+X'80000000' الوسيط الأخير 3

البرنامج الذي تم استدعاؤه:

SUB EQU * هذه هي نقطة دخول البرنامج الفرعي 4

تسلسل الإدخال القياسي:

 باستخدام *,15 5 STM 14,12,12(13) حفظ السجلات 6 ST 13,SAVE+4 حفظ عنوان منطقة الحفظ للمتصل LA 12، وفر في مناطق التوفير المتسلسلة ST 12,8(13) LR 13,12 ...

تسلسل الإرجاع القياسي:

 L 13، حفظ +4 7 LM 14,12,12(13) L 15، RETVAL 8 BR 14 العودة إلى المتصل حفظ DS 18F منطقة الحفظ 9

ملحوظات:

  1. استخدم L 15,=A(SUB)أو LA 15,SUBللروتينات الفرعية الداخلية؛ استخدم L 15,=V(SUB)للروتينات الفرعية الخارجية.
  2. تخزن هذه BALRالتعليمة عنوان التعليمة التالية (عنوان العودة) في المسجل المحدد بواسطة الوسيط الأول - المسجل 14 - ثم تنتقل إلى عنوان الوسيط الثاني في المسجل 15. يُفضل استخدام BASR في الطرازات التي تدعمه. يمكن استخدام BASSM إذا لزم التبديل بين وضعَي 24 و31 بت.
  3. يُمرر المُستدعي عنوان قائمة عناوين الوسائط في السجل 1. ويُضبط البت الأعلى في العنوان الأخير للإشارة إلى نهاية القائمة. هذا يُقيد البرامج التي تستخدم هذا الاصطلاح بعناوين 31 بت .
  4. بالنسبة للبرامج الفرعية الخارجية، قم بتضمينها SUB ENTRY ,بعد SUB EQU *أو استبدلها بـ SUB CSECT ,.
  5. يوجد عنوان الروتين المستدعى في السجل 15. عادةً ما يتم تحميل هذا في سجل آخر مع DROPإبلاغ USINGالمجمع بأن السجل 15 لم يعد يُستخدم كسجل أساسي.
  6. تقوم هذه STMالتعليمة بحفظ السجلات 14 و15 ومن 0 إلى 12 في منطقة تخزين بحجم 72 بايت، يوفرها البرنامج المُستدعي، وتُسمى منطقة التخزين هذه ، ويشير إليها السجل 13. يوفر الروتين المُستدعى منطقة تخزين خاصة به لاستخدامها من قِبل الروتينات الفرعية التي يستدعيها؛ ويُحفظ عنوان هذه المنطقة عادةً في السجل 13 طوال فترة تنفيذ الروتين. تقوم التعليمات التالية بتحديث سلاسل التعليمات الأمامية والخلفية التي تربط منطقة التخزين هذه بمنطقة التخزين الخاصة بالبرنامج المُستدعي.STM
  7. يقوم تسلسل الإرجاع باستعادة سجلات المتصل.
  8. يُستخدم السجل رقم 15 عادةً لتمرير رمز الإرجاع. الرمز الموضح غير صحيح ولكنه يوضح المبدأ.
  9. إن تعريف متغير saveareaثابت في الروتين المستدعى يجعله غير قابل لإعادة الدخول وغير متكرر ؛ يستخدم البرنامج القابل لإعادة الدخول متغيرًا ديناميكيًا savearea، يتم الحصول عليه إما من نظام التشغيل ويتم تحريره عند العودة، أو في مساحة تخزين يمررها البرنامج المستدعي.

في واجهة التطبيق الثنائية System/390 [ 13 ] وواجهة التطبيق الثنائية z/Architecture [ 14 ] المستخدمة في لينكس:

  • السجلان 0 و1 متقلبان
  • تُستخدم السجلات 2 و3 لتمرير المعلمات وإرجاع القيم
  • تُستخدم السجلات 4 و 5 أيضًا لتمرير المعلمات
  • يُستخدم السجل 6 لتمرير المعلمات، ويجب حفظه واستعادته بواسطة الدالة المستدعاة.
  • تُستخدم السجلات من 7 إلى 13 من قِبل المتلقي، ويجب عليه حفظها واستعادتها.
  • يُستخدم السجل رقم 14 لعنوان المرسل
  • يُستخدم السجل رقم 15 كمؤشر للمكدس
  • تُستخدم سجلات الفاصلة العائمة 0 و2 لتمرير المعلمات وقيم الإرجاع
  • تُستخدم سجلات الفاصلة العائمة 4 و 6 من قِبل المُستدعى، ويجب حفظها واستعادتها من قِبله.
  • في بنية z/Architecture، تُستخدم سجلات الفاصلة العائمة 1 و3 و5 و7 إلى 15 من قِبل المُستدعى.
  • تم حجز سجل الوصول 0 لاستخدام النظام
  • تُستخدم سجلات الوصول من 1 إلى 15 من قبل المتصل به

يتم تمرير الوسائط الإضافية على المكدس.

سوبر إتش

يسجلويندوز سي إي 5.0 [ 15 ]gcc [ 16 ]رينيساس [ 17 ]
R0قيم الإرجاع. مؤقتة لتوسيع تعليمات التجميع الزائفة. مصدر/وجهة ضمنية لعمليات 8/16 بت. غير محفوظة.القيمة المُعادة، يقوم المُستدعي بحفظهامتغيرات/مؤقتة. غير مضمونة
R1..R3تُستخدم كسجلات مؤقتة. غير محفوظة.تم حفظ بيانات المتصل مؤقتًا. عنوان البنية (يتم حفظه من قبل المتصل، افتراضيًا)متغيرات/مؤقتة. غير مضمونة
R4..R7الكلمات الأربع الأولى من الوسائط الصحيحة. توفر منطقة بناء الوسائط مساحةً قد تتسرب إليها الوسائط من R4 إلى R7. غير محفوظة.تمرير المعاملات، يقوم المستدعي بالحفظالنقاشات. غير مضمونة.
R8..R13تُستخدم كسجلات دائمة. محفوظة.كالي تنقذمتغيرات/مؤقتة. مضمونة.
R14مؤشر الإطار الافتراضي. (قد تعمل R8-R13 أيضًا كمؤشر إطار، وقد تستخدم إجراءات الأوراق R1-R3 كمؤشر إطار.) محفوظ.مؤشر الإطار، FP، يحفظ المستدعيمتغيرات/مؤقتة. مضمونة.
R15يُستخدم كمؤشر للمكدس أو كمسجل دائم. محفوظ.مؤشر المكدس، SP، يحفظه المستدعىمؤشر المكدس. مضمون.

ملاحظة: كلمة "محفوظ" تعني احتفاظ المتلقي بالودائع؛ وينطبق الشيء نفسه على كلمة "مضمون".

68 ألف

أكثر اصطلاحات الاتصال شيوعًا لسلسلة موتورولا 68000 هي: [ 18 ] [ 19 ] [ 20 ] [ 21 ]

  • d0 و d1 و a0 و a1 هي سجلات مؤقتة
  • يتم حفظ جميع السجلات الأخرى
  • a6 هو مؤشر الإطار، والذي يمكن تعطيله بواسطة خيار المترجم
  • يتم دفع المعاملات إلى المكدس، من اليمين إلى اليسار
  • يتم تخزين القيمة المُعادة في d0

آي بي إم 1130

كان جهاز IBM 1130 جهازًا صغيرًا ذا 16 بت، قابلًا للعنونة بالكلمات. احتوى على ستة سجلات فقط بالإضافة إلى مؤشرات الحالة، ولم يكن به مكدس. السجلات هي: سجل عنوان التعليمات (IAR) ، والمراكم (ACC) ، وامتداد المركم (EXT) ، وثلاثة سجلات فهرسة X1 إلى X3. البرنامج المُستدعي مسؤول عن حفظ ACC وEXT وX1 وX2. [ 22 ] توجد عمليتان زائفتان لاستدعاء الروتينات الفرعية، إحداهما CALLلكتابة روتينات فرعية غير قابلة للنقل مرتبطة مباشرة بالبرنامج الرئيسي، والأخرى LIBFلاستدعاء روتينات فرعية من المكتبة قابلة للنقل عبر متجه نقل . [ 23 ] تُحل كلتا العمليتين الزائفتين إلى تعليمة آلة Branch and Store IAR ( BSI) التي تخزن عنوان التعليمة التالية في عنوانها الفعلي (EA) وتتفرع إلى EA+1.

تأتي الوسائط بعد عنوان الذاكرة -BSIوعادةً ما تكون هذه العناوين مكونة من كلمة واحدة - ويجب على الروتين

 مثال على روتين فرعي 1130 ENT SUB أعلن "SUB" كنقطة دخول خارجية SUB DC 0 كلمة محجوزة عند نقطة الدخول، مشفرة تقليديًا "DC *-*" * يبدأ رمز البرنامج الفرعي هنا * في حال وجود وسائط، يمكن تحميل العناوين بشكل غير مباشر من عنوان الإرجاع LDX I 1 SUB تحميل X1 بعنوان الوسيط الأول (على سبيل المثال) ... * تسلسل الإرجاع LD RES تحميل النتيجة العددية الصحيحة إلى ACC * في حال عدم تقديم أي وسيطات، يتم الانتقال بشكل غير مباشر إلى عنوان الإرجاع المخزن. BI SUB إذا لم يتم تقديم أي وسائط نهاية الإجراء الفرعي 

تقوم البرامج الفرعية في أجهزة IBM 1130 و CDC 6600 و PDP-8 (تم طرح جميع هذه الأجهزة الثلاثة في عام 1965) بتخزين عنوان العودة في الموقع الأول من البرنامج الفرعي. [ 24 ]

اصطلاحات الاستدعاء خارج نطاق بنى الآلات

الكود متعدد الخيوط

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

يمرر الكود متعدد الخيوط جميع الوسائط على المكدس. وتُعاد جميع القيم المُعادة على المكدس أيضًا. هذا يجعل التطبيقات البسيطة أبطأ من اصطلاحات الاستدعاء التي تحتفظ بقيم أكثر في المسجلات. مع ذلك، فإن تطبيقات الكود متعدد الخيوط التي تخزن مؤقتًا العديد من قيم المكدس العليا في المسجلات - وخاصةً عنوان الإرجاع - عادةً ما تكون أسرع من اصطلاحات استدعاء الروتينات الفرعية التي تُضيف عنوان الإرجاع إلى المكدس وتُزيله منه دائمًا. [ 25 ] [ 26 ] [ 27 ]

PL/I

تعتمد اصطلاحات الاستدعاء الافتراضية للبرامج المكتوبة بلغة PL/I على تمرير جميع الوسائط بالمرجع ، مع إمكانية تحديد اصطلاحات أخرى اختيارية. [ 28 ] تُعالج الوسائط بشكل مختلف باختلاف المترجمات والمنصات، ولكن عادةً ما تُمرر عناوين الوسائط عبر قائمة وسائط في الذاكرة. قد يُمرر عنوان نهائي مخفي يشير إلى منطقة تحتوي على القيمة المُعادة. نظرًا لتنوع أنواع البيانات التي تدعمها PL/I، يُمكن أيضًا تمرير مُعرّف بيانات لتحديد، على سبيل المثال، أطوال سلاسل الأحرف أو البتات، أو أبعاد وحدود المصفوفات ( متجهات البيانات )، أو تخطيط ومحتويات بنية البيانات . تُنشأ وسائط وهمية للوسائط الثابتة أو التي لا تتوافق مع نوع الوسيط الذي تتوقعه الدالة المُستدعاة. [ 28 ]

انظر أيضاً

ملاحظات توضيحية

  1. توجد أحجام أخرى عند السماح بوضع سجل الوصول (AR) أو وضع عنوان 64 بت للمتصلين.

مراجع

  1. 1 2 "اتفاقيات الاستدعاء" . cs.cornell.edu . تم الاسترجاع في 2024-03-05 .
  2. "/Oy (حذف مؤشر الإطار)" . learn.microsoft.com . 3 أغسطس 2021. تم الاسترجاع في 14 يونيو 2024 .
  3. "معيار استدعاء الإجراءات لبنية ARM" . 2021.
  4. "المعلمات في سجلات الأغراض العامة" . دليل مبرمج سلسلة ARM Cortex-A لـ ARMv8-A . تم الاطلاع عليه بتاريخ 12 نوفمبر 2020 .
  5. "المعاملات في NEON وسجلات الفاصلة العائمة" . developer.arm.com . تم الاطلاع عليه بتاريخ 13 نوفمبر 2020 .
  6. "اتفاقية استدعاء RISC-V" (ملف PDF) .
  7. "مرجع سريع لمجموعة تعليمات MIPS32" .
  8. سويتمان، دومينيك. انظر MIPS Run ( الطبعة الثانية). دار نشر مورغان كوفمان . رقم ISBN  0-12088-421-6.
  9. 1 2 "تاريخ MIPS ABI" . مؤرشف من الأصل بتاريخ 26-08-2018 . تم الاطلاع عليه بتاريخ 17-08-2020 .
  10. كريستوفر، إريك (11 يونيو 2003). "توثيق MIPS EABI" . binutils@sources.redhat.com (قائمة بريدية) . تم الاطلاع عليه في 19 يونيو 2020 .
  11. "نوبي" . مؤرشف من الأصل بتاريخ 29-07-2021 . تم الاطلاع عليه بتاريخ 16-08-2020 .
  12. ملحق معالج SPARC لواجهة التطبيقات الثنائية للنظام الخامس ( الطبعة الثالثة). 
  13. "ملحق واجهة التطبيق الثنائية S/390 ELF" .
  14. "ملحق واجهة التطبيق الثنائية لسلسلة z ELF" .
  15. "سجلات رينيساس SH-4" . مايكروسوفت ليرن . 2007-07-09.
  16. "واجهة تطبيق SH الثنائية لـ GCC" . مؤرشفة من الأصل بتاريخ 2014-11-05.
  17. "دليل المستخدم لحزمة مُجمِّع ومُجمِّع ومُحرِّر الربط الأمثل لمحرك SuperH RISC C/C++ الإصدار 9.00" (ملف PDF) . مؤرشف من النسخة الأصلية (PDF) بتاريخ 15 مارس 2016.
  18. سميث، دكتور مايك. "مقارنة سجلات SHARC (21 ألف) و 68 ألف" .
  19. XGCC: نظام لغة GNU C/C++ لتطوير الأنظمة المدمجة (ملف PDF) . شركة أدوات دعم الأنظمة المدمجة. 2000. ص 59. 
  20. "COLDFIRE/68K: ThreadX لعائلة Freescale ColdFire" . مؤرشف من الأصل بتاريخ 2015-10-02.
  21. موشوفوس، أندرياس. "البرامج الفرعية (تابع): تمرير الوسائط، وإرجاع القيم، وتخصيص المتغيرات المحلية" . يجب الحفاظ على جميع السجلات باستثناء d0 وd1 وa0 وa1 وa7 عبر الاستدعاء.
  22. شركة آي بي إم (1967). نظام مراقبة القرص IBM 1130، الإصدار 2، مقدمة النظام (C26-3709-0) (ملف PDF) . صفحة 67. تاريخ الاطلاع: 21 ديسمبر 2014 . 
  23. شركة آي بي إم (1968). لغة التجميع لـ IBM 1130 (C26-5927-4) (ملف PDF) . الصفحات 24-25 . 
  24. سموثرمان، مارك (2004). "دعم استدعاءات الإجراءات والروتينات الفرعية: التاريخ المبكر" .
  25. رودريغيز، براد. "المضي قدمًا، الجزء 1: قرارات التصميم في نواة فورث" . في معالج 6809 أو Zilog Super8، يكون DTC أسرع من STC.
  26. إرتل، أنطون. "سرعة تقنيات إرسال المترجمين المختلفة" .
  27. زاليسكي، ماثيو (2008). "الفصل 4: تصميم وتنفيذ تفسير فعال" . YETI: مُفسِّر تتبع قابل للتوسيع تدريجيًا . على الرغم من أن المُفسِّرات ذات الخيوط المباشرة معروفة بضعف خصائص التنبؤ بالتفرع... إلا أن زمن استجابة الاستدعاء والعودة قد يكون أكبر من زمن استجابة القفزة غير المباشرة.
  28. 1 2 "أنظمة IBM 360 وأنظمة 370 المبكرة" .