سؤال

أود أن أعرف أي واحد هو المسؤول عن تنظيف المكدس

لنفترض أن لديك متعة وظيفة يتيح القول مثل هذا:

var = fun(int x, int y, float z, char x);

متي fun سيطلق الأمر ستدعي أنه سيذهب إلى المكدس إلى جانب المعلمات، عند إرجاع الوظيفة المسؤولة عن تنظيف المكدس، هل هي الوظيفة الذاتية أو "VAR" التي ستحمل قيمة الإرجاع.

شيء آخر، هل يمكن لأي شخص أن يفسر مفاهيم دعوة الاتفاقيات؟

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

المحلول

اتفاقية الاتصال. يشير إلى من يقوم بتنظيف المكدس؛ المتصل أو callee.

يمكن أن تختلف الاتفاقيات المتصلحة في:

  • حيث يتم وضع المعلمات وقيم الإرجاع (في السجلات؛ على مكدس المكالمات؛ مزيج من الاثنين)
  • الترتيب الذي يتم تمرير المعلمات (أو أجزاء من معلمة واحدة)
  • كيف تنقسم مهمة إنشاء وتنظيف مكالمة دالة بين المتصل والكالير.
  • ما هي السجلات التي قد يتم استخدامها مباشرة من قبل Callee قد يتم أيضا تضمينها في بعض الأحيان

دائما ما تكون المعمارات دائما أكثر من اتفاقية استدعاء واحدة ممكنة.

نصائح أخرى

أشارت إلى الإجابة بنفسك: استدعاء الاتفاقيات.

تشبه اتفاقية الاتصال ل عقد. وبعد يقرر الأشياء التالية:

  • من المسؤول عن تنظيف المعلمات.
  • كيف وفي أي طلب يتم تمرير المعلمات إلى الوظيفة المسمى.
  • حيث يتم تخزين قيمة الإرجاع.

هناك العديد من اتفاقيات الاتصال المختلفة، اعتمادا على المنصة وبيئة البرمجة. اثنين من اتفاقيات الاتصال المشتركة على منصات X86 هي:

Stdcall.

يتم تمرير المعلمات إلى المكدس من اليمين إلى اليسار. ال مسمى وظيفة تنظيف المكدس.

CDECL.

يتم تمرير المعلمات إلى المكدس من اليمين إلى اليسار. ال دعا وظيفة تنظيف المكدس.

في كلتا الحالتين قيمة الإرجاع في EAX سجل (أو ST0 لقيم النقطة العائمة)

تسمح العديد من لغات البرمجة لمنصة X86 بتحديد اتفاقية الاتصال، على سبيل المثال:

دلفي

function MyFunc(x: Integer): Integer; stdcall;

مايكروسوفت C / C ++

int __stdcall myFunc(int x)

بعض ملاحظات الاستخدام:

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

  • عند استدعاء المكتبات الخارجية، API Win32 على سبيل المثال: يجب عليك استخدام اتفاقيات الاتصال المتوافقة، وإلا فقد تتلف المكدس.
  • عند إنشاء رمز التجميع المضمن: عليك أن تعرف في السجلات وأين في المكدس، تجد المتغيرات.

لمزيد من التفاصيل، أوصي بهذه المقالات في ويكيبيديا:

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

استدعاء الاتفاقيات: كل ما ينظمه المحول البرمجي حتى يتمكن المرح القيام بعمله. النظر في تلك المعلمات X، Y، Z. ما هو الأمر الذي يتم دفعه إلى المكدس (في الواقع يحصلون على المرور عبر المكدس)؟ لا يهم وقتا طويلا كما يتفق المتصل والكاليلي! إنها اتفاقية.

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