आमतौर पर ढेर नीचे की ओर क्यों बढ़ते हैं?


95

मुझे पता है कि आर्किटेक्चर में मैं व्यक्तिगत रूप से परिचित हूं (x86, 6502, आदि), स्टैक आमतौर पर नीचे की ओर बढ़ता है (यानी हर आइटम एक डीपीआर में स्टैक परिणाम पर धकेल दिया जाता है, न कि एक बढ़ा हुआ)।

मैं इसके लिए ऐतिहासिक औचित्य के बारे में सोच रहा हूं। मुझे पता है कि एक एकीकृत पते के स्थान पर, डेटा सेगमेंट के विपरीत छोर पर स्टैक को शुरू करना सुविधाजनक है (कहते हैं) इसलिए केवल एक समस्या है अगर दोनों पक्ष बीच में टकराते हैं। लेकिन परंपरागत रूप से ढेर को शीर्ष भाग क्यों मिलता है? विशेष रूप से यह देखते हुए कि यह "वैचारिक" मॉडल के विपरीत कैसे है?

(और ध्यान दें कि 6502 वास्तुकला में, स्टैक भी नीचे की ओर बढ़ता है, भले ही यह एक सिंगल 256-बाइट पेज से बंधा हो, और यह दिशा पसंद मनमाना लगता है।)

जवाबों:


52

ऐतिहासिक तर्क के अनुसार, मैं कुछ के लिए नहीं कह सकता (क्योंकि मैंने उन्हें डिज़ाइन नहीं किया था)। इस मामले पर मेरे विचार हैं कि शुरुआती सीपीयू को अपना मूल प्रोग्राम काउंटर 0 पर सेट किया गया था और यह दूसरे छोर पर स्टैक को शुरू करने और नीचे की तरफ बढ़ने की स्वाभाविक इच्छा थी, क्योंकि उनका कोड स्वाभाविक रूप से ऊपर की ओर बढ़ता है।

एक तरफ के रूप में, ध्यान दें कि रीसेट पर प्रोग्राम काउंटर से 0 तक की यह सेटिंग सभी शुरुआती सीपीयू के लिए नहीं है । उदाहरण के लिए, मोटोरोला 6809 पते से प्रोग्राम काउंटर लाएगा 0xfffe/fताकि आप उस स्थान पर आपूर्ति शुरू कर सकें, जो उस पते पर आपूर्ति की गई थी (आमतौर पर, लेकिन रॉम तक सीमित नहीं है) के आधार पर।

कुछ ऐतिहासिक प्रणालियों को करने वाली पहली चीजों में से एक मेमोरी को ऊपर से स्कैन करना होगा, जब तक कि यह एक ऐसा स्थान नहीं मिला जो वापस लिखे गए समान मान को पढ़े, ताकि यह वास्तविक रैम स्थापित हो (जैसे, 64 k पता स्थान के साथ एक z80 पता चलेगा जरूरी नहीं कि 64K या RAM हो, वास्तव में 64K मेरे शुरुआती दिनों में बड़े पैमाने पर रहा होगा )। एक बार जब यह शीर्ष वास्तविक पता मिल जाता है, तो यह उचित रूप से स्टैक पॉइंटर को सेट करेगा और फिर सबरूटीन्स को कॉल करना शुरू कर सकता है। यह स्कैनिंग आमतौर पर सीपीयू रनिंग कोड द्वारा ROM में स्टार्ट-अप के हिस्से के रूप में की जाएगी।

स्टैक वृद्धि के संबंध में, उनमें से सभी नीचे की ओर नहीं बढ़ते हैं, विवरण के लिए इस उत्तर को देखें।


1
मुझे Z80 रैम डिटेक्शन स्ट्रेटेजी पसंद है। कुछ समझ में आता है कि पाठ खंडों को ऊपर की ओर रखा जाता है - योर के प्रोग्रामरों का स्टैक की तुलना में इसके निहितार्थ से निपटने के साथ कुछ अधिक सीधा संपर्क था। धन्यवाद paxdiablo। स्टैक कार्यान्वयन के वैकल्पिक रूपों के सेट के लिए सूचक भी सुपर दिलचस्प है।
बेन ज़ोटो

क्या प्रारंभिक-दिवस की स्मृति में इसके आकार को सूचित करने का कोई तरीका नहीं है और हमें इसकी गणना स्वयं करनी होगी?
फीकलव

1
@ LưuV LnhPhúc, मुझे यह मानना ​​होगा कि आप मेरे पीछे एक पीढ़ी (या दो) हैं। मुझे अभी भी TRS-80 मॉडल 3 विधि याद है, जिसमें बूट समय पर उपयोगकर्ता से इसके लिए तारीख और समय प्राप्त करने के लिए कहा जाता है। स्मृति स्कैनर की ऊपरी सीमा निर्धारित करने के लिए दिन में वापस कला की स्थिति पर विचार किया गया था :-) क्या आप सोच सकते हैं कि अगर विंडोज ने आपके द्वारा बूट किए गए समय, या आपके पास कितनी मेमोरी थी, तो क्या होगा?
paxdiablo

1
दरअसल, Zilog Z80 प्रलेखन का कहना है कि भाग पीसी रजिस्टर को 0000h पर सेट करने और निष्पादित करने से शुरू होता है। यह इंटरप्ट मोड को 0 पर सेट करता है, इंटरप्ट को बाधित करता है, और I और R रजिस्टर को 0 पर सेट करता है। उसके बाद, यह निष्पादित करना शुरू कर देता है। 0000h पर, यह कोड चलाना शुरू कर देता है। इस कोड को स्टैक पॉइंटर को इनिशियलाइज़ करने से पहले एक सबरूटिन को कॉल करने या इंटरप्ट को सक्षम करने की आवश्यकता होती है। क्या विक्रेता एक Z80 बेचता है जो आपके द्वारा वर्णित तरीके का व्यवहार करता है?
माइक एनबी

1
माइक, क्षमा करें, मुझे स्पष्ट होना चाहिए था। जब मैंने कहा कि सीपीयू मेमोरी को स्कैन करता है, तो मेरा मतलब यह नहीं था कि यह सीपीयू की एक विशेषता थी। यह वास्तव में ROM में एक कार्यक्रम से नियंत्रित किया गया था। मैं स्पष्ट कर दूंगा।
paxdiablo

21

एक अच्छा विवरण मैंने सुना है कि अतीत में कुछ मशीनें केवल अहस्ताक्षरित ऑफसेट हो सकती थीं, इसलिए आप चाहते हैं कि स्टैक नीचे की तरफ बढ़े ताकि आप अपने स्थानीय लोगों को एक नकारात्मक ऑफसेट को नकली करने के लिए अतिरिक्त निर्देश खोए बिना मार सकें।


7

स्टेनली मजोर (4004 और 8080 वास्तुकार) बताते हैं कि 8080 (और अंततः 8086 के लिए) के लिए स्टैक ग्रोथ डायरेक्शन को कैसे चुना गया। "इंटेल माइक्रोप्रोसेसरों: 8008 से 8086" में :

उपयोगकर्ता के कार्यक्रम (पॉजिटिव इंडेक्सिंग) से स्टैक में अनुक्रमण को सरल बनाने और फ्रंट पैनल से स्टैक की सामग्री को सरल बनाने के लिए स्टैक पॉइंटर को "डाउनहिल" (कम मेमोरी की ओर स्टैक को आगे बढ़ाने के साथ) चलाने के लिए चुना गया था।


6

एक संभावित कारण यह हो सकता है कि यह संरेखण को सरल करता है। यदि आप स्टैक पर एक स्थानीय वैरिएबल रखते हैं जिसे 4-बाइट सीमा पर रखा जाना चाहिए, तो आप स्टैक पॉइंटर से ऑब्जेक्ट के आकार को घटा सकते हैं, और फिर एक ठीक से संरेखित पता प्राप्त करने के लिए दो निचले बिट्स को शून्य कर सकते हैं। यदि स्टैक ऊपर की ओर बढ़ता है, तो संरेखण सुनिश्चित करना थोड़ा मुश्किल हो जाता है।


1
कंप्यूटर घटाना नहीं है; वे 2 की तारीफ करते हैं। जो कुछ भी घटाना द्वारा किया जाता है वह वास्तव में जोड़कर किया जाता है। गौर करें, कंप्यूटर में जोड़ होते हैं, घटाव नहीं।
jww

1
@jww - यह एक अंतर के बिना एक अंतर है। मैं अच्छी तरह से दावा कर सकता हूँ कि कंप्यूटर जोड़ नहीं है वे केवल घटाना! इस उत्तर के प्रयोजनों के लिए, यह वास्तव में मायने नहीं रखता है - लेकिन अधिकांश ALU एक सर्किट का उपयोग करेंगे जो समान प्रदर्शन के साथ जोड़ और घटाव दोनों का समर्थन करता है। यही है, जबकि A - Bवैचारिक रूप से A + (-B)(यानी, के लिए एक अलग निषेध कदम B) के रूप में लागू किया जा सकता है , यह व्यवहार में नहीं है।
BeeOnRope

@jww शुरुआती कंप्यूटरों के लिए आपका नाइटपिक गलत है - दो जीतने के पूरक के लिए कुछ समय लगा, और जब तक ऐसा नहीं हुआ, कंप्यूटर के पूरक और साइन-एंड-परिमाण और शायद अन्य चीजों का उपयोग करने वाले कंप्यूटर थे। उन कार्यान्वयनों के साथ, बनाम घटाव को जोड़ने का एक फायदा भी हो सकता है। इसलिए अतिरिक्त जानकारी के अभाव में, स्टैक दिशा जैसी स्कीम विकल्पों को प्रभावित करने वाले संभावित कारक के रूप में इसे नियमबद्ध करना गलत है।
मृत्युंजय

4

IIRC ढेर नीचे की ओर बढ़ता है क्योंकि ढेर ऊपर की तरफ बढ़ता है। यह दूसरा रास्ता हो सकता था।


5
एक ऊपर की ओर बढ़ने वाला ढेर कुछ मामलों में कुशल रीयललोक की अनुमति देता है, लेकिन नीचे की ओर बढ़ने वाला ढेर बहुत अधिक कभी नहीं होता है।
पीटर कॉर्ड्स

@PeterCordes क्यों?
यशस

3
@Yashas: क्योंकि realloc(3)जरूरतों और अधिक स्थान के बाद एक वस्तु बस कॉपी किए बिना मानचित्रण विस्तार करने के लिए। जब किसी अप्रयुक्त स्थान का एक मनमाना राशि द्वारा पीछा किया जाता है तो उसी वस्तु का दोहराया जाना संभव है।
पीटर कॉर्डेस

2

मेरा मानना ​​है कि यह विशुद्ध रूप से एक डिजाइन निर्णय है। उनमें से सभी नीचे की ओर नहीं बढ़ते हैं - इस एसओ धागे को विभिन्न आर्किटेक्चर पर स्टैक ग्रोथ की दिशा में कुछ अच्छी चर्चा के लिए देखें ।


1

मेरा मानना ​​है कि यह सम्मेलन आईबीएम 704 और इसके कुख्यात "डिक्रीमेंट रजिस्टर" के साथ शुरू हुआ। आधुनिक भाषण इसे निर्देश का एक ऑफसेट क्षेत्र कहेंगे, लेकिन बिंदु यह है कि वे नीचे गए हैं , ऊपर नहीं


1

बस 2 सी अधिक:

उल्लेखित सभी ऐतिहासिक औचित्य से परे, मैं काफी निश्चित हूं कि कोई कारण नहीं है जो आधुनिक प्रोसेसर में मान्य है। सभी प्रोसेसर साइन किए गए ऑफ़सेट ले सकते हैं, और ढेर / स्टैक की दूरी को अधिकतम कर सकते हैं, क्योंकि हमने कई थ्रेड्स के साथ काम करना शुरू कर दिया है।

मैं व्यक्तिगत रूप से इसे सुरक्षा डिजाइन दोष मानता हूं। अगर, कहते हैं, x64 आर्किटेक्चर के डिजाइनरों ने स्टैक ग्रोथ की दिशा को उलट दिया होता, तो ज्यादातर स्टैक बफर ओवरफ्लो को समाप्त कर दिया जाता - जो एक बड़ी बात है। (चूंकि तार ऊपर की ओर बढ़ते हैं)।


0

मैं निश्चित नहीं हूं लेकिन मैंने कुछ दिनों में VAX / VMS के लिए कुछ प्रोग्रामिंग की। मुझे लगता है कि स्मृति का एक हिस्सा (ढेर ??) ऊपर जा रहा है और ढेर नीचे जा रहा है। जब दोनों मिले, तब आप स्मृति से बाहर थे।


1
यह सच है, लेकिन फिर क्यों ढेर ऊपर की तरफ बढ़ता है और दूसरे तरीके से नहीं?
सिरो सेंटिल्ली 郝海东 冠状 i i

0

न्यूनतम एम्बेडेड सिस्टम में स्टैक की वृद्धि को अवरूद्ध करने का एक फायदा यह है कि रैम के एक एकल भाग को पृष्ठ O और पृष्ठ 1 दोनों में ही मैप किया जा सकता है, जिससे शून्य पृष्ठ चर को 0x000 से शुरू किया जा सकता है और स्टैक 0x1FF से नीचे की ओर बढ़ रहा है, अधिकतम यह राशि चर को अधिलेखित करने से पहले बढ़ना होगा।

6502 के मूल डिजाइन लक्ष्यों में से एक यह था कि इसके साथ जोड़ा जा सकता है, उदाहरण के लिए, 6530, जिसके परिणामस्वरूप दो केबी माइक्रोकंट्रोलर सिस्टम में 1 KB प्रोग्राम के साथ ROM, टाइमर, I / O और 64 बाइट्स RAM साझा किए गए स्टैक और पृष्ठ शून्य चर के बीच। तुलना करके, 8080 या 6800 के आधार पर उस समय की न्यूनतम एम्बेडेड प्रणाली चार या पांच चिप्स होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.