واکشی، رمزگشایی، اجرا: حلقهای که همهچیز رو اجرا میکنه
چرخهی سهضربیای رو که پردازنده برای هر دستور تکرار میکنه قدمبهقدم جلو ببر، ببین شمارندهی برنامه چطور جاش رو نگه میداره، و یه پرش چطور حلقه و تصمیمگیری رو ممکن میکنه.
شمارندهی برنامه (Program Counter)
یه رجیستر مخصوص داخل پردازنده که آدرس دستور بعدی رو نگه میداره. بعد از هر دستور معمولی میره سراغ دستور بعدی؛ توی پردازندهی اسباببازی ما که هر دستور ۴ بایته، یعنی ۴ تا بهش اضافه میشه. بهاختصار بهش PC میگن.
PC = 8 یعنی «دستور بعدی همونیه که توی آدرس ۸ ذخیره شده». توی برنامهی اسباببازی ما این همون ADD R3,R1,R2ـه.
چرخه، تا ابد
- واکشی (Fetch)
دستوری رو که توی آدرسِ داخل PC هست از حافظه بخون و توی رجیستر دستور (Instruction Register)، که بهش IR میگن، داخل CPU کپی کن.
- رمزگشایی (Decode)
واحد کنترل میفهمه این بایتها یعنی چی: کدوم عملیات، کدوم رجیسترها، کدوم آدرس.
- اجرا (Execute)
ALU یا حافظه کار رو انجام میده و نتیجه برگردونده میشه، توی یه رجیستر یا توی حافظه.
- برو جلو و تکرار کن
PC میره سراغ دستور بعدی و حلقه دوباره شروع میشه، میلیاردها بار در ثانیه. حتی وقتی کامپیوتر بیکار به نظر میاد، سیستمعامل داره دستور اجرا میکنه، یا به CPU گفته بخوابه تا یه اتفاقی بیفته.
خودت رو امتحان کن
پردازنده هر دستور رو به چه ترتیبی انجام میده؟
- اجرا، واکشی، رمزگشایی
- رمزگشایی، واکشی، اجرا
- واکشی، رمزگشایی، اجرا
- واکشی، اجرا، رمزگشایی
جواب رو ببین
واکشی، رمزگشایی، اجرا
درسته. اول دستور رو از حافظه واکشی میکنه، بعد رمزگشایی میکنه که یعنی چی، بعد اجراش میکنه. بعد PC میره جلو و دوباره از اول.
یه انگشت روی دستور پخت
فکر کن داری یه دستور پخت طولانی رو دنبال میکنی و انگشتت روی خط فعلیه. خط رو میخونی (واکشی)، میفهمی چی میخواد (رمزگشایی)، انجامش میدی (اجرا)، بعد انگشتت رو یه خط میبری پایین. شمارندهی برنامه همون انگشته. گاهی یه خط میگه «برگرد به قدم ۳ و تکرار کن تا خمیر صاف بشه»، و انگشتت بهجای پایین رفتن میپره بالا. جایی که تشبیه میلنگه: پردازنده هیچوقت جلوتر رو سرسری نگاه نمیکنه یا کل دستور رو نمیخونه؛ فقط خطی رو میبینه که زیر انگشتشه.
خودت رو امتحان کن
شمارندهی برنامه چی نگه میداره؟
- تعداد دستورهایی که تا حالا اجرا شدن
- آدرس دستور بعدی که باید اجرا بشه
- نتیجهی آخرین حساب
- کل برنامه، آمادهی اجرا
جواب رو ببین
آدرس دستور بعدی که باید اجرا بشه
درسته. برخلاف اسمش، نمیشمره چند تا دستور اجرا شده. آدرسی رو نگه میداره که واکشی بعدی ازش میخونه.
قدمبهقدم ببین

واکشی حافظه دستورهای LOAD، LOAD، ADD و STORE رو توی آدرسهای ۰، ۴، ۸ و ۱۲ نگه داشته. PC عدد ۸ رو نشون میده، پس خونهی ADD توی آدرس ۸ روشن میشه و کل دستورش، یعنی ADD R3,R1,R2، با یه فلش توی رجیستر دستور (IR) کپی میشه. توی حلقهی بالا سمت راست، F یعنی واکشی روشنه.

رمزگشایی دستوری که توی IRـه به تیکههاش شکسته میشه: ADD، R3، R1، R2. خطهایی از واحد کنترل به R1، R2 و ALU روشن میشن: یه جمعه، با R1 و R2، و جواب میره توی R3. توی حلقه، D یعنی رمزگشایی روشنه.

اجرا مقدارهای ۷ و ۵ از R1 و R2 میرن توی ALU، و ۱۲ بیرون میاد و میره توی R3. توی حلقه، E یعنی اجرا روشنه. کار این یه دستور تموم شد.

PC میره جلو، و دوباره از اول PC از ۸ به ۱۲ تغییر میکنه، یعنی دستور ۴ بایتی بعدی، و نور میره روی خونهی STORE. حلقه برمیگرده روی F و STORE R3,[22] توی IR واکشی میشه، در حالی که R3 هنوز ۱۲ رو نگه داشته. چرخه همینطوری میچرخه، میلیاردها بار در ثانیه.
خودت رو امتحان کن
توی پردازندهی اسباببازی ما هر دستور ۴ بایته. همین الان یه دستور معمولی (غیرپرشی) توی آدرس ۱۲ اجرا شده. PC الان چنده؟
- ۱۳
- ۱۶
- ۱۲
- ۴
جواب رو ببین
۱۶
درسته. هر دستور ۴ بایت جا میگیره، پس دستور بعدی ۴ آدرس بعد شروع میشه: ۱۲ + ۴ = ۱۶.
پرشها
یه خط صاف چطور میشه حلقه و تصمیم
دستور پرش (Jump) بهجای دستور بعدی، PC رو روی یه آدرس دیگه تنظیم میکنه، پس پردازنده از یه جای دیگه ادامه میده. پرش شرطی (Conditional Branch)، مثل «اگه صفر نیست بپر»، فقط وقتی میپره که یه شرط برقرار باشه؛ وگرنه PC مثل همیشه میره جلو. همین دو تا برای ساختن هر حلقه و هر if/else توی هر برنامهای که تا حالا باهاش کار کردی کافیه.
«اگه رمز اشتباهه، بپر به پیام خطا؛ وگرنه برو صفحهی اصلی» یعنی یه مقایسه و یه پرش شرطی.
; R1 starts at 3
40: SUB R1, R1, 1 ; R1 = R1 - 1
44: JNZ R1, 40 ; if R1 is not 0, set PC = 40
48: ... ; carry onR1: 3 → 2 → 1 → 0
SUB سه بار اجرا شد؛ روی صفر پرش انجام نمیشه و PC میره سراغ ۴۸SUB و JNZ (اگه صفر نیست بپر) دو تا دستور اضافهی پردازندهی اسباببازیان. این حلقه چیزی نیست جز اینکه PC هر بار برگردونده بشه به ۴۰ تا وقتی شرط دیگه برقرار نباشه.
خودت رو امتحان کن
کدوم نوع دستور ساختن حلقه رو ممکن میکنه؟
- ADD
- LOAD
- یه پرش شرطی
- STORE
جواب رو ببین
یه پرش شرطی
درسته. پرش شرطی تا وقتی یه شرط برقراره PC رو به یه آدرس قبلی برمیگردونه، پس همون دستورها دوباره اجرا میشن، و وقتی شرط دیگه برقرار نباشه حلقه رو تموم میکنه.
خودت رو امتحان کن
پردازنده قبل از اجرای یه برنامه کلش رو میخونه و میفهمه برنامه میخواد چیکار کنه.
جواب رو ببین
نادرست
غلطه. پردازنده هیچوقت برنامه رو بهشکل یه کل نمیبینه یا «نمیفهمه». فقط به همون یه دستوری نگاه میکنه که PC بهش اشاره میکنه: واکشیش کن، رمزگشاییش کن، اجراش کن، برو جلو.
مرور درس
- شمارندهی برنامه (PC) آدرس دستور بعدی رو نگه میداره.
- هر دستور از واکشی (خوندنش توی IR)، رمزگشایی (فهمیدن معنیش) و اجرا (انجامش) رد میشه.
- بعد از یه دستور معمولی PC میره سراغ دستور بعدی: با دستورهای ۴ بایتی، ۸ میشه ۱۲.
- پرش PC رو میبره یه جای دیگه؛ پرش شرطی فقط وقتی یه شرط برقراره این کار رو میکنه، و همین حلقه و if/else رو ممکن میکنه.
- پردازنده همیشه فقط یه دستور رو میبینه؛ خط لوله مرحلهها رو روی هم میندازه تا در هر ثانیه دستورهای بیشتری تموم بشن.