इसका मतलब यह है कि बेस पॉइंटर या स्टैक पॉइंटर वास्तव में ऊपर जाने के बजाय मेमोरी एड्रेस को नीचे ले जा रहे हैं? ऐसा क्यों है?
हाँ, push
निर्देश स्टैक पॉइंटर को घटाते हैं और स्टैक को लिखते हैं, जबकि pop
रिवर्स करते हैं, स्टैक से पढ़ते हैं और स्टैक पॉइंटर को बढ़ाते हैं।
यह कुछ हद तक ऐतिहासिक है कि सीमित मेमोरी वाली मशीनों के लिए, स्टैक को ऊंचा रखा गया और नीचे की तरफ उगाया गया, जबकि ढेर को नीचे रखा गया और पीछे की तरफ उगाया गया। "फ्री मेमोरी" का केवल एक ही अंतराल है - ढेर और स्टैक के बीच, और यह अंतर साझा किया जाता है, या तो एक अंतराल में बढ़ सकता है जैसा कि व्यक्तिगत रूप से आवश्यक है। इस प्रकार, प्रोग्राम केवल मेमोरी से बाहर निकलता है जब स्टैक और हीप बिना किसी फ्री मेमोरी को छोड़ते हुए टकराते हैं।
यदि स्टैक और हीप दोनों एक ही दिशा में बढ़ते हैं, तो दो अंतराल हैं, और स्टैक वास्तव में ढेर के अंतर में नहीं बढ़ सकता है (इसके विपरीत भी समस्याग्रस्त है)।
मूल रूप से, प्रोसेसर के पास कोई समर्पित स्टैक हैंडलिंग निर्देश नहीं था। हालाँकि, जैसा कि हार्डवेयर में स्टैक समर्थन जोड़ा गया था, यह नीचे की ओर बढ़ने के इस पैटर्न पर ले गया, और प्रोसेसर आज भी इस पैटर्न का अनुसरण करते हैं।
कोई तर्क दे सकता है कि 64-बिट मशीन पर कई अंतरालों को अनुमति देने के लिए पर्याप्त पता स्थान है - और सबूत के रूप में, कई अंतराल जरूरी हैं जब एक प्रक्रिया में कई धागे होते हैं। यद्यपि यह कई अंतर प्रणालियों के साथ चीजों को बदलने के लिए पर्याप्त प्रेरणा नहीं है, लेकिन विकास की दिशा यकीनन मनमानी है, इसलिए परंपरा / संगतता पैमाने को टिप्स देती है।
आपको ढेर की दिशा बदलने, वरना समर्पित धक्का और पॉपिंग निर्देश (जैसे के उपयोग पर देने के लिए में सीपीयू ढेर से निपटने निर्देश बदलने के लिए होगा push
, pop
, call
, ret
, अन्य)।
ध्यान दें कि MIPS इंस्ट्रक्शन सेट आर्किटेक्चर के पास समर्पित push
और नहीं है pop
, इसलिए किसी भी दिशा में स्टैक को बढ़ाना व्यावहारिक है - आप अभी भी सिंगल थ्रेड प्रक्रिया के लिए एक-गैप मेमोरी लेआउट चाहते हैं, लेकिन स्टैक को ऊपर और ढेर तक बढ़ा सकते हैं। नीचे की ओर। यदि आपने ऐसा किया है, हालांकि, कुछ सी वेरिएग कोड को स्रोत में या अंडर-हुड पैरामीटर पारित होने में समायोजन की आवश्यकता हो सकती है।
(वास्तव में, चूंकि MIPS पर कोई समर्पित स्टैक हैंडलिंग नहीं है, इसलिए हम स्टैक पर पुश करने के लिए प्री या पोस्ट इंक्रीमेंट या प्री या पोस्ट डिक्रीमेंट का उपयोग कर सकते हैं, जब तक कि हम स्टैक को पॉप करने के लिए सटीक रिवर्स का उपयोग करते थे, और यह भी मान लें कि ऑपरेटिंग सिस्टम चुने हुए स्टैक उपयोग मॉडल का सम्मान करता है। वास्तव में, कुछ एम्बेडेड सिस्टम और कुछ शैक्षणिक प्रणालियों में, MIPS स्टैक को ऊपर की तरफ उगाया जाता है।)
-4(%rbp)
बेस पॉइंटर को बिल्कुल भी स्थानांतरित नहीं करता है और यह+4(%rbp)
संभवतः काम नहीं कर सकता है।