عمل تقسیم در زبانهای
سطح بالا مانند C و بیسیک و … کاری آسان است . این سادگی بخاطر این است که عملیات واقعی در پشت پرده و در سطح پردازنده انجام می شود. در واقع وقتی در یکی از این زبانها می نویسیم 5 /10 همین عمل به ظاهر ساده یک سیستم کامپیوتری را وارد یک سری عملیات نسبتا پیچیده محاسباتی و منطقی می کند (با در نظر گرفتن عملیات برگرداندن مقادیر به برنامه اصلی )و کاربر فقط جواب آماده شده را می بیند. در هر حال اگرشما یکبار سعی کنید عملیات فوق را توسط یکی از میکرو کنترلرهای موجود انجام دهید (با فرض اینکه میکرو در زبان مورد استفاده دارای دستور تقسیم نباشد) متوجه می شوید که اینکار چندان هم ساده نیست بخصوص اگر مسئله سرعت و فضای حافظه اهمیت داشته باشد. شاید این سوال برای شما پیش بیاید که با وجود میکروکنترلرهای پیشرفته امروزی که حتی میتوانند عملیات پیچده ریاضی مانند عملیات کسری و ممیز شناور را با سرعت شگفت آوری انجام دهند چه نیازی به فراگیری این عملیات در زبان اسمبلی داریم.
اولا هر سیستم کنترلری را نمیتوان با پردازشگرهای پیشرفته ساخت (از نظر اقتصادی نبودن یا صرف یک کنترلر قوی برای یک کار سبک). ثانیا دانستن جزئیات این کار می تواند توانایی ما را در برنامه نویسی بالا تر ببرد و به ما درک بهتری از چگونگی کار بدهد.
با یک نگاه و مقایسه در میابیم که عمل تقسیم در زبان اسمبلی را میتوان با کمی دقت تا حد ممکن سریع و ساده انجام داد. ما برای کوتاه و ساده شدن کار از یک عدد باینری 8 بیتی و با حل کردن یک مثال این موضوع را توضیح می دهیم.
عدد1110 1100 را در نظر بگیرید. این عدد در مبنای ده معادل 206 است. اگر این عدد را بر عدد 10 تقسیم کنیم خارج قسمت آن 20 و باقیمانده 6 است .
مقسوم یعنی عدد 206 را در رجیستر فرضی A و مقسوم علیه را در رجیستر فرضی B قرار می دهیم. برای ادامه کار به یک رجیستر دیگر نیاز داریم که نتیجه عملیات میانی را در آن ذخیره کنیم این رجیستر را C فرض می کنیم. نا گفته نماند که یک برنامه نویس زبان اسمبلی باید در استفاده از رجیسترها صرفه جویی کند و از آنها بی حساب استفاده نکند که در این صورت برنامه ی نوشته شده بهینه و بدور از شلوغی بی مورد آماده می شود و این نکته دارای اهمیت زیادی است و در برنامه نویسی هنر محسوب می شود .حالا عملیات را مطابق مراحل زیر ادامه می دهیم.
1-رجیستر C را به چپ شیفت می دهیم
2- بیت 7 از A را به بیت 0 از C انتقال می دهیم .
3 – رجیستر A را به چپ شیفت می دهیم.
4- اگر C< B بیت 0 از A را برابر صفر قرار می دهیم و به مرحله یک می رویم.در غیر اینصورت به مرحله 5 می رویم.
5- اگر C>= B بیت 0 از A را برابر یک قرار داده B را از C کم کرده نتیجه را در C قرار داده و به مرحله یک می رویم .
6- مراحل یک تا 5 را برای همه 8 بیت انجام می دهیم.
در انتهای این عملیات خارج قسمت در رجیستر A و باقیمانده در رجیستر C است.
در مرحله 6 عمدا عبارت C>= B قرار داده شده است اینکار برای واضح تر شدن روند کار است زیرا هنگامی که در مرحله 5 مقدار این دو رجیستر C< B نباشد حتما شرط C>= B درست است و نیاز به تست نمودن آن نیست.
در هر صورت در زیر یک برنامه تست شده و عملی برای میکروکنترلرهای AVR سری MEGA ارائه شده است. شما می توانید در برنامه هایتان از آن استفاده کنید.
برنامه مذکور برای عملیات 8 بیتی نوشته شده است سعی کنید با کمی دست کاری آن را به 16 بیتی تبدیل کنید.تحلیل این برنامه می تواند تمرین خوبی برای شما باشد. توضیح اینکه این برنامه عددی را که در رجیستر R23 قرار دارد بر 10 تقسیم میکند . خارج قسمت را در R23 و باقیمانده را در TEMP قرار می دهد. به خاطر استفاده از دستور LDI متغیرهای TEMP و TEMP2 باید یکی ازجیسترهای بالایی در ناحیه رجیسترهای عمومی باشند(R16 تا R31)
موفق باشید.