دستورات محاسباتی در اسمبلی

توجه : مطالب این پست بسیار بسیار تخصصی و خفن میباشد ! لطفاً با مسئولیت خودتان بخوانید و در صورتی که جزء افراد زیر هستید بی خیال شید.

این پست به درد این افراد نمی خورد :

– افرادی که ضریب هوشی کمتر از 165.992 درصد دارند .
– افرادی که به شدت از اسمبلی بیزار هستند .
– کسانی که مدعی برنامه نویسی هستند .
– کسانی که فکر میکنند اسمبلی خیلی آسونه .
– وکلاً کسانی که نمی دانند اصلاً کامپیوتر چی هست ! ! ! ! !

بعد از هشدار های لازم میریم سراغ جمع . برای جمع کردن دو عدد از دستور ADD استفاده میشود . این دستور محتوای دو اپرندش را به صورت زیر با هم جمع میکند .

operand1 = operand1 + operand2

اپرند های این دستور میتواند موارد زیر باشد :

REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate

همان طور که میبینید با این دستور میتوان حداکثر اعدادی را جمع کرد که طولی به اندازه طول رجیستر ها داشته باشد یعنی 8 بیتی یا 16 بیتی یا در 386 به بالا 32 بیتی چون همیشه یکی از اپرندها رجیستر است و اپرند حافظه ثابت هم محدود به اندازه کلمه RAM میشود که آن هم , هم اندازه ی رجیستر است . اگر بخواهیم دو عدد 32 بیتی را جمع کنیم باید آنرا به دو قسمت 16 بیتی تقسیم کنیم که در رجیستر ها جا شوند . بعد نیبلهای پایین را با هم جمع میکنیم و نیبلهای بالا را نیز با هم جمع میکنیم .

نیبل پایین با دستور ADD به صورت عادی جمع میشود و نیبل بالا باید با رقم نقلی نیبل پایین جمع شود .برای این کار از دستور ADC یا ADd with Carry استفاده میشود این دستور هم اپرند هاش دقیقاً مثل ADD هستش ولی به صورت زیر عمل جمع رو انجام میدهد.

operand1 = operand1 + operand2 + CF

یه مثال میزنم تا موضوع روشن بشه . مثلاً فرض کنید که میخواهیم دو عدد 32 بیتی که در خانه های 150 و152 برابر 0000F000h و 154و156 برابر 00001000h را با هم جمع کنیم . ( یه نکته که باید دقت کنید اینه که اعداد به صورت Back Word ذخیره شده اند. )

 

mov	ax,[150]		;ax=0F000h
mov	bx,[152]		;bx=0000h

add	ax,word ptr [154]	;ax=0000h and carry = 1
adc	bx,word ptr [156]	;bx=0001h

برای جمع کردن اعداد بزرگتر هم تا هر جا که نیاز بود دستور ADC رو مینویسیم .

امیدوارم تا اینجا متوجه شده باشید پس میریم سراغ تفریق . برای تفریق هم از همین روش استفاده میکنیم . قسمت اول با SUB و بقیه قسمت ها با دستور SBB یا Subtract with Borrow.

operand1 = operand1 – operand2 – CF

مثال :

 

mov	ax,[150]
mov	bx,[152]

sub	ax,word ptr [154]
sbb	bx,word ptr [156]

واقعاً خسته نباشید . بخش بعدی در مورد دستورات شیفت و دوران هستش که هزاران بار از جمع و تفریق سخت تر میباشد . پس خودتون رو آماده کنید !

دستور شیفت به چپ SHL است که دو اپرند دارد . اپرند دوم تعداد شیفت را مشخص میکند (ولی دقت کنید که 8086 آپکد جدایی برای شیفت بیشتر از یکی ندارد در نتیجه اسمبلر به تعداد مشخص شده از دستورshl opr,1 اضافه میکند . این قانون برای تمام دستورات شیفت و دوران انجام میشود ). این دستور تمام بیتها را به چپ شیفت میدهد و مقدار خارج شده در Carry قرار میگیرد و جای خالی از طرف راست با صفر پر میشود . مشابه همین دستور شیفت به راست SHR است با این تفاوت که جای خالی از طرف چپ با صفر پر میشود و بیت خارج شده از طرف راست در Carry قرار میگیرد .

اما سناریوی قبلی این جا هم تکرار میشود . شیفت دادن اعداد بزرگتر باز هم مشکل ساز است . ولی بشر دو پا باز هم کولاک میکنه و این مشکل رو هم حل میکنه اونم با دستورات RCL و RCR . تفاوت این دستورات با شیفت در اینه که بیت خارخ شده در Carry قرار میگیرد و جای خالی با مقدار قبلی Carry پر میشود نه با صفر .

مثال :

 

mov	ax,0F000h		;ax=0F000h
mov	bx,0000h		;bx=0000h

shl	ax,1            	;ax=0E000h and carry = 1
rcl	bx,1            	;bx=0001h  and carry = 0

دستورات مشابه رو هم اگر خودتون مطالعه کنید سر در خواهید آورد دیگه از اینیکه هست سنگین ترش نمی کنم که مختون سوت بکشه . یاد گرفتن این دستورات کمک میکنه که برنامه های بهتری بنویسید.

خوب با لاخره به آخر این پست رسیدیم ! ! ! اگر هنوز زنده اید و نفس میکشید در قسمت نظرات بگید .

Advertisements

دربارهٔ DeltaCode

Somewhere near the sky Far away from people Far away from noise Somewhere near yourself

Posted on مارس 5, 2011, in برنامه نویسی and tagged . Bookmark the permalink. 4 دیدگاه.

  1. من هم به همه ی دوستان خسته نباشید می گم! 😀

  2. باریکلا .معلومه ضریب هوشیت بالاتر از اونیه که من گفتم تقریباً در حدود 165.993 . 😀

  3. @DeltaCode
    همین حدودا! 😀

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: