ثبات های CPU
ثبات های CPU یا رجیسترهای پردازنده (CPU Registers) قسمتی از سریعترین و نزدیک ترین حافظه داخلی CPU است که وظیفه حفظ داده هایی که CPU درحال پردازش آن هاست را دارد.
ثباتهای پردازنده (CPU Registers) چیست؟
ثبات ها یا Register های CPU قسمتی از حافظه موقتی داخلی پردازنده هستند که وظیفه حفظ دادههایی را دارند که CPU درحال حاضر درحال کار بر روی آن هاست. به همین دلیل به نام CPU Working Memory (حافظه کاری پردازنده) و CPU Workspace (میزکار پردازنده) نیز خوانده میشوند. ثباتها بسیار سریعتر از سایر حافظهها هستند؛ زیرا CPU همیشه درحال کار بر روی آنهاست و سرعت کم آن به همان اندازه باعث کاهش سرعت پردازنده میشود. ثباتها با ذخیره کردن دادهها یا آدرسها میتوانند عمل پردازش را بسیار سریعتر کنند.
به طور کلی ثبات ها میتوانند شامل موارد زیر باشند:
- داده: پردازنده میتواند دادههایی که شامل اعداد (در برخی از معماریهای جدیدتر دادهها میتوانند کاراکتر یا آرایه نیز باشند) هستند را در ثباتهای خود ذخیره کند.
- آدرس: ثباتها میتوانند شامل آدرسهای مربوط به دادهها در حافظه اصلی باشند.
رجیسترهای پردازنده به عنوان یک حافظه داخلی، نزدیکترین دسترسی به واحد پردازشی CPU و در بالاترین قسمت سطوح انتزاعی حافظهها از لحاظ دسترسی به CPU قرار دارند و پس از آن، حافظه نه
ان داخلی پردازنده.
انواع ثباتهای CPU:
ثباتهای موجود در پردازنده را میتوان به صورت کلی به 2 گروه زیر تقسیم کرد:
- ثباتهای قابل دسترسی (User Accessible Registers): این نوع رجیسترها توسط کاربر با استفاده از دستورات قابل دسترسی هستند.
- ثباتهای داخلی / غیرقابل دسترسی (Internal Registers): این نوع رجیسترها توسط کاربر غیرقابل دسترسی هستند و تنها به وسیله خود پردازشگر در عمل پردازش قابل دسترسی اند.
از ثباتهای قابل دسترسی مهم میتوان به موارد زیر اشاره کرد:
- ثباتهای عمومی (General Purpose Registers): این نوع ثباتها توسط کاربر قابل دسترسی و تغییر هستند و میتوانند شامل دادههای عملوند یا آدرسها باشند.
- ثباتهای ویژه (Special Purpose Registers): این نوع ثباتها به صورت مستقیم توسط کاربر قابل دسترسی نیستند و مخصوص خود پردازنده اند. برای مثال، ثباتهای ویژه میتوانند شامل Program Counter (به اصطلاح PC) باشد که وظیفه آدرس دهی دستورات برای پردازش را دارد
- شمارنده برنامه (Program Counter): این ثبات آدرس دستور بعدی در حافظه اصلی که باید پردازش شود را درخود نگه میدارد و معمولاً پس از دریافت هر دستور، به مقدار آن عدد 1 افزوده میشود تا نشان دهنده آدرس بعدی باشد.
موضوع اصلی این مقاله ثباتهای عمومی (جزو ثباتهای قابل دسترسی) هستند. از ثباتهای داخلی / غیرقابل دسترسی نیز میتوان به موارد زیر اشاره کرد:
- ثبات دستوری (Instruction Register): این ثبات در برخی از پردازندهها (مانند Intel i7) توسط دستورات قابل دسترسی است. ثبات دستوری، دستور بعدی پردازشی را درخود نگه میدارد. این دستور معمولاً به خاطر دلایل امنیتی رمزگذاری شده و در این ثبات رمزنگاری میشود.
- ثبات آدرس حافظه اصلی (Memory Address Register): این ثبات وظیفه حفظ آدرس مربوط به هر نوع آیتم درخواست شده (آدرس مربوط به یک داده یا یک دستور) را برای نوشتن به یا خواندن از حافظه دارد.
- ثبات بافر حافظه (Memory Buffer Register): این ثبات وظیفه حفظ دادهها به صورت موقت درهنگام ارسال به حافظه یا دریافت از آن را دارد.
- ثبات داده حافظه (Memory Data Register): دادهها پس از دریافت به وسیله ثبات بافر حافظه، در این ثبات تا زمانی که تغییر داده نشوند، نگه داری میشوند.
نکته: تفاوت بین Program counter و Memory address register در این است که شمارنده برنامه تنها آدرس مربوط به دستورات را درخود نگه میدارد اما ثبات آدرس حافظه اصلی هر نوع آدرسی (داده یا دستور) را میتواند نگه دارد. پردازشگر از آدرس شمارنده برنامه برای دریافت دستورات بعدی استفاده میکند.
نکته: ثباتهای متفاومی ممکن است در CPU بسته به نوع طراحی آن وجود داشته باشد.
هر پردازنده دارای تعداد مشخصی ثبات (Register) است که بسیار سریعتر از سایر حافظهها (برای مثال حافظه Cache و…) اما محدود هستند. برای مثال، در پردازنده Intel i7 که از معماری x86 و طراحی CISC استفاده میکند، تنها 8 رجیستر در حالت 32 بیت و 16 رجیستر در حالت 64 بیت قابل استفاده هستند. نامهای ثباتهای عمومی 32 بیت در این پردازنده به شرح زیر است (طبق گفته وبسایت رسمی اینتل در پست “راهنمای معماری برای توسعه نرمافزاری”):
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
ثباتها چه وظیفهای دارند؟
میتوان گفت ثباتها مهمترین و کاربردی ترین حافظه در امر پردازش هستند؛ زیرا بسیاری از دستورات نمیتوانند به صورت مستقیم توسط واحد پردازشی CPU پردازش شده و خروجی را تحویل دهند. این دستورات نیازمند پردازش دستور یا دستوراتی دیگر قبل از ارائه خروجی هستند. در این حالت، CPU با استفاده از واحد اسمبلر (Assambler Unit، به معنای واحد تبدیل کننده به اسمبلی) دستور اصلی را به مجموعهای از دستورات تبدیل میکند. مجموعه دستورات بدست آمده، دستورات فرعی نام دارند.
نکته: در برنامههای نوشته شده به زبان اسمبلی، برنامه نویس میتواند به صورت مستقیم به ثباتهای عمومی دسترسی داشته باشد. بنابراین واحد اسمبلر از پروسه پردازش کنار گذاشته میشود. تنها در زبان سطح پایین اسمبلی میتوان به رجیسترها به صورت مستقیم دسترسی داشت و در سایر زبانهای سطح بالا، کامپایلرها و واحد اسمبلر این وظیفه را بر عهده دارند.
در ادامه پروسه پردازش، پردازنده هر یک از دستورات فرعی را با استفاده از واحد ALU (مخفف Arithmetic & Logic Unit و به معنای واحد محاسبه و منطق) پردازش کرده و نتیجه خروجی را در یکی از ثباتهای خود ذخیره میکند. هر یک از دستورات فرعی ممکن است بر خروجی دستور فرعی دیگر تاثیر بگذارد. به همین دلیل، ثباتها برخلاف سایر حافظهها به صورت منطقی (Logic) کار میکنند؛ یعنی یک ثبات میتواند بر ثبات دیگر اثر بگذارد. بنابراین ثباتها وظیفه دارند تا خروجیهای هر یک از دستورات فرعی را درخود (به صورت موقت) ذخیره کنند.
برای مثال، فرض کنید میخواهیم دستور زیر را پردازش کنیم. این دستور با استفاده از زبانی سطح بالاتر مانند C نوشته شده است:
y = x + z;
دستور ما به این صورت است که مقادیر دو عدد z و x با هم جمع شده، سپس در متغیر y قرار میگیرد. این دستور توسط زبانی به غیر از اسمبلی نوشته شده است. بنابراین واحد اسمبلر این دستور را به مجموعهای از دستورات فرعی تبدیل میکند: (فرض کنید که این دستورات بر روی پردازنده اینتل i7 با طراحی CISC پردازش میشوند)
LOAD EAX, LOC_X
LOAD EBX, LOC_Z
ADD EAX, EBX
STORE EAX, LOC_Y
نکته: این دستورات تنها برای آشنایی با نحوه عملکرد ثباتها نوشته شده اند و زبانهای نوشته شده خارج از بحث این مقاله هستند. همچنین تقسیم شدن دستورات به طراحی پردازنده (RISC و CISC، دو طراحی رایج) نیز بستگی دارد.
حال دستور اصلی به مجموعهای از دستورات فرعی شامل 4 دستور جدید تبدیل شده است. مقادیر LOC_X ، LOC_Y و LOC_Z آدرسهای دادههای مربوط به هریک از متغیرها در حافظه اصلی (RAM) است. مقادیر EAX ، EBX نیز رجیسترهای پردازنده هستند که مورد استفاده قرار گرفته اند.
درخط اول، پردازنده مقدار موجود در آدرس LOC_X در حافظه اصلی را خوانده سپس در رجیستر EAX قرار میدهد. در خط دوم نیز به همین ترتیب، مقدار موجود در آدرس LOC_Z حافظه اصلی را در رجیستر EBX قرار میدهد. در خط سوم، پردازنده مقدار موجود در ثبات EBX را به ثبات EAX اضافه میکند. این عملیات جمع یک طرفه است. یعنی مقدار ثبات EAX بر EBX اضافه نمیشود (در حالت سادهتر: EAX = EAX + EBX). حال در ثبات EAX مقدار جمع شده معادله مورد نظر قرار دارد. برای آن که بتوان از این مقدار استفاده کرد آن را در حافظه اصلی، در آدرس LOC_Y قرار میدهیم. حال عملیات پردازش y = x + z به اتمام رسیده و خروجی مورد نظر، بدست آمده است.
همانطور که میبینید، در این دستور، پردازشگر از دو ثبات خود استفاده کرده است. تعداد ثباتها معمولاً برای انجام دستورات کافی هستند. در غیر این صورت، پردازشگر مجبور میشود تا از حافظه اصلی استفاده کند.