कार्य प्रस्तावना और उपसंहार
सभा की भाषा कंप्यूटर प्रोग्रामिंग में, फ़ंक्शन प्रोलॉग किसी फ़ंक्शन की शुरुआत में कोड की कुछ पंक्तियाँ होती हैं, जो फ़ंक्शन के भीतर उपयोग के लिए कॉल स्टैक और प्रोसेसर रजिस्टर तैयार करती हैं। इसी प्रकार, फ़ंक्शन उपसंहार फ़ंक्शन के अंत में दिखाई देता है, और स्टैक और रजिस्टरों को उस स्थिति में पुनर्स्थापित करता है जिसमें वे फ़ंक्शन को कॉल करने से पहले थे।
प्रस्तावना और उपसंहार असेंबली भाषा का हिस्सा नहीं हैं; वे असेंबली भाषा प्रोग्रामर और कई उच्च-स्तरीय प्रोग्रामिंग भाषा के संकलक ों द्वारा उपयोग किए जाने वाले सम्मेलन का प्रतिनिधित्व करते हैं। वे काफी कठोर हैं, प्रत्येक कार्य में उनका रूप समान है।
फ़ंक्शन प्रस्तावना और उपसंहार में कभी-कभी बफर अतिप्रवाह सुरक्षा के लिए कोड भी होता है।
प्रस्तावना
यदि आर्किटेक्चर में बेस पॉइंटर (जिसे फ्रेम पॉइंटर भी कहा जाता है) और स्टैक पॉइंटर होता है तो एक फ़ंक्शन प्रस्तावना आम तौर पर निम्नलिखित क्रियाएं करती है:
- वर्तमान बेस पॉइंटर को स्टैक पर धकेलता है, ताकि इसे बाद में पुनर्स्थापित किया जा सके।
- बेस पॉइंटर का मान स्टैक पॉइंटर के पते पर सेट किया जाता है (जो स्टैक के शीर्ष पर इंगित किया जाता है) ताकि बेस पॉइंटर स्टैक के शीर्ष पर इंगित हो।
- स्टैक पॉइंटर को उसके मान को घटाकर या बढ़ाकर आगे ले जाता है, यह इस बात पर निर्भर करता है कि स्टैक नीचे बढ़ता है या ऊपर। x86 पर, फ़ंक्शन के स्थानीय चर के लिए जगह बनाने के लिए स्टैक पॉइंटर को कम किया जाता है।
कई संभावित प्रस्तावनाएं लिखी जा सकती हैं, जिसके परिणामस्वरूप थोड़ा अलग स्टैक कॉन्फ़िगरेशन हो सकता है। ये अंतर स्वीकार्य हैं, जब तक प्रोग्रामर या कंपाइलर फ़ंक्शन के अंदर स्टैक का सही तरीके से उपयोग करता है।
उदाहरण के तौर पर, यहां जीएनयू कंपाइलर संग्रह द्वारा निर्मित एक विशिष्ट x86 असेंबली भाषा फ़ंक्शन प्रस्तावना है
push ebp
mov ebp, esp
sub esp, N
एन तत्काल मूल्य स्थानीय उपयोग के लिए स्टैक पर आरक्षित बाइट्स की संख्या है।
का उपयोग करके समान परिणाम प्राप्त किया जा सकता है enter
अनुदेश:
enter N, 0
के दूसरे ऑपरेंड के लिए विभिन्न मानों (0 के अलावा) का उपयोग करके अधिक जटिल प्रस्तावनाएँ प्राप्त की जा सकती हैं enter
अनुदेश. ये प्रस्तावनाएं नेस्टेड फ़ंक्शन की अनुमति देने के लिए कई आधार/फ़्रेम पॉइंटर्स को आगे बढ़ाती हैं, जैसा कि पास्कल प्रोग्रामिंग भाषा जैसी भाषाओं के लिए आवश्यक है। हालाँकि, इन भाषाओं के आधुनिक संस्करण इन निर्देशों का उपयोग नहीं करते हैं क्योंकि वे कुछ मामलों में घोंसले की गहराई को सीमित करते हैं।[citation needed]
उपसंहार
फ़ंक्शन उपसंहार फ़ंक्शन प्रस्तावना की क्रियाओं को उलट देता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटा देता है। यह आम तौर पर निम्नलिखित क्रियाएं करता है (यह प्रक्रिया एक आर्किटेक्चर से दूसरे आर्किटेक्चर में भिन्न हो सकती है):
- स्टैक पॉइंटर को वर्तमान बेस पॉइंटर पर छोड़ें, ताकि स्थानीय चर के लिए प्रस्तावना में आरक्षित स्थान खाली हो जाए।
- बेस पॉइंटर को स्टैक से हटा देता है, ताकि इसे प्रस्तावना से पहले उसके मान पर पुनर्स्थापित किया जा सके।
- पिछले फ्रेम के प्रोग्राम काउंटर को स्टैक से हटाकर और उस पर कूदकर, कॉलिंग फ़ंक्शन पर वापस लौटता है।
दिया गया उपसंहार उपरोक्त प्रस्तावनाओं में से किसी एक के प्रभाव को उलट देगा (या तो पूर्ण प्रस्तावना, या जो उपयोग करता है) enter
). कुछ कॉलिंग परंपराओं के तहत स्टैक से तर्कों को साफ़ करना कैली की ज़िम्मेदारी है, इसलिए उपसंहार में स्टैक पॉइंटर को नीचे या ऊपर ले जाने का चरण भी शामिल हो सकता है।
उदाहरण के लिए, इन तीन चरणों को निम्नलिखित निर्देशों द्वारा 32-बिट x86 असेंबली भाषा में पूरा किया जा सकता है:
mov esp, ebp
pop ebp
ret
प्रस्तावना की तरह, x86 प्रोसेसर में एक अंतर्निहित निर्देश होता है जो उपसंहार का भाग निष्पादित करता है। निम्नलिखित कोड उपरोक्त कोड के बराबर है:
leave
ret
leave
ई> निर्देश निष्पादित करता हैmov
औरpop
निर्देश, जैसा कि ऊपर बताया गया है।
एक फ़ंक्शन में कई उपसंहार हो सकते हैं। प्रत्येक फ़ंक्शन निकास बिंदु को या तो अंत में एक सामान्य उपसंहार पर जाना चाहिए, या उसमें अपना स्वयं का उपसंहार होना चाहिए। इसलिए, प्रोग्रामर या कंपाइलर अक्सर इसके संयोजन का उपयोग करते हैं leave
और ret
किसी भी बिंदु पर फ़ंक्शन से बाहर निकलने के लिए। (उदाहरण के लिए, एक C (प्रोग्रामिंग भाषा) कंपाइलर a को प्रतिस्थापित करेगा return
एक के साथ बयान leave
/ret
अनुक्रम)।
अग्रिम पठन
- de Boyne Pollard, Jonathan (2010). "The gen on function perilogues". Frequently Given Answers.