اصطلاحات استدعاء x86

تصف هذه المقالة اصطلاحات الاستدعاء المستخدمة عند برمجة المعالجات الدقيقة ذات بنية x86 .

تصف اصطلاحات الاستدعاء واجهة التعليمات البرمجية المستدعاة:

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

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

توجد اختلافات دقيقة في كيفية تطبيق المترجمات المختلفة لهذه الاصطلاحات، لذا يصعب غالبًا ربط التعليمات البرمجية التي تُترجم بواسطة مترجمات مختلفة. في المقابل، تُطبَّق الاصطلاحات المستخدمة كمعيار لواجهة برمجة التطبيقات (مثل stdcall) بشكل موحد للغاية.

الخلفية التاريخية

تم تحديد معيار أجهزة الكمبيوتر المتوافقة مع IBM PC بواسطة معالجات Intel ( 8086 ، 80386) والأجهزة التي وفرتها IBM فعليًا. أُتيحت امتدادات الأجهزة وجميع معايير البرامج (باستثناء اصطلاح تسمية BIOS ) للمنافسة في السوق.

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

بعد انحسار سوق الأنظمة المتوافقة مع IBM، هيمنت أنظمة تشغيل وأدوات برمجة مايكروسوفت (بمعايير مختلفة)، بينما حافظت شركات من الدرجة الثانية مثل بورلاند ونوفيل ، ومشاريع مفتوحة المصدر مثل مجموعة مترجمات جنو (GCC)، على معاييرها الخاصة. وفي نهاية المطاف ، تم اعتماد أحكام للتوافق بين الموردين والمنتجات، مما سهّل مشكلة اختيار معيار قابل للتطبيق. [ 1 ]

تنظيف سجل المكالمات

في هذه الأنواع من اصطلاحات الاستدعاء، يقوم المستدعي بتنظيف الوسائط من المكدس (إعادة ضبط حالة المكدس تمامًا كما كانت قبل استدعاء الدالة المستدعاة).

cdecl

يُعدّ cdecl cdecl(اختصارًا لـ C declaration ) اصطلاحًا لاستدعاء الدوال في لغة البرمجة ويستخدمه العديد من مُجمّعات C لبنية x86 . [ 1 ] في cdecl، تُمرّر وسائط الدوال الفرعية عبر المكدس . إذا كانت القيم المُعادة أعدادًا صحيحة أو عناوين ذاكرة، يضعها المُستدعى في المُسجّل EAX ، بينما تُوضع قيم الفاصلة العائمة في المُسجّل ST0 x87 . يحتفظ المُستدعي بالمُسجّلات EAX وECX وEDX، بينما يحتفظ المُستدعى بالمُسجّلات الأخرى. يجب أن تكون مُسجّلات الفاصلة العائمة x87 من ST0 إلى ST7 فارغة (مُحرّرة) عند استدعاء دالة جديدة، ويجب أن تكون من ST1 إلى ST7 فارغة عند الخروج من دالة. يجب أن يكون ST0 فارغًا أيضًا عندما لا يُستخدم لإعادة قيمة.

في سياق لغة C، يتم دفع وسائط الدالة على المكدس بترتيب من اليمين إلى اليسار (RTL)، أي يتم دفع الوسيط الأخير أولاً.

انظر إلى مقتطف الشفرة المصدرية التالية المكتوبة بلغة C :

int callee ( int , int , int );int المتصل ( void ) { إرجاع المستدعي ( 1 , 2 , 3 ) + 5 ; }

على معالجات x86 ، قد ينتج عنه كود التجميع التالي ( بصيغة Intel ):

المُستدعي: ; إنشاء إطار استدعاء جديد ; (قد تُنتج بعض المُترجمات تعليمة 'enter' بدلاً من ذلك) push ebp ; حفظ إطار الاستدعاء القديم mov ebp , esp ; تهيئة إطار الاستدعاء الجديد ; دفع وسائط الاستدعاء، بترتيب عكسي ; (قد تطرح بعض المُترجمات المساحة المطلوبة من مؤشر المكدس، ; ثم تكتب كل وسيط مباشرةً، انظر أدناه. ; يمكن لتعليمة 'enter' أيضًا القيام بشيء مماثل) ; sub esp, 12 : يمكن لتعليمة 'enter' القيام بذلك نيابةً عنا ; mov [ebp-4], 3 : أو mov [esp+8], 3 ; mov [ebp-8], 2 : أو mov [esp+4], 2 ; mov [ebp-12], 1 : أو mov [esp], 1 push 3 push 2 push 1 call callee ; استدعاء الروتين الفرعي 'callee' add esp , 12 ; إزالة وسائط الاستدعاء من الإطار، إضافة eax ، 5 ؛ تعديل نتيجة الروتين الفرعي ؛ (eax هي القيمة المرجعة من الدالة المستدعاة ، لذا لسنا بحاجة إلى نقلها إلى متغير محلي) ؛ استعادة إطار الاستدعاء القديم ؛ (قد تُنتج بعض المُترجمات تعليمة "مغادرة" بدلاً من ذلك) ؛ تُملي معظم اصطلاحات الاستدعاء أن يتم حفظ ebp بواسطة الدالة المستدعاة، أي أنه يتم الاحتفاظ به بعد استدعاء الدالة المستدعاة. لذلك، فإنه لا يزال يُشير إلى بداية إطار المكدس. نحتاج إلى التأكد من أن الدالة المستدعاة لا تُعدّل (أو تستعيد) ebp، لذا نحتاج إلى التأكد من أنها تستخدم اصطلاح استدعاء يقوم بذلك. إزالة ebp ؛ استعادة إطار الاستدعاء القديم، ret ؛ إرجاع

يقوم المستدعي بتنظيف المكدس بعد عودة استدعاء الدالة.

عادةً ما يكون اصطلاح الاستدعاء cdeclهو الاصطلاح الافتراضي لمترجمات لغة C x86 ، على الرغم من أن العديد من المترجمات توفر خيارات لتغيير اصطلاحات الاستدعاء المستخدمة تلقائيًا. لتعريف دالة يدويًا لتكون cdecl، يدعم بعضها الصيغة التالية:

return_type __cdecl func_name ();

الاختلافات

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

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

في الأنظمة الشبيهة بنظام يونكس، يتم تحديد اصطلاح الاستدعاء القياسي في واجهة التطبيق الثنائية للنظام الخامس ( System V ABI). توجد وثائق منفصلة لأنظمة i386، و x86-64 ، وK1OM ، وغيرها.

في نظام لينكس ، يُرسي مُجمِّع GCC المعيار الفعلي لاتفاقيات الاستدعاء. فمنذ الإصدار 4.5 من GCC، يجب محاذاة المكدس إلى حد 16 بايت عند استدعاء دالة (بينما كانت الإصدارات السابقة تتطلب محاذاة 4 بايت فقط، وفقًا لواجهة التطبيق الثنائية System V) وذلك بسبب استخدام تعليمات التحميل المُحاذية SSE . [ 1 ] [ 4 ]

استدعاء النظام

يشبه هذا الأمر cdecl من حيث أن الوسائط تُدفع من اليمين إلى اليسار. مع ذلك، لا يتم الاحتفاظ بقيم EAX وECX وEDX، ويتم تمرير حجم قائمة المعاملات بالكلمات المزدوجة في AL.

Syscall هو اصطلاح الاستدعاء القياسي لواجهة برمجة تطبيقات نظام التشغيل OS/2 ذات 32 بت .

تُمرَّر الوسائط من اليمين إلى اليسار. تُمرَّر الوسائط الثلاثة الأولى (الأيسر) في السجلات EAX وEDX وECX، بينما تُمرَّر أربعة وسائط من نوع الفاصلة العائمة كحد أقصى في السجلات ST0 إلى ST3، مع العلم أنه يتم حجز مساحة لها في قائمة الوسائط على المكدس. تُعاد النتائج في السجل EAX أو ST0. ويتم الاحتفاظ بالسجلات EBP وEBX وESI وEDI.

يستخدم برنامج Optlink بواسطة مترجمات IBM VisualAge .

تنظيف الوادي

في هذه الاصطلاحات، يقوم المستدعى بتنظيف الوسائط من المكدس. يسهل التعرف على الدوال التي تستخدم هذه الاصطلاحات في كود لغة التجميع (ASM) لأنها تقوم بفك المكدس بعد العودة. تسمح تعليمة x86 بمعامل retاختياري 16 بت يحدد عدد بايتات المكدس التي سيتم تحريرها بعد العودة إلى المستدعي. يبدو هذا الكود كالتالي:

ret 12

لم يتم توحيد الاصطلاحات المسماة بـ ` fastcall`` أو register```، وقد تم تنفيذها بشكل مختلف، اعتمادًا على مُصنِّع المُصرِّف. [ 1 ] عادةً ما تمرر اصطلاحات الاستدعاء القائمة على السجلات وسيطًا واحدًا أو أكثر في السجلات، مما يقلل من عدد عمليات الوصول إلى الذاكرة المطلوبة للاستدعاء، وبالتالي يجعلها أسرع في العادة.

باسكال

استنادًا إلى اصطلاح استدعاء لغة Borland Turbo Pascal ، يتم دفع المعلمات على المكدس بترتيب من اليسار إلى اليمين (LTR) (عكس cdecl)، ويكون المستدعى مسؤولاً عن إزالتها من المكدس.

يتم إرجاع النتيجة على النحو التالي:

  • يتم إرجاع القيم الترتيبية في AL ( قيم 8 بت )، AX (قيم 16 بت)، EAX ( قيم 32 بت )، أو DX:AX (قيم 32 بت على أنظمة 16 بت).
  • يتم إرجاع القيم الحقيقية في DX:BX:AX.
  • يتم إرجاع قيم الفاصلة العائمة (8087) في ST0.
  • يتم إرجاع المؤشرات في EAX على أنظمة 32 بت وفي AX على أنظمة 16 بت.
  • يتم إرجاع السلاسل النصية في موقع مؤقت يشير إليه @Result الرمز.

كان هذا الأسلوب في استدعاء الدوال شائعًا في واجهات برمجة التطبيقات ذات 16 بت التالية: OS/2 1.x، و Microsoft Windows 3.x، و Borland Delphi الإصدار 1.x. تستخدم الإصدارات الحديثة من واجهة برمجة تطبيقات Windows الدالة stdcall ، والتي لا تزال تقوم باستعادة المكدس كما في أسلوب باسكال، ولكن يتم الآن دفع المعاملات من اليمين إلى اليسار.

مكالمة قياسية

يُعدّ اصطلاح استدعاء stdcall [ 5 ] شكلاً مُعدّلاً من اصطلاح استدعاء باسكال، حيث يكون المُستدعى مسؤولاً عن تنظيف المكدس، ولكن تُضاف المعاملات إلى المكدس بترتيب من اليمين إلى اليسار، كما هو الحال في اصطلاح استدعاء _cdecl. تُخصّص السجلات EAX وECX وEDX للاستخدام داخل الدالة. تُخزّن القيم المُعادة في السجل EAX.

stdcall هو اصطلاح الاستدعاء القياسي لواجهة برمجة تطبيقات Microsoft Win32 ولـ Open Watcom C++ .

مايكروسوفت فاست كول

تُمرر اصطلاحات Microsoft __fastcall أول وسيطين مناسبين (يتم تقييمهما من اليسار إلى اليمين) إلى ECX وEDX. [ 6 ] تُدفع الوسائط المتبقية إلى المكدس من اليمين إلى اليسار. عند قيام المُصرّف بالتجميع لـ IA64 أو AMD64 ، فإنه يتجاهل الكلمة المفتاحية __fastcall (أو أي كلمة مفتاحية أخرى لاصطلاحات الاستدعاء باستثناء __vectorcall ) ويستخدم اصطلاح الاستدعاء الافتراضي لـ Microsoft ذي 64 بت بدلاً من ذلك.

توفر مُجمّعات أخرى مثل GCC [ 7 ] و Clang [ 8 ] اصطلاحات استدعاء "fastcall" مماثلة، على الرغم من أنها ليست بالضرورة متوافقة مع بعضها البعض أو مع fastcall من Microsoft. [ 9 ]

انظر إلى مقتطف الشفرة التالي بلغة C:

__attribute__ (( fastcall )) void printnums ( int num1 , int num2 , int num3 ){ printf ( "الأرقام التي أرسلتها هي: %d %d %d" , num1 , num2 , num3 ); }int main (){ printnums ( 1 , 2 , 3 ); return 0 ; }

سيبدو فك تجميع الدالة الرئيسية باستخدام x86 كما يلي (بصيغة Intel):

main: ; إعداد المكدس push ebp mov ebp , esp push 3 ; القيمة الفورية 3 (يتم دفع الوسيط الثالث إلى المكدس) mov edx , 0x2 ; القيمة الفورية 2 (يتم نسخ الوسيط الثاني) إلى سجل edx. mov ecx , 0x1 ; القيمة الفورية 1 (يتم نسخ الوسيط الأول) إلى سجل ecx. call printnums mov eax , 0 ; return 0 leave retn

يتم تمرير الوسيطين الأولين من اليسار إلى اليمين، ويُضاف الوسيط الثالث إلى المكدس. لا توجد عملية تنظيف للمكدس، حيث يتم ذلك بواسطة الدالة المستدعاة. تفكيك الدالة المستدعاة هو:

printnums: ; إعداد المكدس push ebp mov ebp , esp sub esp , 0x08 mov [ ebp-0x04 ], ecx ; في x86، ecx = الوسيط الأول. mov [ ebp-0x08 ], edx ; arg2 push [ ebp + 0x08 ] ; يتم دفع arg3 إلى المكدس. push [ ebp-0x08 ] ; يتم دفع arg2 push [ ebp-0x04 ] ; يتم دفع arg1 push 0x8065d67 ; "الأرقام التي أرسلتها هي %d %d %d" call printf ; تنظيف المكدس add esp , 0x10 nop leave retn 0x04

بما أن الوسيطين تم تمريرهما عبر السجلات وتم دفع معلمة واحدة فقط في المكدس، فإن القيمة المدفوعة يتم مسحها بواسطة تعليمة retn، حيث أن حجم int هو 4 بايت في أنظمة x86.

مايكروسوفت فيكتوركول

في Visual Studio 2013، قدمت مايكروسوفت اصطلاح استدعاء __vectorcall استجابةً لمخاوف الكفاءة لدى مطوري الألعاب والرسومات والفيديو/الصوت وبرامج الترميز. يسمح هذا النظام بتمرير أنواع المتجهات الأكبر ( float ، double ، __m128 ، __m256 ) في السجلات بدلاً من تمريرها عبر المكدس. [ 10 ]

تُضيف الدالة __vectorcall دعمًا لتمرير قيم التجميع المتجانس للمتجهات (HVA)، وهي أنواع مركبة (هياكل) تتكون حصريًا من أربعة أنواع متجهات متطابقة كحد أقصى، باستخدام نفس السجلات الستة. بعد تخصيص السجلات لوسائط نوع المتجه، تُخصص السجلات غير المستخدمة لوسائط HVA من اليسار إلى اليمين. وتظل قواعد التموضع سارية. تُعاد قيم نوع المتجه وHVA الناتجة باستخدام أول أربعة سجلات XMM/YMM. [ 11 ]

بالنسبة لبرامج IA-32 و x64، فإن الدالة __vectorcall تُشابه الدالة __fastcall واتفاقيات استدعاء x64 الأصلية على التوالي، ولكنها تُوسّعها لدعم تمرير وسائط المتجهات باستخدام سجلات SIMD . في IA-32، تُمرّر القيم الصحيحة كالمعتاد، وتحتفظ سجلات SIMD الستة الأولى ( XMM / YMM 0-5) بما يصل إلى ست قيم من نوع الفاصلة العائمة أو المتجهات أو HVA بالتسلسل من اليسار إلى اليمين، بغض النظر عن المواضع الفعلية الناتجة عن، على سبيل المثال، وجود وسيط عدد صحيح بينها. أما في x64، فلا تزال قاعدة اتفاقية x64 الأصلية سارية، بحيث لا تحتفظ سجلات XMM/YMM 0-5 إلا بوسائط الفاصلة العائمة أو المتجهات أو HVA عندما تكون من الأول إلى السادس. [ 11 ]

كما يقوم كل من مترجم Clang ومترجم Intel C++ بتنفيذ vectorcall. [ 12 ]

تتعامل دالة vectorcall فقط مع عرض سجلات المتجهات ذي 256 بت (AVX، YMM). وهي لا تغطي عرض AVX-512 (ZMM).

مسجل إنتل

قبل استخدام __vectorcall، كان لدى ICC اصطلاح مشابه يُسمى __regcall ، حيث يتم تخزين أكبر عدد ممكن من المعاملات في السجلات. [ 13 ] [ 14 ] وهو مدعوم أيضًا من قِبل clang. [ 12 ]

لدى إنتل واجهة برمجة تطبيقات (ABI) لوظائف المتجهات تعتمد على __regcall، وهي غير مُطبقة بواسطة clang (حتى نوفمبر 2025). تتعامل هذه الواجهة مع متجهات من أنواع البيانات العادية، لذا يتم تمرير معظم المعاملات (وإرجاع النتائج) عبر سجلات [XYZ]MM. [ 15 ] وقد اعتمدت مكتبة libmvec التابعة لـ glibc صيغةً معدلةً من هذه الواجهة، تستخدم اصطلاح استدعاء System V المعتاد لمنصة x86_64 فيما يتعلق باستخدام السجلات، وهي مدعومة من قِبل GCC وClang وICC. [ 16 ]

مُعدِّلات GNU و clang

في أنظمة x86 ذات 32 بت، يحتوي نظام GNU على خاصية regparm التي تسمح بتمرير ما يصل إلى ثلاثة معلمات غير متغيرة في EAX وEDX وECX. وهي ليست اصطلاح استدعاء خاص بها بقدر ما هي تعديل يمكن تطبيقه على اصطلاحات الاستدعاء الموجودة. [ 12 ]

يحتوي Clang على مُعدِّلات اصطلاحية مماثلة، مثل preserve_all و preserve_none و preserve_most ، وهي قابلة للتطبيق على نطاق واسع على العديد من البنى. [ 12 ] يدعم GCC هذه المُعدِّلات على معماريتي x86 و x86-64. [ 17 ]preserve_none

سجل بورلاند

بتقييم الوسائط من اليسار إلى اليمين، يمرر ثلاثة وسائط عبر EAX وEDX وECX. تُضاف الوسائط المتبقية إلى المكدس، أيضًا من اليسار إلى اليمين. [ 18 ] هذه هي اصطلاحية الاستدعاء الافتراضية لمترجم دلفي ذي 32 بت ، حيث تُعرف باسم register . تُستخدم هذه الاصطلاحية أيضًا في C++Builder من Embarcadero ، حيث تُسمى __fastcall . [ 19 ] في هذا المترجم، يمكن استخدام fastcall من Microsoft باسم __msfastcall . [ 20 ]

يمكن جعل كل من GCC وClang يستخدمان اصطلاح استدعاء مماثلًا باستخدام __stdcallسمة regparmالدالة أو -mregparm=3المُبدِّل. (يتم عكس ترتيب المكدس). من الممكن أيضًا إنشاء نسخة مُعدّلة لتنظيف المُستدعي باستخدام cdeclأو توسيع هذا ليشمل استخدام سجلات SSE أيضًا. [ 21 ]cdecl يستخدم نواة لينكس على معالجات i386 إصدارًا قائمًا على هذا الاصطلاح منذ الإصدار 2.6.20 (الذي صدر في فبراير 2007) . [ 22 ]

سجل واتكوم

لا يدعم Watcom الكلمة المفتاحية __fastcall إلا إذا تم تعريفها باسم بديل (null). يمكن تحديد اصطلاح استدعاء السجل عبر مفتاح سطر الأوامر.

يتم تخصيص ما يصل إلى 4 سجلات للوسائط بالترتيب التالي: EAX، EDX، EBX، ECX. تُخصص الوسائط للسجلات من اليسار إلى اليمين. إذا تعذر تخصيص أي وسيط لسجل (كأن يكون حجمه كبيرًا جدًا)، فإنه، مع جميع الوسائط اللاحقة، يُخصص للمكدس. تُدفع الوسائط المُخصصة للمكدس من اليمين إلى اليسار. تُشوّه الأسماء بإضافة شرطة سفلية لاحقة. تُنظف الدالة المُستدعِية المكدس. [ 23 ]

تعتمد الدوال ذات عدد متغير من الوسائط على اصطلاح الاستدعاء القائم على مكدس Watcom.

يستخدم مُصرّف Watcom C/C++ أيضًا التوجيه #pragma aux [ 24 ] الذي يسمح للمستخدم بتحديد اصطلاح الاستدعاء الخاص به. وكما هو مذكور في دليل المستخدم، "من غير المرجح أن يحتاج سوى عدد قليل جدًا من المستخدمين إلى هذه الطريقة، ولكن إذا دعت الحاجة إليها، فقد تكون منقذة".

توب سبيد، كلاريون، جيه بي آي

تُمرَّر المعاملات الصحيحة الأربعة الأولى في المسجلات EAX وEBX وECX وEDX. أما معاملات الفاصلة العائمة فتُمرر عبر مكدس الفاصلة العائمة - المسجلات ST0 وST1 وST2 وST3 وST4 وST5 وST6. تُمرَّر معاملات البنية دائمًا عبر المكدس. تُمرَّر المعاملات المضافة عبر المكدس بعد استنفاد المسجلات. تُعاد القيم الصحيحة في EAX، والمؤشرات في EDX، وأنواع الفاصلة العائمة في ST0.

مكالمة آمنة

في دلفي وفري باسكال على نظام التشغيل مايكروسوفت ويندوز ، تُغلف اصطلاحات استدعاء الدالة safecall معالجة أخطاء COM ( نموذج كائن المكون )، وبالتالي لا يتم تسريب الاستثناءات إلى المُستدعي، بل يتم الإبلاغ عنها في قيمة HRESULT المُعادة، كما هو مطلوب في COM/OLE. عند استدعاء دالة safecall من كود دلفي، يتحقق دلفي تلقائيًا من قيمة HRESULT المُعادة ويُطلق استثناءً إذا لزم الأمر.

تُشابه آلية استدعاء safecall آلية استدعاء stdcall، باستثناء أن الاستثناءات تُعاد إلى المُستدعي في EAX كـ HResult (بدلاً من FS:[0])، بينما تُمرر نتيجة الدالة بالمرجع على المكدس كما لو كانت مُعامل "out" نهائي. عند استدعاء دالة Delphi من داخل Delphi، ستظهر آلية الاستدعاء هذه كأي آلية استدعاء أخرى، لأنه على الرغم من إعادة الاستثناءات في EAX، إلا أن المُستدعي يُحوّلها تلقائيًا إلى استثناءات صحيحة. عند استخدام كائنات COM المُنشأة بلغات أخرى، تُثار HResults تلقائيًا كاستثناءات، وتكون نتيجة دوال Get في النتيجة نفسها بدلاً من مُعامل. عند إنشاء كائنات COM في Delphi باستخدام safecall، لا داعي للقلق بشأن HResults، حيث يمكن إثارة الاستثناءات بشكل طبيعي ولكنها ستُعرض كـ HResults في اللغات الأخرى.

دالة اسم_الدالة ( أ : DWORD ) : DWORD ؛ استدعاء_آمن ؛

تُعيد هذه الدالة نتيجة وتُثير استثناءات مثل دالة دلفي العادية، ولكنها تُمرر القيم والاستثناءات كما لو كانت:

دالة اسم_الدالة ( أ : DWORD ؛ نتيجة الإخراج : DWORD ) : HResult ؛ استدعاء قياسي ؛

تنظيف من جانب المتصل أو المتصل به

هذه المكالمة

يُستخدم هذا الأسلوب لاستدعاء الدوال الأعضاء غير الثابتة في لغة C++. يوجد إصداران رئيسيان منه، thiscallيعتمدان على المُصرّف وما إذا كانت الدالة تستخدم عددًا متغيرًا من الوسائط أم لا.

بالنسبة لمترجم GCC، thiscallفإنّ هذا يكاد يكون مطابقًا لما يلي cdecl: يقوم المستدعي بتنظيف المكدس، ويتم تمرير المعاملات من اليمين إلى اليسار. الفرق هو إضافة المؤشر this، الذي يُدفع إلى المكدس أخيرًا، كما لو كان المعامل الأول في نموذج الدالة .

في مُصرّف Microsoft Visual C++، thisيُمرَّر المؤشر في ECX، وتتولى الدالة المُستدعاة تنظيف المكدس، مُحاكيةً بذلك الاصطلاح stdcallالمُستخدم في لغة C لهذا المُصرّف وفي دوال واجهة برمجة تطبيقات Windows. عندما تستخدم الدوال عددًا متغيرًا من الوسائط، تتولى الدالة المُستدعِية تنظيف المكدس (انظر المرجع cdecl).

لا يمكن تحديد اصطلاح الاستدعاء thiscallصراحةً إلا في Microsoft Visual C++ 2005 والإصدارات الأحدث. أما في أي مُصرّف آخر، فإن thiscall ليست كلمة مفتاحية. (مع ذلك، يجب على برامج تفكيك التعليمات البرمجية، مثل IDA ، تحديدها. لذا، يستخدم IDA الكلمة المفتاحية __thiscall لهذا الغرض).

حفظ السجلات

جزء آخر من اتفاقية الاستدعاء هو تحديد السجلات التي يُضمن احتفاظها بقيمها بعد استدعاء روتين فرعي. يُعرف هذا السلوك باسم حفظ السجلات.

السجلات المحفوظة من قبل المتصل (المتقلبة)

وفقًا لـ Intel ABI الذي تتوافق معه الغالبية العظمى من المترجمات، يجب أن تكون EAX و EDX و ECX متاحة للاستخدام داخل إجراء أو وظيفة، ولا يلزم الاحتفاظ بها.

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

لذلك، تقع على عاتق المتصل مسؤولية دفع كل من هذه السجلات إلى المكدس، إذا كان يرغب في استعادة قيمها بعد استدعاء روتين فرعي.

السجلات المحفوظة (غير المتطايرة).

تُستخدم السجلات الأخرى للاحتفاظ بالقيم طويلة الأمد (غير المتطايرة)، والتي يجب الحفاظ عليها عبر الاستدعاءات.

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

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

اصطلاحات استدعاء x86-64

تستفيد اصطلاحات استدعاء x86-64 من مساحة السجلات الإضافية لتمرير المزيد من الوسائط في السجلات. كما تم تقليل عدد اصطلاحات الاستدعاء غير المتوافقة، حيث يوجد اصطلاحان شائعا الاستخدام.

اتفاقية استدعاء مايكروسوفت x64

يُتبع اصطلاح استدعاء Microsoft x64 [ 25 ] [ 26 ] في نظام التشغيل Windows وواجهة UEFI قبل بدء التشغيل ( للوضع الطويل على معالجات x86-64 ). تُوضع الوسائط الأربعة الأولى في السجلات. أي RCX وRDX وR8 وR9 (بهذا الترتيب) لوسائط الأعداد الصحيحة أو البُنى أو المؤشرات، وXMM0 وXMM1 وXMM2 وXMM3 لوسائط الأعداد العشرية. تُضاف الوسائط إلى المكدس (من اليمين إلى اليسار). تُعاد قيم الأعداد الصحيحة (كما في x86) في RAX إذا كانت 64 بت أو أقل. تُعاد قيم الأعداد العشرية في XMM0. لا تُضاف أصفار إلى المعاملات التي يقل طولها عن 64 بت؛ أي لا تُصفّر البتات العليا. [ 27 ]

تُمرَّر وتُعاد البنى والاتحادات ذات الأحجام المطابقة للأعداد الصحيحة كما لو كانت أعدادًا صحيحة. وإلا، تُستبدل بمؤشر عند استخدامها كوسيط. عند الحاجة إلى إرجاع بنية ذات حجم زائد، يُضاف مؤشر آخر إلى مساحة يوفرها المستدعي كوسيط أول، مما يُزيح جميع الوسائط الأخرى إلى اليمين بمقدار خانة واحدة. يصبح هذا المؤشر أيضًا قيمة الإرجاع في RAX. [ 28 ]

عند التجميع لبنية x64 في سياق Windows (سواء باستخدام أدوات Microsoft أو أدوات غير تابعة لـ Microsoft)، فإن stdcall و thiscall و cdecl و fastcall كلها تحل إلى استخدام هذا الاصطلاح.

في اصطلاح استدعاء الدوال في نظام مايكروسوفت x64، تقع على عاتق المُستدعي مسؤولية تخصيص 32 بايت من "مساحة الظل" على المكدس قبل استدعاء الدالة مباشرةً (بغض النظر عن العدد الفعلي للمعاملات المستخدمة)، وإخراج البيانات من المكدس بعد الاستدعاء. تُستخدم مساحة الظل لتخزين قيم RCX وRDX وR8 وR9، [ 29 ] ولكن يجب إتاحتها لجميع الدوال، حتى تلك التي تحتوي على أقل من أربعة معاملات.

تُعتبر السجلات RAX وRCX وRDX وR8 وR9 وR10 وR11 متغيرة (محفوظة من قبل المتصل). [ 30 ]

تعتبر السجلات RBX، وRBP، وRDI، وRSI، وRSP، وR12، وR13، وR14، وR15 غير متطايرة (محفوظة باسم callee). [ 30 ]

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

تتم محاذاة إطار المكدس إلى 16 بايت. [ 31 ]

يقوم برنامج Visual Studio 2008 بتخزين الأرقام العشرية في XMM6 و XMM7، بالإضافة إلى XMM8 حتى XMM15.

لا تستخدم اتفاقية الاستدعاء أجزاء YMM و ZMM من سجلات المتجهات لتمرير الوسائط والنتائج.

نظام V AMD64 ABI

يُتبع اصطلاح استدعاء واجهة التطبيق الثنائية (ABI) الخاصة بنظام System V AMD64 في أنظمة Solaris و Linux و FreeBSD و macOS ، [ 32 ] وهو المعيار الفعلي بين أنظمة التشغيل Unix والأنظمة الشبيهة بـ Unix. يعتمد معيار استدعاء OpenVMS على معمارية x86-64 على واجهة التطبيق الثنائية (ABI) الخاصة بنظام System V مع بعض الإضافات اللازمة للتوافق مع الإصدارات السابقة. [ 33 ]

تُمرَّر الوسائط الستة الأولى، سواءً كانت أعدادًا صحيحة أو مؤشرات، في المسجلات RDI وRSI وRDX وRCX وR8 وR9 (يُستخدم R10 كمؤشر سلسلة ثابت في حالة الدوال المتداخلة [ 34 ] : 21 )، بينما تُستخدم المسجلات XMM0 وXMM1 وXMM2 وXMM3 وXMM4 وXMM5 وXMM6 وXMM7 للوسائط العشرية الأولى. [ 34 ] : 22 وكما هو الحال في اصطلاح استدعاء Microsoft x64، تُمرَّر الوسائط المُضافة عبر المكدس. [ 34 ] : 22 تُخزَّن قيم الإرجاع الصحيحة التي يصل حجمها إلى 64 بت في RAX، بينما تُخزَّن القيم التي يصل حجمها إلى 128 بت في RAX وRDX. وبالمثل، تُخزَّن قيم الإرجاع العشرية في XMM0 وXMM1. [ 34 ] : 25 تُستخدم المسجلات الأوسع YMM وZMM لتمرير وإرجاع قيم أوسع بدلاً من XMM عند وجودها. [ 34 ] : 26، 55

تُقسّم معلمات البنية والاتحاد التي يبلغ حجمها مؤشرين (ثمانية في حالة حقول SSE فقط) أو أقل، والمُحاذية لحدود 64 بت، إلى "ثمانية بايتات"، ويُصنّف كل منها ويُمرّر كمعلمة منفصلة، ​​طالما توفرت سجلات كافية. [ 34 ] : 24 وإلا، تُمرّر في الذاكرة. تُعاد أنواع إرجاع البنية والاتحاد التي يبلغ حجمها مؤشرين أو أقل في RAX وRDX (أو XMM0 وXMM1). عند الحاجة إلى إرجاع بنية كبيرة الحجم، يُضاف مؤشر آخر إلى مساحة يُحددها المُستدعي كمعامل أول، مما يُزيح جميع المعاملات الأخرى إلى اليمين بمقدار خانة واحدة، وتُعاد قيمة هذا المؤشر في RAX. [ 34 ] : 27

إذا رغب المستدعى في استخدام السجلات RBX وRSP وRBP وR12-R15، فعليه استعادة قيمها الأصلية قبل إعادة التحكم إلى المستدعي. أما السجلات الأخرى، فيجب على المستدعي حفظها إذا رغب في الاحتفاظ بقيمها. [ 34 ] : 16

بالنسبة لدوال العقدة الطرفية (الدوال التي لا تستدعي أي دوال أخرى)، تُخزَّن مساحة بحجم 128 بايت أسفل مؤشر مكدس الدالة مباشرةً. تُسمى هذه المساحة " المنطقة الحمراء" . لن تُستبدل هذه المنطقة بواسطة أي معالجات إشارات أو مقاطعات. بالتالي، يمكن للمترجمات استخدام هذه المنطقة لحفظ المتغيرات المحلية. قد تُهمل المترجمات بعض التعليمات في بداية الدالة (مثل ضبط RSP وRBP) باستخدام هذه المنطقة. مع ذلك، قد تستبدل دوال أخرى هذه المنطقة. لذا، ينبغي استخدام هذه المنطقة فقط لدوال العقدة الطرفية، gccمع clangتوفير -mno-red-zoneخيار لتعطيل تحسينات المنطقة الحمراء.

إذا كانت الدالة المستدعاة دالة متغيرة الوسائط ، فيجب على المستدعي توفير عدد وسائط الفاصلة العائمة التي تم تمريرها إلى الدالة في سجلات المتجهات في سجل AL. [ 34 ] : 55

يتم محاذاة إطار المكدس افتراضيًا إلى حد 16 بايت. إذا __m256تم تمرير نوع (AVX) على المكدس، فيجب محاذاته إلى 32 بايت؛ وإذا __m512تم تمرير نوع (AVX512)، فيجب محاذاته إلى 64 بايت. [ 34 ] : 22

بخلاف اصطلاح استدعاء مايكروسوفت، لا يتم توفير مساحة ظل؛ عند دخول الدالة، يكون عنوان الإرجاع مجاورًا للوسيط الصحيح السابع على المكدس.

اصطلاحات استدعاء خاصة بنظام x64

  • ابتداءً من Visual Studio 2013، قدمت مايكروسوفت اصطلاح استدعاء __vectorcall ، الذي يُعد امتدادًا لاصطلاح x64. للاطلاع على وصف كامل، راجع قسم Microsoft vectorcall أعلاه. 
  • سجل إنتل (انظر أعلاه).

قائمة اصطلاحات استدعاء x86

هذه قائمة باتفاقيات استدعاء x86. [ 1 ] هذه الاتفاقيات مخصصة في المقام الأول لمترجمات C/C++ (وخاصة الجزء المتعلق بـ 64 بت أدناه)، وبالتالي فهي حالات خاصة إلى حد كبير. قد تستخدم لغات أخرى تنسيقات واتفاقيات مختلفة في تطبيقاتها.

العمارة​اسمنظام التشغيل، المترجمحدودتنظيف الأكوامملحوظات
السجلاتترتيب التكديس
8086cdeclRTL (C)المتصل
باسكالمن اليسار إلى اليمين (باسكال)كالي
مكالمة سريعة (لغير الأعضاء)مايكروسوفتAX، DX، BXمن اليسار إلى اليمين (باسكال)كاليإرجاع المؤشر في BX.
استدعاء سريع (دالة عضوية)مايكروسوفتAX، DXمن اليسار إلى اليمين (باسكال)كاليthisعلى عنوان منخفض في المكدس. أعد المؤشر في AX.
مكالمة سريعةTurbo C [ 35 ]AX، DX، BXمن اليسار إلى اليمين (باسكال)كاليthisعند العنوان الأدنى في المكدس. يتم إرجاع المؤشر عند العنوان الأعلى في المكدس.
مكالمة هاتفيةواتكومAX، DX، BX، CXRTL (C)المتصل [ 23 ]إرجاع المؤشر في SI.
IA-32cdeclشبيهة بنظام يونكس ( GCC )RTL (C)المتصلعند إرجاع بنية/فئة، يقوم الكود المُستدعي بتخصيص مساحة وتمرير مؤشر إلى هذه المساحة عبر مُعامل مخفي على المكدس. تقوم الدالة المُستدعاة بكتابة القيمة المُعادة إلى هذا العنوان.

تمت محاذاة المكدس على حدود 16 بايت بسبب تغيير في GCC.

cdeclمايكروسوفتRTL (C)المتصلعند إرجاع بنية/فئة،
  • يتم تخزين قيم الإرجاع للبيانات القديمة البسيطة (POD) التي يبلغ حجمها 32 بت أو أقل في سجل EAX.
  • يتم إرجاع قيم POD التي يتراوح حجمها بين 33 و 64 بت عبر سجلات EAX:EDX.
  • في حال كانت القيم المُعادة غير مُتوافقة مع معيار POD أو أكبر من 64 بت، سيقوم الكود المُستدعي بتخصيص مساحة وتمرير مؤشر إلى هذه المساحة عبر مُعامل مخفي في المكدس. تقوم الدالة المُستدعاة بكتابة القيمة المُعادة إلى هذا العنوان.

تمت محاذاة المكدس على حدود 4 بايت.

مكالمة قياسيةمايكروسوفتRTL (C)كاليمدعوم أيضاً من قبل مجلس التعاون الخليجي.
مكالمة سريعةمايكروسوفتECX، EDXRTL (C)كاليتُعيد هذه الدالة مؤشرًا إلى المكدس إذا لم تكن دالة عضوية. وهي مدعومة أيضًا من قِبل GCC.
يسجلدلفي ، فري باسكال ، لينكس [ 36 ]EAX، EDX، ECXمن اليسار إلى اليمين (باسكال)كالي
هذه المكالمةويندوز ( مايكروسوفت فيجوال سي++ )بورصة السلع الأوروبية (ECX)RTL (C)كاليالوضع الافتراضي للدوال الأعضاء.
استدعاء المتجهويندوز ( مايكروسوفت فيجوال سي++ )ECX، EDX، [XY]MM0–5 RTL (C)كاليتم تطويره من fastcall. وهو مدعوم أيضًا بواسطة ICC و Clang. [ 11 ]
مكالمة هاتفيةواتكومEAX، EDX، EBX، ECXRTL (C)المتصل [ 23 ]إرجاع المؤشر في ESI.
x86-64اتفاقية استدعاء مايكروسوفت x64 [ 25 ]ويندوز ( مايكروسوفت فيجوال سي++ ، جي سي سي ، إنتل سي++ كومبلر ، دلفييو إي إف آيRCX/XMM0، RDX/XMM1، R8/XMM2، R9/XMM3RTL (C)المتصلتتم محاذاة المكدس على 16 بايت. مساحة الظل على المكدس 32 بايت. لا يمكن استخدام السجلات الثمانية المحددة إلا للمعاملات من 1 إلى 4. بالنسبة لأساليب فئة C++، thisيكون المعامل المخفي هو المعامل الأول، ويتم تمريره في RCX. [ 37 ]
استدعاء المتجهويندوز ( مايكروسوفت فيجوال سي++ ، كلانج، آي سي سي)RCX/[XY]MM0، RDX/[XY]MM1، R8/[XY]MM2، R9/[XY]MM3 + [XY]MM4–5RTL (C)المتصلتم توسيعه من MS x64. [ 11 ]
System V AMD64 ABI [ 34 ]Solaris ، Linux ، [ 38 ] BSD ، macOS ، OpenVMS ( GCC ، Intel C++ Compiler ، Clang ، Delphi )RDI، RSI، RDX، RCX، R8، R9، [XYZ] MM0–7RTL (C)المتصلتمت محاذاة المكدس على حدود 16 بايت. توجد منطقة حمراء بطول 128 بايت أسفل المكدس. تستخدم واجهة النواة RDI وRSI وRDX وR10 وR8 وR9. بالنسبة لأساليب فئات C++، thisيكون المعامل المخفي هو المعامل الأول الذي يتم تمريره في RDI.
regcallويندوز، لينكس (كلانغ، ICC)RAX، RCX، RDX، RDI، RSI، R8، R9، R10، R11، R12، R14، R15 + [XYZ]MM0-15 + R10 على نظام لينكسRTL (C)المتصليستخدم أكبر عدد ممكن من السجلات لتمرير المعاملات وإرجاع القيم. [ 13 ]

ملحوظة:

  • تستطيع لغات البرمجة GCC و clang، وإلى حد أقل ICC، استخدام أي اصطلاح استدعاء على أي منصة إذا طُلب منها ذلك باستخدام سمات مثل ms_abiو sysv_abiو fastcall. [ 12 ] [ 13 ] وهذا مفيد في بناء برامج تتجاوز حدود واجهة التطبيق الثنائية (ABI) مثل Wine .

مراجع

الحواشي

  1. 1 2 3 4 5 فوغ، أغنر (2010-02-16). اصطلاحات الاستدعاء لمترجمات لغة C++ المختلفة وأنظمة التشغيل (ملف PDF) .
  2. بولارد، جوناثان دي بوين (2010). "دليل عام حول اصطلاحات استدعاء الدوال" . إجابات شائعة .
  3. "System V Application Binary Interface: Intel 386 Architecture Processor Supplement" (PDF) (الطبعة الرابعة ). 
  4. "GCC Bugzilla – Bug 40838 - gcc should not assume that the stack is aligned" . 2009.
  5. "__stdcall (C++)" . MSDN . مايكروسوفت. مؤرشف من الأصل بتاريخ 10 أبريل 2008. تم الاطلاع عليه بتاريخ 13 فبراير 2019 .
  6. "__fastcall" . MSDN . تم الاطلاع عليه بتاريخ 26-09-2013 .
  7. أوهسي، أوفه. "نظرة عامة على سمات gcc: الدالة fastcall" . ohse.de. تم الاطلاع عليه بتاريخ 27-09-2010 .
  8. "السمات في Clang: fastcall" . وثائق Clang . 2022. تم الاطلاع عليه بتاريخ 15 ديسمبر 2022 .
  9. باتوكا، ميكولاس (11 أغسطس 2009). "اتفاقية الاتصال السريع غير متوافقة مع نظام التشغيل ويندوز" . تم الاطلاع عليه بتاريخ 15 ديسمبر 2022 .
  10. "تقديم 'اتفاقية استدعاء المتجهات'"" . MSDN. 11 يوليو 2013. تم الاسترجاع في 31 ديسمبر 2014 .
  11. 1 2 3 4 "__vectorcall" . MSDN . تم الاطلاع عليه بتاريخ 31-12-2014 .
  12. 1 2 3 4 5 "السمات في Clang: vectorcall" . وثائق Clang . 2022. تم الاطلاع عليه بتاريخ 15 ديسمبر 2022 .
  13. 1 2 3 "اتفاقيات استدعاء C/C++" . 16 ديسمبر 2022. تم الاطلاع عليه في 15 ديسمبر 2022 .
  14. "تبسيط فهم _vectorcall و __regcall" (ملف PDF) . software.intel.com . 7 يونيو 2017.
  15. "واجهة التطبيق الثنائية لوظيفة المتجهات، الإصدار 0.9.8" . 6 أبريل 2016.
  16. "libmvec" . sourceware.org .(انظر VectorABI.txt)
  17. "سمات وظائف x86 (باستخدام مجموعة مترجمات GNU (GCC))" . gcc.gnu.org .
  18. "التحكم في البرنامج: اصطلاح التسجيل" . docwiki.embarcadero.com. 2010-06-01 . تم الاطلاع عليه بتاريخ 2010-09-27 .
  19. "_fastcall, __fastcall" . docwiki.embarcadero.com.
  20. "__msfastcall" . docwiki.embarcadero.com.
  21. "سمات وظائف x86" . استخدام مجموعة مترجمات GNU (GCC) .
  22. "i386: قم دائمًا بتمكين regparm" .
  23. 1 2 3 "دليل مستخدم Open Watcom 2.0 C/C++" . open-watcom.github.io . تم ​​الاطلاع عليه بتاريخ 27-06-2026 .
  24. "اتفاقيات_الاستدعاء: تحديد_اتفاقيات_الاستدعاء_على_طريقة_واتكوم" . openwatcom.org. 27-04-2010. مؤرشف من الأصل في 08-03-2021 . تم الاطلاع عليه في 31-08-2018 .
  25. 1 2 "اتفاقيات برامج x64: اتفاقيات الاستدعاء" . msdn.microsoft.com. 2010. تم الاسترجاع في 27-09-2010 .
  26. "معمارية x64" . msdn.microsoft.com. 6 يناير 2023.
  27. "اتفاقية استدعاء x64: تمرير المعلمات" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 24-06-2026 .
  28. "اتفاقية استدعاء x64: قيم الإرجاع" . docs.microsoft.com . تم الاطلاع عليه بتاريخ 17 يناير 2020 .
  29. "اتفاقيات برامج x64 - تخصيص المكدس" . مايكروسوفت . تم الاسترجاع في 31-03-2010 .
  30. 1 2 "سجلات المتصل/المتصل به المحفوظة" . مستندات مايكروسوفت . مايكروسوفت. 18 مايو 2022.
  31. "استخدام حزمة x64" . learn.microsoft.com .
  32. "نموذج كود x86-64" . مكتبة مطوري ماك . شركة آبل. مؤرشف من الأصل بتاريخ 10 مارس 2016. تم الاطلاع عليه بتاريخ 6 أبريل 2016. بيئة x86-64 في نظام التشغيل OS X تحتوي على نموذج كود واحد فقط لكود مساحة المستخدم. وهو مشابه جدًا لنموذج PIC الصغير المحدد بواسطة واجهة التطبيق الثنائية x86-64 System V.
  33. "معيار استدعاء VSI OpenVMS" (ملف PDF) . vmssoftware.com . مايو 2020. تاريخ الاسترجاع: 21 ديسمبر 2020 .
  34. 1 2 3 4 5 6 7 8 9 10 11 لو، هـ. ج.؛ ماتز، مايكل؛ جيركار، ميليند؛ هوبيتشكا، يان؛ ياغر، أندرياس؛ ميتشل، مارك، محررون. (23-05-2023). "واجهة التطبيق الثنائية للنظام الخامس: ملحق معالج بنية AMD64 (مع نماذج برمجة LP64 وILP32) الإصدار 1.0" (ملف PDF) . جيت لاب . 1.0.
  35. دليل مستخدم Borland C/C++ الإصدار 3.1 (PDF) . Borland. 1992. الصفحات 158، 189-191 . 
  36. "اتفاقيات استدعاء لينكس 32 بت" . تم الاطلاع عليه بتاريخ 22 أبريل 2024 .
  37. "تسجيل الاستخدام" . مستندات مايكروسوفت . مايكروسوفت. مؤرشف من الأصل في 15 سبتمبر 2017. تم الاسترجاع في 15 سبتمبر 2017 .
  38. "اتفاقيات استدعاء لينكس 64 بت" . تم الاطلاع عليه بتاريخ 22 أبريل 2024 .

مصادر أخرى

للمزيد من القراءة

  • دي بوين بولارد، جوناثان (2010). "الأساسيات حول اصطلاحات استدعاء الدوال" . إجابات شائعة .
  • إيرفين، كيب ر. (2011). "الإجراءات المتقدمة (الفصل 8)". لغة التجميع لمعالجات x86 (  الطبعة السادسة). برنتيس هول. ISBN 978-0-13-602212-1.
  • دليل مستخدم Borland C/C++ الإصدار 3.1 (PDF) . Borland. 1992. الصفحات 158، 189-191 .
  • لاور، توماس (1995). "تسلسل استدعاء __stdcall الجديد". نقل التطبيقات إلى Win32: دليل لجعل تطبيقاتك جاهزة لمستقبل ويندوز ذي 32 بت . سبرينغر. ISBN 978-0-387-94572-9.