تماس درباره   صفحه اصلی
  زبان اسمبلي > دستورات اسمبلي 8086> دستورات جمع و تفريق  
 
 

دستورات اسمبلی - دستورات جمع و تفريق


تعدادی از دستورات 8086 که برای انجام عمليات جمع و تفريق بر روی اعداد صحيح بکار می روند عبارتند از:

ADD
ADC
INC
SUB
SBB
DEC
NEG
CMP


ADD

اين دستورالعمل حاصل جمع صحيح دو عملوند خود را محاسبه و نتيجه را در عملوند اول قرار می دهد.

add dest, src

دستورالعمل 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 AX,BX


فلگ های زير با توجه به نتيجه دستورالعمل 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

مثال. می توان يک ثبات را با محلی از حافظه جمع کرد. اجباری نيست که هردو عملوند ثبات باشد.

mov AX, K
add J, AX

مثال. می توان يک مقدار ثابت را با حافظه جمع کرد.

add J, 2


ADC

دستورالعمل (add with carry) adc مشابه دستورالعمل add است با اين تفاوت که حاصل جمع دو عملوند و فلگ Carry را محاسبه می کند (dest :=dest+source+CF). بنابراين اگر Carry صفر باشد نتيجه مشابه add می شود.


INC

دستورالعمل (increment) inc يک واحد به عملوند خود اضافه می کند. شکل کلی آن به صورت زير است:

inc dest

اين دستورالعمل عدد 1 را با dest جمع و حاصل را در خود dest ذخيره می کند.

دستور inc به شکل های زير می تواند باشد:

inc register
inc memory

عملوند دستور می تواند ثبات يا مکانی از حافظه باشد. اندازه عملوند می تواند 8 يا 16 بيتی باشد.

دستور inc فشرده تر و اغلب سريع تر از دستور add است.

به استثنای فلگ Carry بقيه فلگ ها مشابه دستورالعمل add تغيير می کنند. توجه کنيد که اين دستور بر روی فلگ Carry تاثير ندارد و برای تاثير روی فلگ Carry بايد از دستورالعمل ADD استفاده شود.

افزايش شمارنده حلقه و انديس آرايه يکی از متداولترين کاربردهای دستور inc است.


SUB

دستورالعمل (subtract) sub حاصل تفريق عملوند دوم از عملوند اول را محاسبه می کند. شکل کلی آن به صورت زير است:

sub dest, src

دستورالعمل 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; را انجام می دهند.

mov ax, K
sub J, ax

مثال. دستورات زير عمل 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 dest

عملوند دستور dec می تواند ثبات يا حافظه باشد.

به استثنای فلگ Carry بقيه فلگ ها مشابه دستورالعمل sub تغيير می کنند.


NEG

دستورالعمل (negate) neg مکمل2 عملوند خود را محاسبه می کند. فرم کلی ان به صورت زير است:

neg dest

دستور neg حاصل تفريق تنها عملوند خود را از عدد صفر را محاسبه کرده (عملوند را منفی می کند) و نتيجه را در آن ذخيره می کند. درنتيجه اجرای دستور علامت عملوند عکس می شود.

عملوند دستور neg می تواند ثبات يا محلی از حافظه باشد:

neg register
neg memory

اين دستور روی فلگ ها به صورت زير تاثيرمی گذارد:

• اگر نتيجه برابر با صفر شود فلگ Carry صفر و در غير اين صورت يک می شود. اگر عملوند صفر بوده باشد دستور اثری روی آن نمی گذارد ولی فلگ Carry را صفر می کند. منفی کردن هر مقدار ديگر فلگ Carry را يک می کند.
• اگر عملوند يک بايتی و حاوی مقدار -128 باشد و يا دوبايتی و حاوی عدد -32768 باشد، منفی کردن عملوند را تغييير نمی دهد اما فلگ Overflow را يک می کند.
• روی فلگ های S، P و Z مانند دستور sub اثر می گذارد.


مثال. دستور زير علامت متغير J عکس می شود.

neg J

مثال. دستورات اسمبلی زير مکمل K را محاسبه و در J ذخيره می کند(J=-k;).

mov AX, K
neg AX
mov J, AX


CMP

دستوالعمل (compare) cmp مانند دستور sub است با اين تفاوت که حاصل تفريق را ذخيره نمی کند(dest-src). نحوه کلی آن به صورت زير است:

cmp dest.src

به صورت های زير می تواند استفاده شود:

cmp register, register
cmp register, memory
cmp memory, register
cmp register, immediate data
cmp memory, immediate data
cmp AX/AL, immediate data

فلگ ها مانند دستورالعمل sub با توجه به نتيجه تفريق تغيير می کنند.

دستور زير را درنظر بگيريد:

cmp AX, BX

اين دستور حاصل AX-BX را محاسبه می کند و با توجه به حاصل فلگ ها را تنظيم می کند. فلگ ها به صورت زير تغيير می کنند و می توانند برای بررسی نتيجه مقايسه بکار برده شوند:

• فلگ Zero يک می شود اگر AX=BX باشد. مساوی يا نامساوی بودن دو عملوند را مشخص می کند.
• فلگ Carry وقتی يک می شود که در محاسبات بدون علامت AX<BX باشد. يعنی تفريق BX از AX احتياج به رقم قرضی داشته باشد.
• فلگ Sign به همراه فلگ Overflow در محاسبات علامتدار نشان می دهد کدام عملوند بزرگتر است.
• دستورالعمل cmp روی فلگ های Parity و Auxiliary Carry هم تاثير دارد ولی بندرت هنگام مقايسه مورد بررسی قرار می گيرند.

به طور خلاصه برای مقايسه دو عملوند با توجه به فلگ های زير می توان نتيجه گيری کرد:

عملوندهای بدون علامت
فلگ ها
AX = BX Z=1
AX ≠ BX Z=0
AX < BX C=1
AX >= BX C=0
عملوندهای علامتدار
فلگ ها
AX = BX Z=1
AX ≠ BX Z=0
AX < BX (S=0 and O=1)or(S=1 and O=0)
AX >= BX (S=0) and (O=0) or (S=1) and (O=1)

برنامه محاسبه جمع و تفريق دو عدد توسط دستورات اسمبلی در محيط C++ تحت ويندوز 32


 


 


صفحه اصلی| PDF| درباره| تماس