استفادهی حافظه پشته یا همون stack segment چیه؟ من هر چی خوندم متوجه نشدم. اگه یکی بتونه با مثال برام توضیح بده خیلی ممنون میشم.
مرسی از پاسخ ولی من راجع به حافظه استک پرسیدم نه کش
آووو. گفتم چقدر اسمشون متفاوته منتقل شد به پرسش خودش
اما پشته
توی برنامهنویسی، برنامهها رو به توابع میشکنیم و ممکنه یک تابع درون تابع دیگه هم صدا زده بشه.
مثلا تابع sin توی خط ۳۰ برنامه تعریف شده. و در خط ۱۰۰ صدا زده میشه.
پردازنده در اینجا عدد ۱۰۰ رو در پشته ذخیره میکنه و میره سراغ خط ۳۰ حالا فکر کنید خط ۴۰ در تابع sin اومده تابع دیگهای مثل fur رو که رو خط ۱۰ بوده صدا زده. پردازنده دوباره عدد ۴۰ رو ذخیره میکنه و میره به خط ۱۰ تا اینکه برسید به نقط return در تابع fur. حالا تابع fur تموم شده و میخواد برگرده سر جای قبلیش. میره سراغ پشته عدد ۴۰ رو برمیداره و میره به خط ۴۰ تا دوباره برسه به نقطه return در تابع sin دوباره میخواد برگرده به جای قبلیش. میره سراغ پشته، عدد ۱۰۰ رو برمیداره و میره به خط ۱۰۰.
در حقیقت پشته شبیه جعبه کتابه. معنی اون به فارسی یعنی گنجه. توی جعبه کتاب کتابها رو میچینید تا بیاد بالا وقتی میخواید کتابها رو بردارید، اول میتونید آخرین کتابی که گذاشتید رو بردارید. توی گنجه هم ظاهرا وسایل همین طوری گذاشته میشه. یا مثلا کمد رختخواب که خیلی شبیه هست. آرم استک اوورفلو هم شبیهشه.
کاربردش هم برای فراخوانی توابع هست. شاید کاربرد دیگری هم داشتهباشه که من نمیدونم.
من واقعیتش یکم خوندم، ظاهرا شبیه به «چرکنویس» سیستم هست. تقریبا مثل مثالی که محمد زد ولی میتونه کاربردهای سادهتری هم داشته باشه. ساختار چرکنویس هم در امتحان به همین شکله: محاسبات مختلف رو انجام میدین و محاسبات جانبی رو به ترتیب در چرکنویس میارین و در نهایت از اونها استفاده میکنین. برخلاف کش که عملا مثل هندبوک میمونه یعنی حساب کتابهای مهم که کاملا بهش نیاز دارین رو در دسترس قرار میدین تا وقت صرف جستجو برای اون نشه! از این لحاظ، اگر درست فهمیده باشم، موافق نیستم که شبیه به گنجه باشه! چون اساسا گنجه چیزهایی هست که میخواین برای استفاده بعد حفظ کنین و نه چیزهایی که به شکلی موقت در جایی قرار داده شدن!
پشته پرکاربردترین ساختار داده در سطوح پایین برنامهنویسی هست. این که فقط به عنوان چرکنویس باشه درست نیست. پر سطوح پایین معمولا یا حافظهها هیچ ساحتاری ندارن (مثل heap) یا پشته هستن.
شما اگه بخواید از خونه خودتون به خونه دوستی در اون طرف شهر برید باید اول از کوچه خودتون خارج بشید بعد مثلا وارد خیابان ۱ بعد ۲ بعد ۳ و بعد به کوچه دوستتون وارد بشید. در برگشت (اگر از یکطرفه بودن خیابانها صرفنظر کنید) باید به ترتیب عکس عمل کنید و اول از کوچه دوستتون خارج بشید و بعد وارد آخرین خیابانی که ازش امدید بشید و … . بنابراین پشته برای ذخیره این نوع آدرس ایدهآله.
در کامپیوتر هم میشه در داخل یه تابع، تابع دیگر یا خودش رو مجددا صدا زد و هر موقع اجرای تابع تموم بشه باید برگشت به آخرین جایی که قبل از ورود به تابع اونجا بودیم. برای این کار در حافظه cpu چیزی هست به نام instruction pointer که محل اجرای برنامه رو نشون میده و قبل از ورود به تابع مقدارش در یه پشته ذخیره میشه و بعد از خروج مقدارش از پشته خونده میشه.
همینطور هر تابع یک فضایی برای متغیرهای محلی خودش داره (همون چرکنویس اشارهشده). آدرس اول و آخر این فضا در stack pointer و stack base pointer دخیره میشه. هر موقع وارد یه تابع جدید (یا همون تابع به صورت بازگشتی) میشیم نیاز به یه چرکنویس جدید هست. بنابراین آدرس اون دوتا پوینتر در دو پشته ذخیره میشه تا پس از بازگشت تابع دوباره محل چرکنویس تابع فعلی رو داشته باشیم.
پشته در سطوح بالاتر هم کاربرد داره. برای مثال در تحلیل عبارتهایی که تعداد دلخواهی پرانتز دارند. مثلا:
1 + (2 - 3) / (4 + ((6 - 5) * 7)) - ((3 * 3) * (8 + 9)
به هر پرانتز باز که رسیدید موقعیت اون رو در یک پشته قرار بدید و به هر پرانتز بسته که رسیدید میتونید موقعیت پرانتز باز متناظر رو از پشته بردارید.
در یک برنامه به مجموعه حافظههای stack تمام توابع stack segment میگن.
اما در پردازندههای ۸۰۸۶ stack segment مربوط یه رجیستر خاص هست که بخش با ارزش بالای stack pointer رو نگهداری میکنه. منظورم از ارزش بالا مثلا صدگان در مقابل دهگان و یکان هست.