مقاله های سیسوگ, توصیه شده

دستور های جدید CPU هشت بیتی – بخش چهارم CPU هشت بیتی

CPU هشت بیتی قسمت چهارم
مقدمه
تا اینجا بیشتر دستور های مربوط به CPU را نوشته ایم، در این بخش دستورات جدیدی را اضافه میکنیم و کمی هم راجع به SFR یا Special Function Register ها صحبت می کنیم.

بیت Carry

بیت Carry یکی از بیت های رجیستر STATUS یا رجیستر شماره 0x03 می باشد. این رجیستر مربوط به وضعیت CPU می باشد. مثل این که حاصل محاسبه ای صفر شده است یا نه و…

بیت مربوط به carry یا حمل کننده یک بیت برای ذخیره مقدار های مربوط به RRF و RLF می باشد.

این متغیر مقدار های 0 یا 1 را ذخیره می کند. و بعد از استفاده از RRF و RLF به روز می شود.

دستور ADDWF f, d

دستور ADDWF دو مقدار را دریافت میکند، اولی مربوط به آدرس داده شده و دومی مربوط به فاصله (destination) می باشد.

وظیفه این دستور اضافه کردن مقدار رجیستر W به مقدار آدرس داده شده می باشد. اگر فاصله یا d برابر با 0 (یا F) بود نتیجه نهایی در رجیستر W میماند، در غیر این صورت اگر مقدار d برابر با 1 (یا W) بود مقدار در رجیستر داده شده ذخیره می شود.

اگر نتیجه محاسبه بیشتر از 255 باشد (از 8 بیت بیشتر) نتیجه برابر با 0 می شود.

دستور ADDWF f, d

دستور ANDWF f, d

این دستور نیز مانند دستور ADDWF دو مقدار آدرس (f) و فاصله (destination) را دریافت می کند.

این دستور مقدار رجیستر W را با مقدار رجیستر f (داده شده) را به صورت AND (&) محاسبه میکند، در صورتی که مقدار d برابر با 0 (یا F) بود نتیجه در رجیستر W ذخیره می شود، در غیر این صورت اگر مقدار برابر با 1 (یا W) بود، نتیجه در آدرس داده شده ذخیره می شود.

دستور ANDWF f, d

دستور COMF f, d

این دستور نیز همانند دستور های قبلی دو مقدار آدرس (f) و فاصله (d) را دریافت میکند.

عملکرد این دستور به این صورت است که بخش های 0 تبدیل به 1 می شوند و بخش های 1 در باینری تبدیل به 0 می شوند. برای مثال اگر مقدار باینری برابر با 0b00001111 باشد بعد از عملیات complement (~) مقدار برابر با 0b11110000 میشود.

اگر مقدار d برابر با 0 (یا F) بود نتیجه در رجیستر W ذخیره می شود در غیر این صورت اگر مقدار برابر با 1 (یا W) بود، نتیجه در آدرس داده شده ذخیره میشود.

دستور COMF f, d

دستور IORWF f, d

دستور دارای دو مقدار f برای آدرس و d برای فاصله (destination) می باشد.

وظیفه این دستور این است که بین مقدار آدرس داده شده و رجیستر W عملیات OR (|) را اجرا کند.

اگر مقدار d برابر با 0 (یا F) بود نتیجه در رجیستر W در غیر این صورت اگر مقدار d برابر با 1 (یا W) بود نتیجه در آدرس داده شده ذخیره میشود.

دستور IORWF f, d

دستور RLF f, d

وظیفه این دستور به این صورت می باشد که تمامی بیت های آدرس داده شده را یکی به سمت چپ حرکت می دهد و مقدار اولین بیت از سمت چپ به Carry داده می شود و مقدار قبلی مربوط به Carry در اولین بیت از سمت راست قرار میگیرد.

عملکرد این دستور شبیه به دستور shift در زبان C می باشد (>>).

اگر مقدار d برابر با 0 (یا F) بود نتیجه در رجیستر W در غیر این صورت اگر مقدار d برابر با 1 (یا W) بود نتیجه در آدرس داده شده ذخیره میشود.

دستور RLF f, d

کد دستوری مربوط به این دستور به صورت زیر می باشد:

کد دستوری RLF

دستور RRF f, d

این دستور همانند دستور قبلی یعنی RLF می باشد، با این تفاوت که در این دستور حرکت به سمت راست می باشد.

تمامی بیت های آدرس داده شده یکی به سمت راست حرکت می کنند و اولین بیت از چپ بر روی مقدار Carry قرار داده می شود و مقدار قبلی مربوط به Carry در اولین بیت از سمت راست قرار میگیرد.

این دستور عملکردی مشابه با (<<) در زبان C دارد.

اگر مقدار d برابر با 0 (یا F) بود نتیجه در رجیستر W در غیر این صورت اگر مقدار d برابر با 1 (یا W) بود نتیجه در آدرس داده شده ذخیره میشود.

دستور RRF f, d

کد دستوری مربوط به این دستور به صورت زیر می باشد:

کد دستوری RRF

آپدیت کردن کد CPU

حالا که دستور های مربوطه را توضیح دادیم زمان آپدیت کردن کد های مربوط به CPU می باشد.

اضافه کردن بخش Decode

کدهای جدید مربوط به تابع decode_inst به صورت زیر می باشد:

اضافه کردن بخش Decode

اضافه کردن بخش Execute

بعد از تشخیص کد با تابع decode_inst حالا بخش های مربوط به اجرای دستور ها را به تابع execute اضافه می کنیم:

بخش Execute

در این بخش توابع rotate_right_carry و rotate_left_carry مربوط به shift و دو دستور RRF و RLF می باشند و به صورت زیر تعریف می شوند:

دستور های جدید CPU هشت بیتی - بخش چهارم CPU هشت بیتی

توابع set_carry و get_carry که مربوط به آپدیت کردن بیت carry در رجیستر STATUS هستند.

و دو تابع clear_sfr_bit و set_sfr_bit مربوط به SFR هستند.

وظیفه این توابع روشن/خاموش کردن (صفر و یک کردن) بیت های مشخص شده در رجیستر های داده شده هستند.

دستور های جدید CPU هشت بیتی - بخش چهارم CPU هشت بیتی

و کار تابع set_z_bit مربوط به بیت شماره دوم (شروع از صفر) رجیستر STATUS است که زمانی برابر با 1 می شود که حاصل محاسبه ای (انجام شده در رجیستر W) برابر با 0 باشد، در غیر این صورت مقدار این بیت برابر با 0 می شود.

دستور های جدید CPU هشت بیتی - بخش چهارم CPU هشت بیتی

حلقه FOR

در کد زیر به نوشتن حلقه for در assembly می پردازیم:

حلقه FOR

  • در سه خط اول متغیر های مربوط به آدرس ها را تعریف میکنیم!
  • در بخش init مقدار 10 (تعداد دفعات تکرار حلقه) برای COUNT و مقدار 48 که معادل “حرف” 0 می باشد را برای R1 قرار میدهیم!
  • در بخش LOOP (خط های 17 تا 20) مقدار R1 را در رجیستر W و سپس در رجیستر GPIO قرار می دهیم و در خط 19 بیت 7 مربوط به GPIO را برابر با 1 قرار میدهیم و در نهایت در خط 20 مقدار رجیستر GPIO را برابر با 0 قرار می دهیم!
  • در خط 20، یکی به مقدار R1 اضافه می کنیم و نتیجه را در R1 ذخیره میکنیم. (این کار باعث رفتن به حرف بعدی می شود برای مثال 1، 2، …، 9)
  • در خط های 24 تا 27 نیز این کار را برای عدد 10 یا حرف (n\) میکنیم!
  • در خط های 30 تا 32 یکی از مقدار COUNT کم میکنیم (ذخیره در COUNT) و در صورتی که مقدار COUNT برابر با 0 بود دستور مربوط به خط 32 را اجرا میکنیم (خروج از حلقه) در غیر این صورت دستور مربوط به خط 31 که برای اجرا و بررسی دوباره حلقه می باشد را اجرا میکنیم.
  • در خط های 34 و 35 یک label به اسم END تعریف میکنیم و دستور SLEEP برای متوقف کردن CPU را در آن قرار میدهیم!

دستور های جدید CPU هشت بیتی - بخش چهارم CPU هشت بیتی

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *