بازدیدها: 75
اینک بعد از بحث های مفصلی که در مورد ساختمان داخلی و عملکرد اجزاء آن داشتیم، می توان دوباره از دیدگاه کلی به بررسی عملکرد ریزپردازنده پرداخت و جمع بندی لازم را ارائه نمود. دیدیم که 8088/8086 از دو واحد اصلی EU و BIU تشکیل یافته است. پس از آنکه ریزپردازنده شروع به کار نمود اجرای برنامه ها از یک آدرس مشخص و از قبل تعیین شده آغاز خواهد شد. (بعدا خواهیم دید که اگر ریزپردازنده در ابتدای شروع به کار باشد، پس از عمل Reset می توان کنترل اجرای برنامه را به هر آدرسی ارجاع داد و این کار به راحتی با قرار دادن دستورالعمل پرش در ناحیه اختصاصی مربوط به Reset امکان پذیر است.)
می دانیم که محتویات ثبات IP در هر زمان به دستورالعمل بعدی که باید از حافظه واکشی شود، اشاره می کند. بنابراین در اولین مرحله محتویات ثبات IP همراه با ثبات CS یک آدس فیزیکی حافظه را به دست خواهند داد که اولین دستورالعمل از آنجا واکشی شده و در داخل صف دستورالعمل ها قرار خواهد گرفت و پس از این عمل، مقدار IP بسته به طول دستورالعملی که واکشی شده، افزایش خواهد یافت.
صف دستورالعمل ها متشکل از یک سری ثبات است که به صورت صف FIFO عمل می کند یعنی اولین دستورالعملی که وارد این صف گردد، اول نیز از آن خارج خواهد شد. طول این صف در 8086 برابر شش بایت و در 8088 برابر چهار بایت است. تا موقعی که گذرگاه سیستم برای استفاده سایر عملیات، مورد نیاز نباشد عمل واکشی دستورالعمل ها از حافظه تا پُر شدن این صف همواره ادامه خواهد داشت و این عمل صرفنظر از اینکه آیا دستورالعمل بعدی که در حال واکشی شدن از حافظه است مورد نیاز خواهد بود یا نه، انجام می شود. یعنی تا موقعی که صف دستورالعمل ها خالی است و BIU نیز کنترل گذرگاه را بر عهده دارد، واکشی دستورالعمل ها از حافظه ادامه خواهد یافت.
از طرف دیگر به موازات آن، واحد EU دستورالعمل ها را از جلو این صف برداشته و آنها را پس از رمز گشایی اجرا خواهد نمود. اگر نیاز به انشعاب یا پرش وجود داشته باشد با اصلاح و تغییر مقدار IP (و در صورت لزوم CS) به آدرس مورد نظر، دستیابی به گذرگاه را به اطلاع واحد BIU خواهد رساند و دستورالعمل ها از محل جدید واکشی خواهند شد. البته واضح است که در این صورت دستورالعمل های قبلی (که قبلا واکشی شده و در صف قرار دارند و هنوز اجرا نشده اند) مورد نیاز نبوده و از بین خواهند رفت. و همچنین اگر نیاز به دستیابی داده وجود داشته باشد از طریق واحد BIU اخذ خواهد شد.
قبلا ذکر کردیم که دلیل این دو عمل موازی و همزمان، افزایش سرعت عملکرد و بهبود کارآیی ریزپردازنده است. البته اگرچه وقتی یک دستورالعمل انشعاب یا پرش اجرا می گردد، دستورالعمل های موجود در صف دستورالعمل ها دور ریخته می شوند و در این حالت عملا هیچ زمانی صرفه جویی نشده است ولی اگر به طور متوسط در کل طول برنامه آن را در نظر بگیریم این اعمال درصد کوچکی از زمان را به خود اختصاص می دهد.
مثلا دستورالعمل ضرب را در نظر بگیرید. این دستورالعمل برای عمل ضرب 8 بیتی حداقل نیاز به 70 پالس ساعت دارد، یعنی اجرای آن حداقل 70 پالس ساعت طول می کشد، در صورتی که خواندن یک کلمه 16 بیتی از حافظه فقط نیاز به چهار پالس ساعت دارد. یعنی در حین اجرای دستورالعمل ضرب مذکور که در واحد اجرا صورت می گیرد، واحد BIU به اندازه کافی فرصت دارد که دستورالعمل ها را از حافظه واکشی کرده و صف دستورالعمل ها را پُر کند.
در این مثال عملکرد ریزپردازنده 8088/8086 نسبت به ریزپردازندهء معمولی که فاقد صف دستورالعمل هاست ولی از نظر سرعت همانند آن است مورد مقایسه قرار می گیرد.می توان برای راحتی بحث، خود ریزپردازنده 8088/8086 را در نظر گرفت که فاقد صف دستورالعمل ها باشد. در شکل (1) نحوه عمل این دو نشان داده شده است.
در این شکل به عنوان مثال اجرای سه دستورالعمل در نظر گرفته شده و فرض بر آن است که ابتدا CPU در حال اجرای دستورالعملی بوده و بعد از آن عمل نوشتن انجام شده و سپس اجرای دستورالعمل دوم آغاز گردیده و بعد CPU عمل خواندن را انجام داده و سرانجام مشغول اجرای دستورالعمل سوم شده است.
همانگونه که در شکل مشخص شده، در حالت اول، یعنی ریزپردازنده بدون وجود صف دستورالعمل ها، گذرگاه آن فقط در بعضی زمان ها اشغال است و حداکثر دو اجرا صورت پذیرفته است. در حالی که در حالت دوم، یعنی وقتی ریزپردازنده دارای صف دستورالعمل ها باشد (8088/8086)، گذرگاه در تمام زمان ها اشغال بوده به طوری که یا واحد اجرا بدان نیاز داشته تا عمل خواندن و نوشتن صورت گیرد و یا آنکه واحد BIU مشغول واکشی دستورالعمل از حافظه بوده است. (لازم به ذکر است که در این مثال خاص، گذرگاه در تمام اوقات اشغال بوده است)
همانطوری که ملاحظه می شود در ریزپردازنده 8088/8086 علاوه بر آن که سه دستورالعمل مورد بحث اجرا شده، یک بایت از کدهای دستورالعمل بعدی نیز وارد صف شده و با این وجود زمان صرف شده کمتر از ریزپردازنده مشابه بدون صف است.
این بحث خاص ریزپردازنده 8086 است و در مورد ریزپردازنده 8088 مورد ندارد. هر چند ریزپردازنده 8086 برای آدرس دهی 16 بیتی می تواند هم از آدرس های فرد و هم از آدرس های زوج شروع به آدرس دهی نماید، ولی چنانکه خواهیم دید برای آدرس دهی 16 بیتی، اگر آدرس از عدد زوج شروع شده باشد یک بار مراجعه به حافظه کافی است ولی اگر آدرس دهی از عدد فرد صورت گیرد، به ناچار دو بار باید عمل مراجعه به حافظه جهت واکشی صورت گیرد: (برای عمل نوشتن نیز همینطور است) یک بار مراجعه برای دستیابی هشت بیت کم ارزش داده و یک بار مراجعه به حافظه برای دستیابی به هشت بیت پرارزش آن. این بدان معنی است که اگر ذخیره کلمات (کلمه یعنی 16 بیت) از آدرس های زوج حافظه صورت گرفته باشد در زمان مراجعه به حافظه صرفه جویی زیادی وجود خواهد داشت.
در مورد داده ها عملکرد ریزپردازنده 8086 به همان صورتی است که ذکر آن گذشت، ولی در واکشی دستورالعمل ها از حافظه، ریزپردازنده 8086 به طور اتوماتیک سعی در رفع این نقیصه می نماید. بدین معنی که اگر عمل واکشی دستورالعمل ها از حافظه، از آدرس های زوج انجام گیرد این عمل به طور عادی ادامه می یابد و ریزپردازنده قادر است به صورت کلمات 16 بیتی آنها را از حافظه واکشی کرده و در صف دستورالعمل ها قرار دهد و مسئله فوق در این مورد مشکلی ندارد. (توضیحات بیشتر در مقالات میکرو رایانه)ولی اگر از آدرس فرد حافظه عمل واکشی دستورالعمل انجام گیرد. (مثلا حالتی را فرض کنید که در اثر دستورالعمل پرش یا انشعاب به آدرس فرد حافظه ارجاع داده شده باشد.) در این حالت اگر عمل خواندن از حافظه همانند حالت قبل همواره به صورت کلمه به کلمه (16 بیتی) انجام گیرد، مقدار زیادی از وقت BIU تلف خواهد شد، چون دستورالعمل ها همواره از آدرس فرد واکشی شده و عملا برای هر هشت بیت نیاز به مراجعه به حافظه وجود خواهد داشت.
ریزپردازنده 8086 برای رفع این مشکل به این صورت عمل می نماید که وقتی واکشی دستورالعمل ها در اثر انشعاب یا غیره به آدرس فرد منجر شود، واحد BIU در ابتدا فقط یک بایت را واکشی می کند (به جای یک کلمه) و بعد از آن (که آدرس فرد تبدیل به آدرس زوج شد) شروع به واکشی دستورالعمل ها به صورت کلمه به کلمه می نماید. البته اگر در این حالت در صف دستورالعمل ها جایی برای وارد شدن 16 بیت نباشد تا خالی شدن آن صبر می نماید.
این مثال مختص ریزپردازنده 8086 است و به 8088 مربوط نمی شود. فرض کنید که سه دستورالعمل توسط واحد BIU از حافظه واکشی شده و در صف دستورالعمل ها قرارگیرد. طول دستورالعمل اول را یک بایت و طول دستورالعمل دوم را دو بایت و طول دستورالعمل سوم را سه بایت در نظر بگیرید. در این صورت بسته به آنکه آدرس شروع این دستورالعمل ها در حافظه، فرد یا زوج باشد دو حالت مختلف پیش می آید که در شکل (2) نشان داده شده است.
در شکل (ب) فرض شده که آدرس شروع دستورالعمل ها در حافظه، آدرس زوج باشد. در این صورت واحد BIU کدهای دستورالعمل ها را به صورت کلمه به کلمه خوانده و آنها را در صف قرار می دهد. بنابراین در اولین واکشی، هم دستورالعمل اول وارد صف خواهد شد (چون طول آن یک بایت است) و هم بایت اول از دستورالعمل دوم. در دومین واکشی بایت دوم دستورالعمل دوم و بایت اول دستورالعمل سوم وارد صف می شوند. و بالاخره در سومین واکشی دو بایت باقیمانده دستورالعمل سوم هم وارد صف می شوند.
در شکل (ج) فرض شده که آدرس شروع سه دستورالعمل مذکور در حافظه، آدرس فرد باشد. در این حالت CPU همان روشی را که بررسی کردیم اجرا می کند، یعنی ابتدا برای آنکه به آدرس زوج برسد فقط یک بایت را واکشی می کند، که در این مثال همان دستورالعمل اول نیز هست. پس از آن به آدرس های زوج دسترسی خواهد داشت و شروع به واکشی یک کلمه از آدرس زوج می نماید که در اینجا اتفاقا دو بایت مربوط به دستورالعمل دوم است. در واکشی سوم دوباره یک کلمه را از حافظه واکشی می نماید که در این مثال دو بایت اول دستورالعمل سوم است و البته هنوز دستورالعمل سه بایتی مورد نظر به طور کامل وارد صف نشده، ولی چون در صف دستورالعمل ها فقط به اندازه یک بایت جای خالی وجود دارد، واحد BIU صبر می کند تا دستورالعمل ها توسط واحد EU از صف برداشته شده و اجرا گردند و پس از خالی شدن صف (به اندازه یک بایت دیگر) کلمه بعدی را از حافظه واکشی خواهد کرد.
به این ترتیب استفاده از این روش واکشی دستورالعمل ها از حافظه، باعث افزایش سرعت واکشی دستورالعمل هایی خواهد شد که شروع آنها از آدرس فرد است. در حالت شروع از آدرس های زوج، روند به طور عادی و واکشی به صورت کلمه به کلمه انجام خواهد یافت.
منبع: microrayaneh.com