ثبات پشتهای
ثبات پشتهای یک ثبات پردازنده مرکزی رایانه است که هدف آن پیگیری رد پشته فراخوانیها است. در یک دستگاه با معماری مبتنی بر باتری، این ثبات ممکن است یک ثبات اختصاص داده شده مانند SP بر روی یک Intel x86 باشد. در یک مجموعه ثبات معمولی، این ثبات پشته ای ممکن است یک ثبات که طبق قرارداد رزرو شدهاست باشد، مانند دستگاههای PDP-11 یا RISC. بعضی از طرحهایی مانند Data General Eclipse هیچ ثبات اختصاص داده شدهای ندارند، اما از یک آدرس رزرو شده حافظه سختافزاری برای این کار استفاده میکنند.
دستگاههای قبل از اواخر دهه 1960 — مانند PDP-8 و HP 2100 — کامپایلرهایی که از توابع بازگشتی پشتیبانی کنند، نداشتند. دستورالعملهای زیر مجموعه ای آنها معمولاً مکان فعلی را در آدرس پرش ذخیره میکردند و سپس شمارنده برنامه را به آدرس بعدی تنظیم میکردند.[1] در حالی که این سادهتر از مدیریت یک پشته است، از آنجا که تنها یک مکان بازگشت به ازای هر کد زیرمجموعه ای وجود دارد، پیادهسازی تابع بازگشتی بدون تلاش قابل توجه برنامهنویس ممکن نبود.
ماشین پشتهای دارای دو یا چند ثبات پشتهای است — یکی از آنها رد پشته فراخوانیها را نگه میدارد، دیگری (ان) رد پشته(ها) ی دیگر را دنبال می کنند.
ثبات پشتهای در x86
در ۸۰۸۶، ثبات پشتهای اصلی، اشاره گر پشته نامیده میشود (Stack Pointer -SP). ثباتِ قسمتِ پشته (Stack segment register -SS) معمولاً برای ذخیره اطلاعاتی در مورد بخش حافظه ای است که پشته فراخوانیها ی برنامه در حال اجرا، را ذخیره میکند. SP به بالای پشته فعلی اشاره دارد. بهطور پیش فرض، پشته در حافظه به سمت پایین رشد میکند، بنابراین مقادیر جدید در آدرس (خانه)های پایین حافظه قرار میگیرد. برای وارد کردن مقدار بر روی پشته، دستور PUSH
استفاده میشود. برای خارج کردن یک مقدار از روی پشته، دستور POP
استفاده میشود.
مثال: فرض کنید SS = 1000h و SP = 0xF820. این به این معنی است که بالای پشته فعلی، آدرس فیزیکی 0x1F820 است (به دلیل تقسیمبندی حافظه در ۸۰۸۶). دو دستورالعمل بعدی این برنامه عبارتند از:
PUSH AX
PUSH BX
- دستورالعمل اول باید مقدار ذخیره شده در AX (ثبات ۱۶ بیتی) را بر روی پشته قرار دهد. این کار با کم کردن مقدار ۲ (۲ بایت) از SP انجام میشود.
- مقدار جدید SP به 0xF81E تبدیل میشود. CPU سپس مقدار AX را در خانه ای از حافظه که آدرس فیزیکی آن 0x1F81E است کپی میکند.
- وقتی "PUSH BX" اجرا میشود، SP به 0xF81C تنظیم شده و BX در 0x1F81C کپی میشود.[2]
این نشان میدهد که PUSH چگونه کار میکند. معمولاً برنامه در حال اجرا ثباتها را بر روی پشته PUSH میکند تا از آنها برای اهداف دیگر استفاده کند، مانند فراخوانی یک سلسله کد که ممکن است مقادیر فعلی ثبتها را تغییر دهد. برای بازگرداندن مقادیر ذخیره شده در پشته، برنامه باید شامل دستورالعملهایی مانند زیر باشد:
POP BX
POP AX
POP BX
مقدار داخل ف 0x1F81C (که ارزش قدیم BX است) را به BX کپی میکند، سپس SP را با ۲ جمع میکند. SP در حال حاضر 0xF81E است.POP AX
مقداری داخل 0x1F81E را به AX کپی میکند، سپس SP را به 0xF820 تنظیم میکند.
نکته: این برنامه در ابتدا BX را از روی پشته خارج میکند، زیرا آخرین بار بر روی پشته قرار داده شد.
نکته: در ۸۰۸۶، دستورالعمل PUSH
و POP
فقط میتواند با عناصر ۱۶ بیتی کار کند.
محرک پشته
پردازندههای سادهتر اشاره گر پشته را در یک ثبات سختافزاری مرتب ذخیره میکنند و از واحد محاسبه و منطق (ALU) برای مدیریت ارزش آن استفاده میکنند. بهطور معمول گذاشتن در و برداشتن از پشته به چند عملیات زیر شاخه ای خلاصه میشود، بهطور جداگانه اشاره گر پشته را اضافه یا کم کردن، خواندن از یا ذخیره کردن در حافظه.[3]
پردازندههای جدیدتر دارای یک موتور پشته اختصاصی برای بهینهسازی عملیات پشتهای هستند. Pentium M اولین پردازنده x86 بود که یک موتور پشته را معرفی کرد. در پیادهسازی آن، نشانگر پشته در میان دو ثبات تقسیم میشود: ESP O، که یک ثبات ۳۲ بیتی است، و ESP d، مقدار دلتا ۸ بیتی است که بهطور مستقیم توسط عملیات پشته به روز میشود. کد دستورهای PUSH, POP, CALL و RET بهطور مستقیم با ثبات ESP d تعامل میکنند. اگر ESP d در شرف سرریز باشد یا ثبات ESP توسط دستورالعملهای دیگر (هنگامی که ESP d ≠ ۰) مورد استفاده قرار گرفتهاست، یک عملیات زیرشاخه همگام سازی وارد شدهاست که ESP O را با استفاده از ALU به روز میکند و ESP d را به ۰ برمیگرداند. این طرح بهطور عمده در پردازندههای بعدی Intel دست نخورده باقی ماندهاست، اگر چه ESP O به ۶۴ بیت گسترش یافتهاست.[4]
یک موتور پشته شبیه به مدل اینتل نیز در معماری میکرو AMD K8 پذیرفته شد. در Bulldozer، نیاز به عملیات زیر شاخه هماهنگ ساز حذف شد، اما طراحی داخلی موتور پشته شناخته نشدهاست.[4]
منابع
- David Salomon (February 1993). Assemblers and Loaders (PDF). Ellis Horwood Ltd. ISBN 0-13-052564-2. Retrieved 2008-10-01.
Most computers save the return address in either the stack, in one of the registers, or in the first word of the procedure (in which case the first executable instruction of the procedure should be stored in the second word). If the latter method is used, a return from the procedure is a jump to the memory location whose address is contained in the first word of the procedure.
- Howard, Brian. "Assembly Tutorial - Instructions". Computer Science Department, DePauw University. Retrieved 19 July 2013.
- Jon "Hannibal" Stokes (25 February 2004). "A Look at Centrino's Core: The Pentium M". archive.arstechnica.com. p. 5.
- Fog, Agner. "The microarchitecture of Intel, AMD and VIA CPUs" (PDF). Technical University of Denmark.