স্ট্যাকগুলি সাধারণত নীচের দিকে কেন বৃদ্ধি পায়?


96

আমি জানি যে আর্কিটেকচারগুলিতে আমি ব্যক্তিগতভাবে পরিচিত (x86, 6502 ইত্যাদি), স্ট্যাকটি সাধারণত নিচের দিকে বৃদ্ধি পায় (অর্থাত্ প্রতিটি আইটেমটি স্ট্যাকের দিকে ধাক্কা দেয়, একটি বর্ধিত নয়) in

আমি এর জন্য .তিহাসিক যুক্তি নিয়ে ভাবছি। আমি জানি যে একীভূত ঠিকানার জায়গাতে, ডেটা বিভাগের বিপরীত প্রান্তে স্ট্যাকটি শুরু করা সুবিধাজনক (বলে) যাতে উভয় পক্ষের মাঝখানে সংঘর্ষ হয় তবে কেবল সেখানেই সমস্যা রয়েছে। তবে কেন স্ট্যাকটি traditionতিহ্যগতভাবে শীর্ষ অংশটি পায়? বিশেষত প্রদত্ত কীভাবে এটি "ধারণাগত" মডেলের বিপরীত?

(এবং লক্ষ করুন যে 6502 আর্কিটেকচারে স্ট্যাকটি নীচের দিকেও বৃদ্ধি পায়, যদিও এটি একক 256-বাইট পৃষ্ঠায় আবদ্ধ থাকে এবং এই দিকনির্দেশনা পছন্দটি নির্বিচারে মনে হয়))

উত্তর:


52

.তিহাসিক যুক্তি হিসাবে, আমি নির্দিষ্ট করে বলতে পারি না (কারণ আমি সেগুলি ডিজাইন করি নি)। বিষয়টি সম্পর্কে আমার ধারণা হ'ল প্রথম দিকে সিপিইউগুলি তাদের আসল প্রোগ্রামের কাউন্টারটি 0 এ সেট করেছে এবং এটি স্বাভাবিকভাবেই ছিল অন্য প্রান্তে স্ট্যাকটি শুরু করা এবং নীচের দিকে বাড়ানো, যেহেতু তাদের কোডটি স্বাভাবিকভাবে উপরের দিকে বাড়ছে।

একপাশে, নোট করুন যে প্রোগ্রামটির এই পুনঃস্থাপনের ক্ষেত্রে 0- র প্রতিস্থাপনটি সমস্ত প্রারম্ভিক সিপিইউগুলির ক্ষেত্রে নয় । উদাহরণস্বরূপ, মটোরোলা 6809 ঠিকানাগুলি থেকে প্রোগ্রামের কাউন্টারটি আনবে 0xfffe/fযাতে আপনি সেই ঠিকানায় সরবরাহ করা হবে তার উপর নির্ভর করে (সাধারণত, তবে কোনওভাবেই সীমাবদ্ধ নয়, রম) স্বেচ্ছাসেবীর জায়গায় চালানো শুরু করতে পারেন।

কিছু historicalতিহাসিক সিস্টেমগুলি প্রথমে যে কাজ করবে তা হ'ল উপর থেকে স্মৃতি স্ক্যান করা যতক্ষণ না এটি এমন কোনও অবস্থান খুঁজে পাওয়া যায় যা একই লিখিত মানটি আবার পড়ে থাকে, যাতে এটি প্রকৃত র‌্যাম ইনস্টলড (উদাহরণস্বরূপ, 64 কে ঠিকানার স্থান সহ একটি জেড 80) জানতে পারে অগত্যা 64K বা র্যাম, আসলে 64K হতো না বৃহদায়তন আমার প্রথম দিন)। এটি শীর্ষে প্রকৃত ঠিকানাটি সন্ধান করার পরে এটি স্ট্যাক পয়েন্টারটিকে যথাযথভাবে সেট করবে এবং তারপরে সাবরুটাইনগুলি কল করা শুরু করবে। এই স্ক্যানিংটি সাধারণত স্টোর-আপের অংশ হিসাবে রোমে সিপিইউ চলমান কোড দ্বারা করা হত।

স্ট্যাকের বৃদ্ধির বিষয়ে, এগুলি সমস্তই নীচের দিকে বাড়ছে না, বিশদগুলির জন্য এই উত্তরটি দেখুন।


4
আমি Z80 র‌্যাম সনাক্তকরণ কৌশলটির গল্পটি পছন্দ করি। কিছুটা ধারণা তৈরি করে যে টেক্সট বিভাগগুলি উপরের দিকে বাড়ানো হচ্ছে - ইওমের প্রোগ্রামারদের স্ট্যাকের তুলনায় এর প্রভাবগুলির সাথে কিছুটা আরও সরাসরি যোগাযোগ ছিল han ধন্যবাদ প্যাক্সিয়াবলো han স্ট্যাক বাস্তবায়নের বিকল্প ফর্মগুলির সেটটির পয়েন্টারটিও অত্যন্ত আকর্ষণীয়।
বেন জোটো

প্রারম্ভিক দিনের স্মৃতি কি এর আকারটি জানানোর উপায় নেই এবং আমাদের এটি ম্যানুয়ালি গণনা করতে হবে?
ফুক্লভিভি

4
@ লুভানহ্ফ্যাক, আমাকে ধরে নিতে হবে আপনি আমার চেয়ে অনেক বেশি প্রজন্মের (বা দুজন) রয়েছেন। আমি এখনও টিআরএস -80 মডেল 3 পদ্ধতিটি স্মরণ করি যা বুট সময়ে ব্যবহারকারীকে তার জন্য জিজ্ঞাসা করার তারিখ এবং সময় পাওয়ার জন্য । মেমোরির উপরের সীমাটি নির্ধারণের জন্য মেমোরি স্ক্যানার রাখার দিনটিকে শিল্পের অবস্থা হিসাবে বিবেচনা করা হয়েছিল :-) আপনি কি কল্পনা করতে পারেন যে উইন্ডোজ যখন সময়টি জিজ্ঞাসা করেছিল, বা প্রতিবার আপনি যখন বুট করেছিলেন তখন কী ঘটেছিল?
paxdiablo

4
আসলে, জিলোগ জেড 80 ডকুমেন্টেশন বলছে যে অংশটি পিসি রেজিস্টারটি 0000h এ সেট করে এবং সম্পাদন করে শুরু হবে। এটি বাধা মোড 0 তে সেট করে, বাধা অক্ষম করে এবং আই এবং আর রেজিস্টারগুলিকে 0 তে সেট করে। এর পরে, এটি কার্যকর করা শুরু করে। 0000 ঘন্টা এ, কোডটি চলমান শুরু করে। সাব্রোটাইন কল করতে বা বাধা সক্ষম করার আগে এই কোডটিকে স্ট্যাক পয়েন্টার শুরু করতে হবে। এমন কোনও জেন্ডার কোনও Z80 বিক্রি করে যা আপনার বর্ণনার সাথে আচরণ করে?
মাইকিব

4
মাইক, দুঃখিত, আমি আরও পরিষ্কার করা উচিত ছিল। যখন আমি বললাম সিপিইউ স্ক্যান করা মেমোরি, তখন আমি বোঝাতে চাইনি যে এটি নিজেই সিপিইউয়ের একটি বৈশিষ্ট্য। এটি আসলে রমের একটি প্রোগ্রাম থেকে নিয়ন্ত্রণ করা হয়েছিল। আমি স্পষ্ট করব।
প্যাক্সিডিয়াবলো

21

একটি ভাল ব্যাখ্যা আমি শুনেছিলাম যে অতীতে কিছু মেশিনগুলি কেবল স্বাক্ষরবিহীন অফসেটগুলি থাকতে পারে, সুতরাং আপনি স্ট্যাকটি নীচের দিকে বাড়তে চাইবেন যাতে আপনি জাল একটি নেতিবাচক অফসেটের অতিরিক্ত নির্দেশ না হারিয়ে আপনার লোকালকে আঘাত করতে পারেন।


8

স্ট্যানলে মাজর (4004 এবং 8080 স্থপতি) "ইনটেল মাইক্রোপ্রসেসারস: 8008 থেকে 8086" তে কীভাবে স্ট্যাক বৃদ্ধির দিকটি 8080 (এবং শেষ পর্যন্ত 8086 এর জন্য) বেছে নেওয়া হয়েছে তা ব্যাখ্যা করে :

ব্যবহারকারীর প্রোগ্রাম (ধনাত্মক সূচক) থেকে স্ট্যাকের ইনডেক্সিংকে সহজ করার জন্য এবং সম্মুখ প্যানেল থেকে স্ট্যাকের বিষয়বস্তুগুলি সহজতর করার জন্য স্ট্যাক পয়েন্টারটি "ডাউনহিল" চালানোর জন্য (নিম্ন মেমরির দিকে স্ট্যাকের সাথে) চালানো হয়েছিল।


6

একটি সম্ভাব্য কারণ হতে পারে এটি সারিবদ্ধকরণকে সহজতর করে। আপনি যদি স্ট্যাকের উপর স্থানীয় ভেরিয়েবল স্থাপন করেন যা অবশ্যই 4-বাইট সীমানায় স্থাপন করা উচিত, আপনি স্ট্যাক পয়েন্টার থেকে কেবল অবজেক্টের আকারটি বিয়োগ করতে পারেন, এবং সঠিকভাবে প্রান্তিক ঠিকানা পেতে দুটি নীচের বিটগুলি শূন্য করতে পারেন। যদি স্ট্যাকটি উপরের দিকে বাড়তে থাকে তবে সাইনমেন্টটি কিছুটা জটিল হয়ে যায় তা নিশ্চিত করে।


4
কম্পিউটারগুলি বিয়োগ করে না; তারা 2 এর প্রশংসা যোগ করুন। বিয়োগ করে যা কিছু করা হয় তা যুক্ত করেই করা হয়। বিবেচনা করুন, কম্পিউটারগুলিতে অ্যাডার রয়েছে, সাবট্র্যাক্টর নয়।
jw

4
@jww - এটি কোনও পার্থক্য ছাড়াই পার্থক্য। আমি ভাল দাবি করতে পারি যে কম্পিউটারগুলি কেবল তারা বিয়োগ করে না! এই উত্তরের উদ্দেশ্যগুলির জন্য, এটি সত্যিই গুরুত্বপূর্ণ নয় - তবে বেশিরভাগ ALUs একটি সার্কিট ব্যবহার করবে যা একই কর্মক্ষমতা সহ সংযোজন এবং বিয়োগ উভয় সমর্থন করে supports অর্থাৎ যখন A - Bধারণার দিক হিসাবে প্রয়োগ করা যেতে পারে A + (-B)(অর্থাত, জন্য পৃথক অস্বীকৃতি পদক্ষেপ B), এটা বাস্তবে নয়।
বিউনরোপ

@jww আপনার নাইটপিকটি প্রাথমিক কম্পিউটারগুলির পক্ষে ভুল - এটি দু'জনের পরিপূরক জয়ের জন্য কিছুটা সময় নিয়েছিল এবং এটি না হওয়া পর্যন্ত এখানে কম্পিউটারগুলির পরিপূরক এবং সাইন-ও-প্রবণতা এবং এর পরিবর্তে অন্য কিছু ব্যবহার করা হত। এই বাস্তবায়নগুলির সাথে, বিয়োগ বিয়োগের সাথে আরও ভালভাবে একটি সুবিধা থাকতে পারে। সুতরাং অতিরিক্ত তথ্যের অভাবে, স্ট্যাকের দিকনির্দেশের মতো পরিকল্পনার পছন্দগুলিকে সম্বোধন করতে প্রভাবিতকারী একটি সম্ভাব্য কারণ হিসাবে এটিকে অস্বীকার করা ভুল।
mtraceur

4

আইআইআরসি স্ট্যাকটি নীচের দিকে বেড়ে যায় কারণ গাদাটি উপরের দিকে বেড়ে যায়। এটি অন্য উপায়ে হতে পারে।


4
একটি upর্ধ্বগামী বর্ধমান গাদা কিছু ক্ষেত্রে দক্ষ পুনর্লোক করতে দেয় তবে নিম্নমুখী-ক্রমবর্ধমান গাদা প্রায় কখনও হয় না।
পিটার কর্ডেস

@ পিটারকার্ডস কেন?
যশশ

4
@ যিশাস: কারণ অনুলিপি ছাড়াই কেবল ম্যাপিং প্রসারিত করার জন্য কোনও অবজেক্টের পরেrealloc(3) আরও স্থান প্রয়োজন । একই বস্তুর পুনরাবৃত্তি পুনরুদ্ধার করা সম্ভব হয় যখন এটি একটি নির্বিচার পরিমাণ অব্যবহৃত স্থান অনুসরণ করে।
পিটার কর্ডেস

2

আমি বিশ্বাস করি এটি নিখুঁতভাবে একটি ডিজাইনের সিদ্ধান্ত। এগুলি সকলেই নীচের দিকে বৃদ্ধি পায় না - বিভিন্ন আর্কিটেকচারে স্ট্যাক বৃদ্ধির দিকনির্দেশে কিছু ভাল আলোচনার জন্য এই এসও থ্রেডটি দেখুন ।


1

আমি বিশ্বাস করি কনভেনশনটি আইবিএম 704 এবং এর কুখ্যাত "হ্রাস রেজিস্ট্রার" দিয়ে শুরু হয়েছিল। আধুনিক বক্তৃতা এটা নির্দেশ একটি অফসেট ক্ষেত্র কল করবে, কিন্তু বিন্দু তারা গিয়েছিলাম নিচে , না আপ


1

মাত্র 2 সি আরও:

উল্লিখিত সমস্ত historicতিহাসিক যুক্তির বাইরে, আমি যথেষ্ট নিশ্চিত যে এর কোনও কারণ নেই যা আধুনিক প্রসেসরের ক্ষেত্রে বৈধ। সমস্ত প্রসেসর স্বাক্ষরিত অফসেটগুলি নিতে পারে এবং যখন আমরা একাধিক থ্রেড নিয়ে কাজ শুরু করি তখন থেকেই হিপ / স্ট্যাকের দূরত্বকে সর্বাধিক করে তোলা হয়।

আমি ব্যক্তিগতভাবে এটিকে একটি সুরক্ষা নকশার ত্রুটি বিবেচনা করি। যদি, বলুন, x64 আর্কিটেকচারের ডিজাইনাররা স্ট্যাক বৃদ্ধির দিকটিকে বিপরীত করে ফেলত, তবে বেশিরভাগ স্ট্যাক বাফার ওভারফ্লোগুলি মুছে ফেলা হত - এটি এক বিশাল ব্যাপার deal (যেহেতু স্ট্রিংগুলি wardর্ধ্বমুখী হয়)।


0

আমি নিশ্চিত নই তবে আমি ভ্যাক্স / ভিএমএসের জন্য কিছুদিন আগে প্রোগ্রামিং করেছি। মনে হচ্ছে মনে হচ্ছে মেমরির একটি অংশ (হিপ ??) উপরে যাচ্ছে এবং স্ট্যাকটি নিচে যাচ্ছে। যখন দু'জনের দেখা হয়েছিল, তখন আপনার স্মৃতিশক্তি ছিল না।


4
এটি সত্য, তবে কেন গাদাটি অন্যদিকে নয় তবে উপরের দিকে বৃদ্ধি পাচ্ছে?
সিওরো সান্তিলি :11 冠状 病 六四 事件

0

একটি ন্যূনতম এম্বেডড সিস্টেমে স্ট্যাক বৃদ্ধির একটি সুবিধা হ'ল র‌্যামের একক অংশকে অপ্রয়োজনীয় পৃষ্ঠা ও ও পৃষ্ঠায় উভয় পৃষ্ঠায় ম্যাপ করা যেতে পারে, শূন্য পৃষ্ঠার ভেরিয়েবলগুলি 0x000 থেকে শুরু করে নির্ধারণ করা যেতে পারে এবং 0x1FF থেকে স্ট্যাকটি নীচের দিকে বাড়ানো সম্ভব হয় ভেরিয়েবলগুলি ওভাররাইট করার আগে পরিমাণটি বাড়তে হবে।

6502 এর মূল নকশার লক্ষ্যগুলির মধ্যে একটি হ'ল এটির সাথে মিলিত হতে পারে উদাহরণস্বরূপ, 6530, যার ফলে একটি দ্বি-চিপ মাইক্রোকন্ট্রোলার সিস্টেম 1 কেবি প্রোগ্রামের রম, টাইমার, আই / ও, এবং র‌্যামের 64 বাইট ভাগ করে স্ট্যাক এবং পৃষ্ঠা শূন্য ভেরিয়েবলের মধ্যে। তুলনা করে, 8080 বা 6800 এর উপর ভিত্তি করে সেই সময়ের ন্যূনতম এমবেডেড সিস্টেমটি চার বা পাঁচটি চিপ হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.