मैं एक दूसरे उत्तर को जोड़ूंगा, जिसमें हुई कुछ स्पर्शरेखा चर्चाओं को संबोधित करने के लिए।
सी एबीआई (एप्लिकेशन बाइनरी इंटरफ़ेस) मूल रूप से रिवर्स ऑर्डर में स्टैक पर तर्क पारित करने के लिए कहा जाता है (यानी - दाएं से बाएं धक्का दिया जाता है), जहां कॉलर स्टैक स्टोरेज को भी मुक्त करता है। आधुनिक एबीआई वास्तव में तर्कों को पारित करने के लिए रजिस्टरों का उपयोग करता है, लेकिन कई मनमौजी विचार उस मूल स्टैक तर्क को पारित करते हैं।
इसके विपरीत, मूल पास्कल एबीआई ने तर्कों को बाएं से दाएं की ओर धकेल दिया, और कैली को तर्कों को पॉप करना पड़ा। मूल सी एबीआई दो महत्वपूर्ण बिंदुओं में मूल पास्कल एबीआई से बेहतर है। तर्क धक्का आदेश का अर्थ है कि पहले तर्क की स्टैक ऑफ़सेट को हमेशा ज्ञात किया जाता है, जिससे ऐसे कार्यों की अनुमति होती है जिनके पास अज्ञात संख्या में तर्क होते हैं, जहां शुरुआती तर्क यह नियंत्रित करते हैं कि अन्य तर्क कितने हैंprintf
)।
दूसरा तरीका जिसमें सी एबीआई बेहतर है, कॉल करने वाले और कैली के मामले में व्यवहार कितने बेहतर हैं, इस पर सहमत नहीं हैं। सी मामले में, जब तक आप वास्तव में पिछले एक के तर्कों का उपयोग नहीं करते हैं, तब तक कुछ भी बुरा नहीं होता है। पास्कल में, गलत तर्कों को ढेर से पॉप किया जाता है, और पूरे स्टैक को दूषित किया जाता है।
मूल विंडोज 3.1 एबीआई पास्कल पर आधारित था। जैसे, इसने पास्कल एबीआई (बाएं से दाएं क्रम में, कैली पोप) में तर्क का इस्तेमाल किया। चूंकि तर्क संख्या में कोई भी बेमेल भ्रष्टाचार को रोकने के लिए नेतृत्व कर सकता है, एक प्रबंध योजना बनाई गई थी। प्रत्येक फ़ंक्शन नाम को उसके तर्कों के आकार, बाइट्स में इंगित करने वाली संख्या के साथ जोड़ दिया गया था। तो, 16 बिट मशीन पर, निम्न फ़ंक्शन (C सिंटैक्स):
int function(int a)
के लिए मंगाई गई थी function@2
, क्योंकिint
दो बाइट्स चौड़ी हैं। यह इसलिए किया गया था कि यदि घोषणा और परिभाषा बेमेल हो जाती है, तो लिंकर रन टाइम पर स्टैक को भ्रष्ट करने के बजाय फ़ंक्शन को खोजने में विफल हो जाएगा। इसके विपरीत, यदि प्रोग्राम लिंक करता है, तो आप सुनिश्चित कर सकते हैं कि कॉल के अंत में बाइट्स की सही संख्या स्टैक से पॉप हो।
32 बिट विंडोज और इसके बाद stdcall
एबीआई का उपयोग करें । यह पास्कल एबीआई के समान है, सिवाय पुश ऑर्डर सी की तरह है, दाएं से बाएं। पास्कल एबीआई की तरह, नामकरण करने वाला नाम ढेर भ्रष्टाचार से बचने के लिए फ़ंक्शन नाम में तर्क बाइट का आकार देता है।
यहां कहीं और किए गए दावों के विपरीत, सी एबीआई विजुअल स्टूडियो पर भी फ़ंक्शन के नाम को नहीं जोड़ता है। इसके विपरीत, stdcall
एबीआई विनिर्देश के साथ सजाए गए कार्यों को वीएस के लिए अद्वितीय नहीं है। लिनक्स के लिए संकलन करते समय भी GCC इस ABI का समर्थन करता है। यह शराब द्वारा बड़े पैमाने पर उपयोग किया जाता है , यह लिनक्स लोड किए गए बायनेरिज़ को विंडोज़ संकलित DLLs से जोड़ने की अनुमति देने के लिए रन लोडर का उपयोग करता है।