سلام:
نمی شود شما مگر سر کلاس نیستید.
ولی حالا چون کاربر تازه وارد هستید یک توضیح مختصر می دهم.
ADD
اين دستورالعمل حاصل جمع صحيح دو عملوند خود را محاسبه و نتيجه را در عملوند اول قرار می دهد.
دستورالعمل add محتوای عملوند src را با عملوند dest جمع می کند و نتيجه را در dest ذخيره می کند (dest := dest + src).
دستورالعمل add به شکل های زير می تواند استفاده شود:
کد:
add register, register
add register, memory
add memory, register
add register, immediate data
add memory, immediate data
add AX/AL, immediate data
مثال. دستور زير محتوای ثبات های AX و BX را جمع کرده و حاصل را در ثبات AX ذخيره می کند.
فلگ های زير با توجه به نتيجه دستورالعمل add تاثير می پذيرند:
• فلگ Overflow اگر يک شوددلالت بر سرريزی در محاسبات علامتدار است.
• فلگ Carry اگر يک شود دلالت بر سرريزی در محاسبات بدون علامت دارد.
• فلگ Sign اگر يک شود نشان می دهد که نتيجه منفی بوده است. يعنی با ارزش ترين بيت عدد يک است.
• فلگ Zero اگر يک شود بيان کننده اين است که نتيجه جمع صفر بوده است.
• فلگ Auxiliary Carry شامل سرريزی BCD از نيبل پايين است.
• فلگ Parity با توجه به 8 بيت پايين نتيجه تغييرمی کند. اگر تعداد بيت های يک نتيجه زوج باشد اين فلگ يک می شود. و اگر تعداد فردی بيت 1 در نتيجه باشد اين فلگ صفر می شود.
روی بقيه فلگ ها اثر ندارند.
نکاتی که درمورد دستور mov بايد رعايت شود در مورد دستور add نيز صادق است. علاوه بر اين که با اين دستور نمی توان يک ثبات سگمنت را با مقداری جمع کرد.
وقتی داده فوری با يک عملوند بايت يا کلمه جمع می شود داده فوری به اندازه عملوند گسترش پيدا می کند.
چون جمع حافظه و حافظه وجود ندارد اگر بخواهيد دو متغير را با هم جمع کنيد بايد عملوندهای حافظه را در ثبات ها منتقل کنيد.
مثال. يک حالت ممکن برای انجام عمل جمع متغيرها به صورت J := K + M + N + P; می تواند به شکل زير باشد:
کد:
mov BX, K
mov AX, M
add BX, N
add AX, P
add AX, BX
mov J, AX
مثال. می توان يک ثبات را با محلی از حافظه جمع کرد. اجباری نيست که هردو عملوند ثبات باشد.
مثال. می توان يک مقدار ثابت را با حافظه جمع کرد.
ADC
دستورالعمل (add with carry) adc مشابه دستورالعمل add است با اين تفاوت که حاصل جمع دو عملوند و فلگ Carry را محاسبه می کند (dest :=dest+source+CF). بنابراين اگر Carry صفر باشد نتيجه مشابه add می شود.
INC
دستورالعمل (increment) inc يک واحد به عملوند خود اضافه می کند. شکل کلی آن به صورت زير است:
اين دستورالعمل عدد 1 را با dest جمع و حاصل را در خود dest ذخيره می کند.
دستور inc به شکل های زير می تواند باشد:
کد:
inc register
inc memory
عملوند دستور می تواند ثبات يا مکانی از حافظه باشد. اندازه عملوند می تواند 8 يا 16 بيتی باشد.
دستور inc فشرده تر و اغلب سريع تر از دستور add است.
به استثنای فلگ Carry بقيه فلگ ها مشابه دستورالعمل add تغيير می کنند. توجه کنيد که اين دستور بر روی فلگ Carry تاثير ندارد و برای تاثير روی فلگ Carry بايد از دستورالعمل ADD استفاده شود.
افزايش شمارنده حلقه و انديس آرايه يکی از متداولترين کاربردهای دستور inc است.
SUB
دستورالعمل (subtract) sub حاصل تفريق عملوند دوم از عملوند اول را محاسبه می کند. شکل کلی آن به صورت زير است:
دستورالعمل sub مقدار src را از dest کم کرده حاصل را در dest ذخيره می کند.
مشابه دستورالعمل add، دستور sub به صورت های زير می تواند باشد:
کد:
sub register, register
sub register, memory
sub memory, register
sub register, immediate data
sub memory, immediate data
sub AX/AL, immediate data
دستور sub به طريق زير فلگ ها را تغيير می دهد:
• اگر نتيجه صفر شود فلگ Zero يک می شود. اين در حالتی اتفاق می افتد که عملوندها با هم برابر باشند.
• اگر نتيجه منفی شود فلگ sign يک می شود.
• اگر سرريزی رخ دهد فلگ overflow يک می شود.
• فلگ Auxiliary Carry در صورت نياز برای عمليات BCD يک می شود.
• فلگ Parity با توجه به تعداد بيت های يک نتيجه تنظيم می شود.
• فلگ Carry در صورت بروز سرريزی در محاسبات بدون علامت يک می شود.
توجه داشته باشيد که تفريق خاصيت جابجائی ندارد.
مثال. دستورات زير عمل J := J - K; را انجام می دهند.
مثال. دستورات زير عمل J := K - J; را انجام می دهند.
کد:
mov ax, K
sub ax, J
mov J, ax
بعد از عمل تفريق از مقادير فلگ های Carry، Sign، Overflow و Zero می توان برای بررسی مساوی، نامساوی، بزرگتر يا کوچکتر بودن هر عملوند با ديگری استفاده کرد. جزئيات بيتشر در دستور cmp گفته خواهد شد.
SBB
دستورالعمل (subtract with borrow) sbb مشابه دستور sub است با اين تفاوت که حاصل تفريق عملوند دوم و CF از عملوند اول را محاسبه می نمايد(dest:=dest-src-CF)
DEC
دستورالعمل (decrement) dec يک واحد از عملوند خود کم می کند و حاصل را در خود عملوند دخيره می نمايد.
عملوند دستور dec می تواند ثبات يا حافظه باشد.
به استثنای فلگ Carry بقيه فلگ ها مشابه دستورالعمل sub تغيير می کنند.
NEG
دستورالعمل (negate) neg مکمل2 عملوند خود را محاسبه می کند. فرم کلی ان به صورت زير است:
دستور neg حاصل تفريق تنها عملوند خود را از عدد صفر را محاسبه کرده (عملوند را منفی می کند) و نتيجه را در آن ذخيره می کند. درنتيجه اجرای دستور علامت عملوند عکس می شود.
عملوند دستور neg می تواند ثبات يا محلی از حافظه باشد:
کد:
neg register
neg memory
اين دستور روی فلگ ها به صورت زير تاثيرمی گذارد:
• اگر نتيجه برابر با صفر شود فلگ Carry صفر و در غير اين صورت يک می شود. اگر عملوند صفر بوده باشد دستور اثری روی آن نمی گذارد ولی فلگ Carry را صفر می کند. منفی کردن هر مقدار ديگر فلگ Carry را يک می کند.
• اگر عملوند يک بايتی و حاوی مقدار -128 باشد و يا دوبايتی و حاوی عدد -32768 باشد، منفی کردن عملوند را تغييير نمی دهد اما فلگ Overflow را يک می کند.
• روی فلگ های S، P و Z مانند دستور sub اثر می گذارد.
مثال. دستور زير علامت متغير J عکس می شود.
مثال. دستورات اسمبلی زير مکمل K را محاسبه و در J ذخيره می کند(J=-k;).
کد:
mov AX, K
neg AX
mov J, AX
البته دستور CMP هم جزء دستورات تفریق است ولی من دیگر این دستور را توضیح نمی دهم.
و به شما پیشنهاد می کنم که حتما یک کتاب اسمبلی را مطالعه کنید.
در کتاب هم بهتر توضیح داده شده است و هم مثال های زیادی زده شده است.