نمایش نتایج 1 تا 7 از 7

نام تاپیک: sub ,sbb

  1. #1

    sub ,sbb

    سلام.
    یک قطعه کد برای تست عملگر 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 برابر صفر قرار گرفتند..!!!)

  2. #2
    کاربر دائمی آواتار shask00l
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    روی پاهای خودم
    سن
    38
    پست
    387

    نقل قول: sub ,sbb

    وقتی در بیت آخر (پرارزش ترین بیت) رقم نقلی ایجاد بشه cf فعال میشه .
    وقتی در بیت سوم (فکر کنم) رقم نقلی ایجاد بشه auxilary flag فعال میشه .

    این قانونه .

  3. #3

    نقل قول: sub ,sbb

    درست.

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

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

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

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

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

  4. #4
    کاربر دائمی آواتار shask00l
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    روی پاهای خودم
    سن
    38
    پست
    387

    نقل قول: sub ,sbb

    وقتی شما اون دوتا عدد رو توی ثبات ها قرار میدین وضعیتشون به این صورت میشه .


    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 انجام بدی که بهتر متوجه بشی .

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

  5. #5

    نقل قول: sub ,sbb

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

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

  6. #6
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    ایران سرای من است
    پست
    2,655

    نقل قول: sub ,sbb

     
    (- 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 نشان میده که یک واحد از سستم قرض گرفته شده است

  7. #7

    نقل قول: sub ,sbb

    در مثال من 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 به چه صورت بدست اومد؟؟

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •