Visits: 212
در بخش مقدماتی در مورد حافظه پشته به اختصار توضیح داده شد و دیدیم حافظه پشته (Stack) در واقع بخشی از حافظه است که عملکرد آن صورت صف LIFO می باشد. در ریزپردازنده 8088/8086 حافظه پشته بخشی از حافظه اصلی سیستم است که به وسیله ثبات قطعه پشته (SS) آدرس دهی می شود. بنابراین حداکثر طول یک حافظه پشته برابر 64 کیلو بایت خواهد بود. (در نظر داشته باشید که طول یک قطعه حافظه برابر 64 کیلو بایت است) البته نکته مهم آنکه محتویات ثبات قطعه پشته را هم می توان تغییر داد یعنی تعداد پشته های سیستم محدود نبوده و در واقع ثبات SS بیانگر شروع یک قطعه حافظه به نام پشته است. ولی در هر زمان فقط یک پشته دسترس پذیر است. به همین دلیل اینجا برای ساده تر شدن بحث قرارداد می کنیم که فقط همان را به عنوان حافظه پشته در نظر بگیریم، یعنی بخشی از حافظه را که با محتویات جاری ثبات SS می توان دستیابی کرد.
در برنامه نویسی 8088/8086 به دو طریق می توان به حافظه پشته دسترسی پیدا کرد: یکی از طریق ثبات SP و دیگری از طریق آدرس دهی حافظه با ثبات BP. با استفاده از روش آدرس دهی از طریق ثبات BP ، تمام محل های حافظه پشته را می توان همانند محل های دیگر حافظه تلقی نمود و به راحتی به تک تک محل های آن دسترسی پیدا کرد، که در این بحث فعلا کاری با آن نداریم و بعدا مورد بررسی قرار خواهیم داد. (در فهرست مقالات سایت میکرو رایانه جستجو کنید) آنچه در اینجا بررسی می کنیم دستیابی به حافظه پشته از طریق SP است.
قبلا دیدیم که در حالت کلی ثبات SP آدرس بالای حافظه پشته را در بر دارد و به آخرین داده ایی که در پشته وارد شده اشاره می کند. با توجه به مفهوم آدرس دهی حافظه که در 8088/8086 وجود دارد، تاکید بر این نکته ضروری است که در این ریزپردازنده SP دارای آدرس موثر بالای حافظه پشته (آخرین داده وارد شده) است و ثبات قطعه مورد استفاده در آدرس دهی ثبات SS است.
همانند بسیاری از پردازنده ها، SP با رشد منفی آدرس های حافظه، رشد می یابد. به عبارت واضح تر در این ریزپردازنده وقتی بحث از حافظه پشته به میان می آید، آدرس محل بعدی که قرار است داده ی جدیدی در آن وارد شود، دارای آدرس کمتری از محل فعلی خواهد بود. به این ترتیب حافظه پشته از آدرس بالاتر شروع شده و به ترتیب آدرس های آن کم می شود تا به حدپایینی آدرس برسد. توجه به این نکته ضروری است که کاهش آدرس در موقع نوشتن داده ها در بالای حافظه پشته اتفاق می افتد (عمل PUSH) و بدیهی است که در موقع خواندن داده ها (POP) تغییر آدرس ها معکوس و افزایشی است، البته چون در حین POP پشته رشد نیافته و از طول پشته کم می شود، به همین دلیل همچنان همان تعریف (که رشد آدرس ها منفی است) به قوت خود باقی خواهد بود.
بالای حافظه پشته که به اختصار TOS نامیده می شود (Top Of Stack)، در واقع محلی است که آخرین داده وارد شده به پشته در آنجا قرار دارد و به اصطلاح آن محل حافظه ی پشته، پُر است و اگر داده جدیدی بخواهد وارد پشته گردد باید ابتدا این آدرس کاهش یابد تا به محل جدید دسترسی به وجود آید و بعد داده جدید در آنجا وارد شود (PUSH). این آدرس TOS در ریزپردازنده 8088/8086 از ترکیب محتویات دو ثبات SS و SP به وجود می آید (SS:SP) که ثبات SP آدرس موثر TOP را در خود دارد. توجه داشته باشید که این محل را با حد بالای حافظه پشته؛ که مشخص کننده آخرین محلی است که داده ها در آن محل به عنوان حافظه پشته می توانند قرار گیرند و بعد از آن محل حافظه پشته وجود ندارد؛ اشتباه نکنید.
در بخش «چگونگی ذخیره داده ها در حافظه» در مورد ذخیره سازی داده های 16 بیتی در حافظه بحث کردیم و دیدیم که در حالت کلی برای ذخیره داده های 16 بیتی، هشت بیت کم ارزش داده ها در آدرس کوچکتر و هشت بیت پرارزش آنها در آدرس بزرگتر ذخیره می شود. (در فهرست مقالات سایت میکرو رایانه جستجو کنید) حال می خواهیم نحوه ذخیره سازی داده ها در حافظه پشته را مورد بررسی قرار دهیم.
همانطوریکه اشاره شد در حافظه پشته موقع ذخیره سازی داده ها (PUSH) رشد آدرس ها منفی است و مقدار SP کاهش می یابد و نیز بعدا خواهیم دید دستورالعمل هایی که به بالای حافظه پشته دسترسی دارند، فقط می توانند 16 بیت داده را جابجا نمایند. بنابراین برای هر بار ذخیره داده ها در حافظه پشته لازم است ابتدا مقدار SP دو واحد کم شده و بعد با همان قراردادی که در مورد ذخیره سازی داده ها بحث کردیم، 16 بیت داده مورد نظر در محل جدید نوشته شود.
2- 16 بیت داده مورد نظر در این آدرس جدید حافظه پشته، نوشته می شود. نحوه نوشتن نیز به همان ترتیب نوشتن در حافظه در حالت کلی است یعنی هشت بیت کم ارزش در آدرس کوچکتر و هشت بیت پرارزش در آدرس بزرگتر نوشته می شود.
بعد از پایان عملیات انتقال داده به پشته، SP به آخرین داده ایی که در آنجا قرار داده شده ، اشاره خواهد کرد. (ویژگی پشته: LIFO)
مثال1) به عنوان مثال حافظه پشته شکل زیر را در نظر بگیرید:
در این شکل ابتدا آدرس بالای حافظه پشته برابر 1150:0006H است. اگر بخواهیم 16 بیت داده موجود در ثبات BX (یعنی عدد 6255H) را در حافظه پشته شکل (1-الف) وارد کنیم (PUSH)، شکل (1-ب) به دست می آید. همانطوریکه می بینید اول TOS جدید محاسبه شده و بعد محتویات ثبات BX به ترتیبی که ذکر آن گذشت در محل TOS جدید وارد شده است.
بدیهی است که برای خواندن داده ها از حافظه پشته (عمل POP) ، عملیات خواندن برعکس عملیات نوشتن انجام گیرد. اولین و مهمترین آن رشد آدرس هاست. به این معنی که موقع خواندن داده ها از حافظه پشته، رشد آدرس ها مثبت خواهد بود (معکوس حالت قبلی). دومین نکته آن است که در هر حال SP به آخرین داده ی 16 بیتی اشاره می کند و لذا لازم است ابتدا داده ی مورد نظر خوانده شده و بعد مقدار SP تصحیح (افزایش) یابد.
1- ترکیب دو آدرس SS:SP ، یک آدرس فیزیکی حافظه پشته را مشخص می کند. (به توضیح آدرس فیزیکی در فهرست مقالات سایت میکرو رایانه مراجعه کنید.) بنابراین 16 بیت داده از این آدرس و طبق آنچه که قبلا دیدیم، خوانده می شود. (هشت بیت کم ارزش از آدرس کوچکتر و هشت بیت پرارزش از آدرس بزرگتر خوانده می شود.)
2- محتویات ثبات SP دو واحد افزایش می یابد و بنابراین ترکیب SS:SP به محل جدیدی اشاره خواهد کرد که TOS جدید است.
مثال 2) به عنوان مثال حافظه پشته شکل زیر را در نظر بگیرید:
در این شکل ابتدا آدرس بالای حافظه پشته برابر 1150:0002H است. یعنی TOS فعلی به آخرین داده اشاره می کند. پس ابتدا از این آدرس 16 بیت داده به ترتیبی که گفته شد خوانده شده و در ثبات AX وارد می شود. بعد از آن مقدار TOS دو واحد افزوده شده و مطابق شکل برابر 1150:0004H خواهد شد. توجه کنید همانطوریکه در شکل معلوم است داده خوانده شده همچنان در حافظه باقی مانده ولی دیگر از طریق TOS نمی توان به آن دسترسی داشت.
————————————-
* تاکید می شود که این مطلب صرفا برای حالتی که آدرس دهی از طریق SP بوده و از طریق دستوراتی نظیر PUSH ، CALL ، INT و غیره به بالای حافظه پشته دسترسی داریم، صادق است.
منبع: microrayaneh.com