PDA

View Full Version : سوال: sub ,sbb



...StacK...
پنج شنبه 03 دی 1388, 17:50 عصر
سلام.
یک قطعه کد برای تست عملگر sbb
این قطعه کد رو در دیباگ اجرا کنید:


;a 100
mov ax,0200
mov bx,00ff
sub al,bl
sbb ah,bh
int 21
به نتیجه اجرای دستورات دقت کنید:


AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AE9 ES=0AE9 SS=0AE9 CS=0AE9 IP=0103 NV UP EI PL NZ NA PO NC
0AE9:0103 BBFF00 MOV BX,00FF
-t
AX=0200 BX=00FF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AE9 ES=0AE9 SS=0AE9 CS=0AE9 IP=0106 NV UP EI PL NZ NA PO NC
0AE9:0106 28D8 SUB AL,BL
-t
AX=0201 BX=00FF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AE9 ES=0AE9 SS=0AE9 CS=0AE9 IP=0108 NV UP EI PL NZ AC PO CY
0AE9:0108 18FC SBB AH,BH
-t
AX=0101 BX=00FF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AE9 ES=0AE9 SS=0AE9 CS=0AE9 IP=010A NV UP EI PL NZ NA PO NC
0AE9:010A CD21 INT 21

سوال:چرا در نتیجه اجرای دستور:

sub al,bl

بیت های پرچم af,cf فعال میشن(1)؟؟؟

در جمع دو عدد 00h و مکمل دو عدد ffh که برابر 01h میشه:

00000000
+
00000001
-----------
00000001
هیج cf و یا ax ایجاد نمیشه...پس این موضوع به چه صورت هست که cf و af رو 1 میبینیم؟

-------------------------------

سوال بعدی ,وقتی sbb عمل تفریق رو منهای cf میکنه بعد از این عمل cf رو صفر قرار میده ...

و یا بر روی بیت های پرچم عمل خاصی رو انجام میده؟؟ (با توجه به دستور sbb در کد ,فلگ
های cf , af برابر صفر قرار گرفتند..!!!)

shask00l
جمعه 04 دی 1388, 23:46 عصر
وقتی در بیت آخر (پرارزش ترین بیت) رقم نقلی ایجاد بشه cf فعال میشه .
وقتی در بیت سوم (فکر کنم) رقم نقلی ایجاد بشه auxilary flag فعال میشه .

این قانونه .

...StacK...
شنبه 05 دی 1388, 12:32 عصر
درست.

ولی سوال من این نبود..!

سوالم تصدیق مطلب شماست ,ولی چرا در مثالی که زدم cf و یا af در ظاهر ایجاد نمیشه ,اما در عمل

میبینیم که این فلگ ها فعال شدن.

من میخوام اشتباه خودمو بدونم که چرا محاسبات من اشتباه شده و یا اینکه این موضوع در این مثال بر

اساس شاخص های دیگری رخ میده.!

shask00l
شنبه 05 دی 1388, 13:36 عصر
وقتی شما اون دوتا عدد رو توی ثبات ها قرار میدین وضعیتشون به این صورت میشه .



ah = 0000 0010 al = 0000 0000
bh = 0000 0000 bl = 1111 1111


خوب ..... توی کدی که شما دادی اول bl رو از al کم میکنه میریزه توی al .. ولی در جریان انجام این کار یک رقم قرضی ایجاد میشه . قبول ..؟

در فرمان دوم sbb مقدار ah=ah-bh-cf حساب میشه . چون در فرمان قبلی یک رقم قرضی داشتیم که باید از بخش بزرگتر کم بشه . من اینو با emu8086 تست کردم و همین نتیجه ای رو که گفتم گرفتم .


بیت های پرچم af,cf فعال میشن(1)؟؟؟

توی فرمان اول عدد 0000 0000 از 1111 1111 کم میشه . همونطوری که میبینی هم رقم قرضی ایجاد شده . هم توی بیت سوم قرضی داریم . پس طبیعیه که این فلگ ها فعال بشن .

پیشنهاد میکنم یک بار این کارو روی کاغذ در مبنای 2 انجام بدی که بهتر متوجه بشی .

امیدوارم کمک کرده باشم :بامزه:

...StacK...
شنبه 05 دی 1388, 17:48 عصر
توی فرمان اول عدد 0000 0000 از 1111 1111 کم میشه . همونطوری که میبینی هم رقم قرضی ایجاد شده . هم توی بیت سوم قرضی داریم .

نکته مبهمی که داشتم اینجا بود.!!! روی کاغذ تفریق رو به صورت زیر مینوشتم:


0000 0000 - 1111 1111 =(0000 0000) + (- 1111 1111)=> 0000 0000 + 0000 0001=01H

حالا تو این محاسبه نه CF ایجاد میشه و نه AF .!!! اما جواب درسته.

حالا همین عمل رو به صورت زیر انجام میدم:


0000 0000
-
1111 1111
_____________ (1 carry bit)
=> 1111 1111
-
1111 1111
_________
0000 0001
حالا درسته, وقتی یک barrow از سیستم گرفته و وارد msb میشه ,در نتیجه cf=1 و af=1 میشه ,یعنی carry ازچپ به راست.!!!
و در اخر هم carry وارد LSB میشه .یعنی 2 تا 1 روی lsb میمونه.

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

tdkhakpur
شنبه 05 دی 1388, 20:27 عصر
(- 1111 1111)=> 0000 0000 + 0000 0001

ببینید اصلا اون تفریقی که انجام دادی برای محاسبه دستی جواب میده ولی cpu چیزی به عنوان تفریقی که شما انجام دادید ندارد بلکه فقط عمل جمع رو انجام میده و این فلاک هست که توسط cpu مشخص میکنه نوع عملیات و نتیجه ان چگونه باید ارزیابی شود.
ولی در مورد مشکل بالا ایرادی در کار cpu نیست


0 0 0 0 0 0 0 0
- 1 1 1 1 1 1 1 1
----------------------
0 0 0 0 0 0 0 1
که عملیات بالا همان محاسبه زیر هست
0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 1 1
----------------------
1 1 1 1 1 1 1 1

و در نهایت علامت cf نشان میده که نتیجه عملیات نشت کرده و مثبت و منفی بودن نشت را هم zf نشان میده پس 1 بودن cf و 1 بودن zf نشان میده که یک واحد از سستم قرض گرفته شده است

...StacK...
شنبه 05 دی 1388, 23:05 عصر
در مثال من zf فعال نشده.!

و در مورد:
که عملیات بالا همان محاسبه زیر هست
0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 1 1
----------------------
1 1 1 1 1 1 1 1

مقدار 10000000 به چه صورت بدست اومد؟؟