कार्य प्रस्तावना और उपसंहार: Difference between revisions
No edit summary |
No edit summary |
||
Line 6: | Line 6: | ||
==प्रोलॉग== | ==प्रोलॉग== | ||
यदि आर्किटेक्चर में बेस पॉइंटर (जिसे फ्रेम पॉइंटर भी कहा जाता है) और स्टैक पॉइंटर होता है तो | यदि आर्किटेक्चर में बेस पॉइंटर (जिसे फ्रेम पॉइंटर भी कहा जाता है) और स्टैक पॉइंटर होता है तो फ़ंक्शन प्रोलॉग सामान्यतः निम्नलिखित क्रियाएं करती है: | ||
*वर्तमान बेस पॉइंटर को स्टैक पर बल देता है, जिससे इसे पश्चात् में पुनर्स्थापित किया जा सकता है। | *वर्तमान बेस पॉइंटर को स्टैक पर बल देता है, जिससे इसे पश्चात् में पुनर्स्थापित किया जा सकता है। | ||
*बेस पॉइंटर का मान स्टैक पॉइंटर के पते पर सेट किया जाता है (जो स्टैक के शीर्ष पर संकेत किया जाता है) जिससे बेस पॉइंटर स्टैक के शीर्ष पर संकेत होता है। | *बेस पॉइंटर का मान स्टैक पॉइंटर के पते पर सेट किया जाता है (जो स्टैक के शीर्ष पर संकेत किया जाता है) जिससे बेस पॉइंटर स्टैक के शीर्ष पर संकेत होता है। | ||
Line 13: | Line 13: | ||
अनेक संभावित प्रोलॉग लिखी जा सकती हैं, जिसके परिणामस्वरूप थोड़ा अलग स्टैक कॉन्फ़िगरेशन हो सकता है। यह अंतर स्वीकार्य हैं, जब तक प्रोग्रामर या कंपाइलर फ़ंक्शन के अंदर स्टैक का सही विधि से उपयोग करता है। | अनेक संभावित प्रोलॉग लिखी जा सकती हैं, जिसके परिणामस्वरूप थोड़ा अलग स्टैक कॉन्फ़िगरेशन हो सकता है। यह अंतर स्वीकार्य हैं, जब तक प्रोग्रामर या कंपाइलर फ़ंक्शन के अंदर स्टैक का सही विधि से उपयोग करता है। | ||
उदाहरण के तौर पर, यहां [[जीएनयू कंपाइलर संग्रह|जीएनयू कंपाइलर स्टोर]] द्वारा निर्मित | उदाहरण के तौर पर, यहां [[जीएनयू कंपाइलर संग्रह|जीएनयू कंपाइलर स्टोर]] द्वारा निर्मित विशिष्ट [[x86 असेंबली भाषा|x86 असेंबली]] लैंग्वेज फ़ंक्शन प्रोलॉग है | ||
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> | ||
push ebp | push ebp | ||
Line 25: | Line 25: | ||
enter N, 0 | enter N, 0 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<code>enter</code> अनुदेश के दूसरे ऑपरेंड के लिए विभिन्न मानों (0 के अतिरिक्त) का उपयोग करके अधिक काम्प्लेक्स प्रोलॉग प्राप्त की जा सकती हैं . यह प्रोलॉग [[नेस्टेड फ़ंक्शन]] की अनुमति देने के लिए अनेक आधार/फ़्रेम पॉइंटर्स को आगे बढ़ाती हैं, जैसा कि [[पास्कल प्रोग्रामिंग भाषा|पास्कल प्रोग्रामिंग]] लैंग्वेज जैसी लैंग्वेज के लिए आवश्यक है। चूँकि, इन लैंग्वेज के आधुनिक संस्करण इन निर्देशों का उपयोग नहीं करते हैं क्योंकि वह कुछ स्थितियों में नेस्टिंग डेप्थ को सीमित करते हैं। | <code>enter</code> अनुदेश के दूसरे ऑपरेंड के लिए विभिन्न मानों (0 के अतिरिक्त) का उपयोग करके अधिक काम्प्लेक्स प्रोलॉग प्राप्त की जा सकती हैं . यह प्रोलॉग [[नेस्टेड फ़ंक्शन]] की अनुमति देने के लिए अनेक आधार/फ़्रेम पॉइंटर्स को आगे बढ़ाती हैं, जैसा कि [[पास्कल प्रोग्रामिंग भाषा|पास्कल प्रोग्रामिंग]] लैंग्वेज जैसी लैंग्वेज के लिए आवश्यक है। चूँकि, इन लैंग्वेज के आधुनिक संस्करण इन निर्देशों का उपयोग नहीं करते हैं क्योंकि वह कुछ स्थितियों में नेस्टिंग डेप्थ को सीमित करते हैं। | ||
==एपीलॉग== | ==एपीलॉग== | ||
फ़ंक्शन एपीलॉग फ़ंक्शन प्रोलॉग की क्रियाओं को परिवर्तित कर देता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटा देता है। यह सामान्यतः निम्नलिखित क्रियाएं करता है (यह प्रक्रिया | फ़ंक्शन एपीलॉग फ़ंक्शन प्रोलॉग की क्रियाओं को परिवर्तित कर देता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटा देता है। यह सामान्यतः निम्नलिखित क्रियाएं करता है (यह प्रक्रिया आर्किटेक्चर से दूसरे आर्किटेक्चर में भिन्न हो सकती है): | ||
*स्टैक पॉइंटर को वर्तमान बेस पॉइंटर पर छोड़ें, जिससे स्थानीय वैरिएबल के लिए प्रोलॉग में आरक्षित स्थान रिक्त हो जाते है। | *स्टैक पॉइंटर को वर्तमान बेस पॉइंटर पर छोड़ें, जिससे स्थानीय वैरिएबल के लिए प्रोलॉग में आरक्षित स्थान रिक्त हो जाते है। | ||
*बेस पॉइंटर को स्टैक से हटा देता है, जिससे इसे प्रोलॉग से पहले उसके मान पर पुनर्स्थापित किया जा सकता है। | *बेस पॉइंटर को स्टैक से हटा देता है, जिससे इसे प्रोलॉग से पहले उसके मान पर पुनर्स्थापित किया जा सकता है। | ||
*पिछले फ्रेम के प्रोग्राम काउंटर को स्टैक से हटाकर और जम्पिंग करके, कॉलिंग फ़ंक्शन पर वापस लौटता है। | *पिछले फ्रेम के प्रोग्राम काउंटर को स्टैक से हटाकर और जम्पिंग करके, कॉलिंग फ़ंक्शन पर वापस लौटता है। | ||
दिया गया एपीलॉग उपरोक्त प्रोलॉगओं में से किसी | दिया गया एपीलॉग उपरोक्त प्रोलॉगओं में से किसी के प्रभाव को परिवर्तित कर देगा (या तो पूर्ण प्रोलॉग, या जो <code>enter</code> उपयोग करता है). कुछ कॉलिंग परंपराओं के अनुसार स्टैक से लॉजिक को साफ़ करना कैली का दायित्व है, इसलिए एपीलॉग में स्टैक पॉइंटर को नीचे या ऊपर ले जाने का फेज भी सम्मिलित हो सकता है। | ||
उदाहरण के लिए, इन तीन फेज | उदाहरण के लिए, इन तीन फेज को निम्नलिखित निर्देशों द्वारा 32-बिट x86 असेंबली लैंग्वेज में पूरा किया जा सकता है: | ||
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> | ||
mov esp, ebp | mov esp, ebp | ||
Line 41: | Line 41: | ||
ret | ret | ||
</syntaxhighlight> | </syntaxhighlight> | ||
प्रोलॉग की तरह, x[[86]] प्रोसेसर में | प्रोलॉग की तरह, x[[86]] प्रोसेसर में अंतर्निहित निर्देश होता है जो एपीलॉग का भाग निष्पादित करता है। निम्नलिखित कोड उपरोक्त कोड के समान है: | ||
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> | ||
leave | leave | ||
ret | ret | ||
</syntaxhighlight> | </syntaxhighlight> | ||
जैसा कि ऊपर बताया गया है, <code>leave</code> निर्देश <code>mov</code> और <code>pop</code> निर्देश निष्पादित करता है। | जैसा कि ऊपर बताया गया है, <code>leave</code> निर्देश <code>mov</code> और <code>pop</code> निर्देश निष्पादित करता है। | ||
एक फ़ंक्शन में अनेक एपीलॉग हो सकते हैं। प्रत्येक फ़ंक्शन निकास बिंदु को या तो अंत में | एक फ़ंक्शन में अनेक एपीलॉग हो सकते हैं। प्रत्येक फ़ंक्शन निकास बिंदु को या तो अंत में सामान्य एपीलॉग पर जाना चाहिए, या उसमें अपना स्वयं का एपीलॉग होना चाहिए। इसलिए, प्रोग्रामर या कंपाइलर अधिकांशतः इसके संयोजन <code>leave</code> और <code>ret</code> का उपयोग करते हैं किसी भी बिंदु पर फ़ंक्शन से बाहर निकलने के लिए। (उदाहरण के लिए, C कंपाइलर <code>return</code> स्टेटमेंट को <code>leave</code>/<code>ret</code> अनुक्रम के साथ प्रतिस्थापित करेगा)। | ||
== अग्रिम पठन == | == अग्रिम पठन == |
Revision as of 17:05, 8 August 2023
असेंबली कंप्यूटर प्रोग्रामिंग में, फ़ंक्शन प्रोलॉग किसी फ़ंक्शन की प्रारंभ में कोड की कुछ पंक्तियाँ होती हैं, जो फ़ंक्शन के अन्दर उपयोग के लिए कॉल स्टैक और प्रोसेसर रजिस्टर तैयार करती हैं। इसी प्रकार, फ़ंक्शन एपीलॉग फ़ंक्शन के अंत में दिखाई देता है, और स्टैक और रजिस्टरों को उस स्थिति में पुनर्स्थापित करता है जिसमें वह फ़ंक्शन को कॉल करने से पहले थे।
प्रोलॉग और एपीलॉग असेंबली लैंग्वेज का भाग नहीं हैं; वह असेंबली लैंग्वेज प्रोग्रामर और अनेक उच्च-स्तरीय प्रोग्रामिंग लैंग्वेज के कंपाइलरद्वारा उपयोग किए जाने वाले सम्मेलन का प्रतिनिधित्व करते हैं। वह अधिक कठोर हैं, प्रत्येक कार्य में उनका रूप समान है।
फ़ंक्शन प्रोलॉग और एपीलॉग में कभी-कभी बफर अतिप्रवाह सुरक्षा के लिए कोड भी होता है।
प्रोलॉग
यदि आर्किटेक्चर में बेस पॉइंटर (जिसे फ्रेम पॉइंटर भी कहा जाता है) और स्टैक पॉइंटर होता है तो फ़ंक्शन प्रोलॉग सामान्यतः निम्नलिखित क्रियाएं करती है:
- वर्तमान बेस पॉइंटर को स्टैक पर बल देता है, जिससे इसे पश्चात् में पुनर्स्थापित किया जा सकता है।
- बेस पॉइंटर का मान स्टैक पॉइंटर के पते पर सेट किया जाता है (जो स्टैक के शीर्ष पर संकेत किया जाता है) जिससे बेस पॉइंटर स्टैक के शीर्ष पर संकेत होता है।
- स्टैक पॉइंटर को उसके मान को घटाकर या बढ़ाकर आगे ले जाता है, यह इस बात पर निर्भर करता है कि स्टैक नीचे बढ़ता है या ऊपर x86 पर, फ़ंक्शन के स्थानीय वैरिएबल के लिए स्थान बनाने के लिए स्टैक पॉइंटर को कम किया जाता है।
अनेक संभावित प्रोलॉग लिखी जा सकती हैं, जिसके परिणामस्वरूप थोड़ा अलग स्टैक कॉन्फ़िगरेशन हो सकता है। यह अंतर स्वीकार्य हैं, जब तक प्रोग्रामर या कंपाइलर फ़ंक्शन के अंदर स्टैक का सही विधि से उपयोग करता है।
उदाहरण के तौर पर, यहां जीएनयू कंपाइलर स्टोर द्वारा निर्मित विशिष्ट x86 असेंबली लैंग्वेज फ़ंक्शन प्रोलॉग है
push ebp
mov ebp, esp
sub esp, N
एन तत्काल मूल्य स्थानीय उपयोग के लिए स्टैक पर आरक्षित बाइट्स की संख्या है।
enter
अनुदेश का उपयोग करके समान परिणाम प्राप्त किया जा सकता है :
enter N, 0
enter
अनुदेश के दूसरे ऑपरेंड के लिए विभिन्न मानों (0 के अतिरिक्त) का उपयोग करके अधिक काम्प्लेक्स प्रोलॉग प्राप्त की जा सकती हैं . यह प्रोलॉग नेस्टेड फ़ंक्शन की अनुमति देने के लिए अनेक आधार/फ़्रेम पॉइंटर्स को आगे बढ़ाती हैं, जैसा कि पास्कल प्रोग्रामिंग लैंग्वेज जैसी लैंग्वेज के लिए आवश्यक है। चूँकि, इन लैंग्वेज के आधुनिक संस्करण इन निर्देशों का उपयोग नहीं करते हैं क्योंकि वह कुछ स्थितियों में नेस्टिंग डेप्थ को सीमित करते हैं।
एपीलॉग
फ़ंक्शन एपीलॉग फ़ंक्शन प्रोलॉग की क्रियाओं को परिवर्तित कर देता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटा देता है। यह सामान्यतः निम्नलिखित क्रियाएं करता है (यह प्रक्रिया आर्किटेक्चर से दूसरे आर्किटेक्चर में भिन्न हो सकती है):
- स्टैक पॉइंटर को वर्तमान बेस पॉइंटर पर छोड़ें, जिससे स्थानीय वैरिएबल के लिए प्रोलॉग में आरक्षित स्थान रिक्त हो जाते है।
- बेस पॉइंटर को स्टैक से हटा देता है, जिससे इसे प्रोलॉग से पहले उसके मान पर पुनर्स्थापित किया जा सकता है।
- पिछले फ्रेम के प्रोग्राम काउंटर को स्टैक से हटाकर और जम्पिंग करके, कॉलिंग फ़ंक्शन पर वापस लौटता है।
दिया गया एपीलॉग उपरोक्त प्रोलॉगओं में से किसी के प्रभाव को परिवर्तित कर देगा (या तो पूर्ण प्रोलॉग, या जो enter
उपयोग करता है). कुछ कॉलिंग परंपराओं के अनुसार स्टैक से लॉजिक को साफ़ करना कैली का दायित्व है, इसलिए एपीलॉग में स्टैक पॉइंटर को नीचे या ऊपर ले जाने का फेज भी सम्मिलित हो सकता है।
उदाहरण के लिए, इन तीन फेज को निम्नलिखित निर्देशों द्वारा 32-बिट x86 असेंबली लैंग्वेज में पूरा किया जा सकता है:
mov esp, ebp
pop ebp
ret
प्रोलॉग की तरह, x86 प्रोसेसर में अंतर्निहित निर्देश होता है जो एपीलॉग का भाग निष्पादित करता है। निम्नलिखित कोड उपरोक्त कोड के समान है:
leave
ret
जैसा कि ऊपर बताया गया है, leave
निर्देश mov
और pop
निर्देश निष्पादित करता है।
एक फ़ंक्शन में अनेक एपीलॉग हो सकते हैं। प्रत्येक फ़ंक्शन निकास बिंदु को या तो अंत में सामान्य एपीलॉग पर जाना चाहिए, या उसमें अपना स्वयं का एपीलॉग होना चाहिए। इसलिए, प्रोग्रामर या कंपाइलर अधिकांशतः इसके संयोजन leave
और ret
का उपयोग करते हैं किसी भी बिंदु पर फ़ंक्शन से बाहर निकलने के लिए। (उदाहरण के लिए, C कंपाइलर return
स्टेटमेंट को leave
/ret
अनुक्रम के साथ प्रतिस्थापित करेगा)।
अग्रिम पठन
- de Boyne Pollard, Jonathan (2010). "The gen on function perilogues". Frequently Given Answers.