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

نام تاپیک: cwd

  1. #1
    کاربر تازه وارد
    تاریخ عضویت
    اسفند 1394
    محل زندگی
    تبریز
    پست
    61

    cwd

    سلام وقتتون بخیر . چجوری میشه فقط با شیفت دادن مقدار 32 بیتی dx:ax رو دو برابر کرد؟وفکر میکنم باید از دستور cwd هم استفاده کنیم

  2. #2

    نقل قول: cwd

    نقل قول نوشته شده توسط ali-iman مشاهده تاپیک
    سلام وقتتون بخیر . چجوری میشه فقط با شیفت دادن مقدار 32 بیتی dx:ax رو دو برابر کرد؟وفکر میکنم باید از دستور cwd هم استفاده کنیم
    سوال احتمالا اینه، چطور با استفاده از شیفت و CWD مقدار 16 بیتی علامت دار داخل AX رو در ترکیب 32 بیتی DX:AX دو برابر کرد.

    اگر فرض رو بر این بگیرید که مقدار اولیه یک عدد علامت دار در AX ئه، ابتدا با CWD اون بیت علامت رو روی همه بیت های DX تکثیر می کنید (اگر منفی باشه تمامی بیت ها 1 و اگر غیر منفی باشه همه بیت ها 0 میشه) و بعد با SHL AX, 1 مقدار AX رو دو برابر می کنید (بیت علامت اش حذف میشه) و DX:AX میشه دو برابر مقدار اولیه AX

    اما اگر فرض اولیه بر این باشه که مقدار علامت دار نیست یا فرض اولیه این باشه که مقدار در DX:AX ئه، نباید از CWD استفاده بشه، اولا چون برای اعداد علامت دار طراحی شده، و ثانیا چون مقدار قبلی داخل DX رو از بین میبره. اگر بهتون گفته شده از CWD استفاده کنید پس باید فرض بر این باشه که مقدار اولیه علامت دار در AX قرار داره، نه DX:AX و DX صرفا برای خروجی استفاده میشه.

  3. #3
    کاربر تازه وارد
    تاریخ عضویت
    اسفند 1394
    محل زندگی
    تبریز
    پست
    61

    نقل قول: cwd

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    سوال احتمالا اینه، چطور با استفاده از شیفت و CWD مقدار 16 بیتی علامت دار داخل AX رو در ترکیب 32 بیتی DX:AX دو برابر کرد.

    اگر فرض رو بر این بگیرید که مقدار اولیه یک عدد علامت دار در AX ئه، ابتدا با CWD اون بیت علامت رو روی همه بیت های DX تکثیر می کنید (اگر منفی باشه تمامی بیت ها 1 و اگر غیر منفی باشه همه بیت ها 0 میشه) و بعد با SHL AX, 1 مقدار AX رو دو برابر می کنید (بیت علامت اش حذف میشه) و DX:AX میشه دو برابر مقدار اولیه AX

    اما اگر فرض اولیه بر این باشه که مقدار علامت دار نیست یا فرض اولیه این باشه که مقدار در DX:AX ئه، نباید از CWD استفاده بشه، اولا چون برای اعداد علامت دار طراحی شده، و ثانیا چون مقدار قبلی داخل DX رو از بین میبره. اگر بهتون گفته شده از CWD استفاده کنید پس باید فرض بر این باشه که مقدار اولیه علامت دار در AX قرار داره، نه DX:AX و DX صرفا برای خروجی استفاده میشه.
    org 100h


    mov ax,0x7f0fh
    cwd
    shl ax,3


    ret
    تو این برنامه هرچند بارم که شیفت بدیم DX هیچ مقداری نمیگیره . مگه DX قسمت با ارزش تر AX نیست؟ پس باید با شیفت دادن AX عدد از شمت چپ AX خارج بشه و از سمت چپ DX وارد بشه اگه نه, پس چجوری باید از DX استفاده کنیم؟ اگه میشه شمام یه برنامه بنویسن و روی اون توضیح بدین

  4. #4

    نقل قول: cwd

    نقل قول نوشته شده توسط ali-iman مشاهده تاپیک
    org 100h


    mov ax,0x7f0fh
    cwd
    shl ax,3


    ret
    تو این برنامه هرچند بارم که شیفت بدیم DX هیچ مقداری نمیگیره . مگه DX قسمت با ارزش تر AX نیست؟ پس باید با شیفت دادن AX عدد از شمت چپ AX خارج بشه و از سمت چپ DX وارد بشه اگه نه, پس چجوری باید از DX استفاده کنیم؟ اگه میشه شمام یه برنامه بنویسن و روی اون توضیح بدین
    نه. ذاتا DX هیچ ارتباطی با AX نداره و SHL هایی که روی AX بدهید تاثیری روی DX نداره، AX و DX رجیستر های مستقلی هستند.
    CWD باعث نمیشه که DX بچسبه به AX، صرفا یک کپی مقدار روی DX انجام میده و روی SHL بعدی هم تاثیری نداره.
    شما می توانید با SHL AX, 3 صرفا AX رو شیفت بدهید، نمی توانید سه بیتی که بیرون می اندازید رو روی DX منتقل کنید.
    CWD یک بیت رو نجات میداد و روی DX کپی می کرد ولی دو بیت بیشتر از اون رو دیگه نمیتونه انتقال بده.


    تنها اتفاقی که می افته موقع اجرای دستور CWD ئه که با ارزش ترین بیت AX (در مثال شما صفر ئه) رو کپی می کنه روی بیت های DX. در بقیه کدتون کاری روی DX انجام نمیشه.
    فرض کنید که AX مقدار ABCDEFGHIJKLMNOP داره که هر حرف نماینده یک بیت ئه. بیت A با ارزش ترین بیت ئه و بیت علامت محسوب میشه.
    با اجرا کردن CWD مقدار AX همونی که هست میمونه و مقدار DX میشه AAAAAAAAAAAAAAAA یعنی با ارزش ترین بیت AX کپی میشه روی همه بیت های DX.
    الان ترکیب DX:AX که AAAAAAAAAAAAAAAA : ABCDEFGHIJKLMNOP ئه از نظر مقدار نسخه 32 بیتی همون مقدار 16 بیتی AX ئه، فرق عددی نداره.
    حالا اگر شما AX رو فقط یک بیت به سمت چپ شیفت بدهید، AX میشه BCDEFGHIJKLMNOP0 و DX هم که دخالتی در SHL نداره همون AAAAAAAAAAAAAAAA که بود میمونه.
    پس در نتیجه ترکیب DX:AX که الان AAAAAAAAAAAAAAAA : BCDEFGHIJKLMNOP0 هست حاصل یک بیت شیفت دادن AX به سمت چپ روی DX:AX شده.

    اما آیا این روال میتونه برای سه شیفت هم درست کار کنه؟ خیر. چون CWD هیچ توجهی به مقدار قبلی داخل DX نداره، مقدار قبلیش رو نابود می کنه. SHL هم اهمیتی به بیت هایی که بیرون می اندازه نداره، از دست شون می دهید.
    0x یا h هر دوشون یک معنی رو دارند، نیازی نیست که هم 0x و هم h درج بشه.

    MOV AX, 7F0Fh
    CWD
    MOV CX, 3
    label1:
    SHL DX, 1
    SHL AX, 1
    ADC DX, 0
    LOOP label1

    ADC صفر + بیت Carry رو به DX اضافه می کنه، یعنی عملا اون بیتی که از AX بیرون انداخته شده رو انتقال میده به اولین بیت DX که قبلا با شیفت جاش خالی شده.
    سه بار اجراش می کنیم تا سه بار DX:AX رو شیفت بدیم.

  5. #5
    کاربر تازه وارد
    تاریخ عضویت
    اسفند 1394
    محل زندگی
    تبریز
    پست
    61

    نقل قول: cwd

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    نه. ذاتا DX هیچ ارتباطی با AX نداره و SHL هایی که روی AX بدهید تاثیری روی DX نداره، AX و DX رجیستر های مستقلی هستند.
    CWD باعث نمیشه که DX بچسبه به AX، صرفا یک کپی مقدار روی DX انجام میده و روی SHL بعدی هم تاثیری نداره.
    شما می توانید با SHL AX, 3 صرفا AX رو شیفت بدهید، نمی توانید سه بیتی که بیرون می اندازید رو روی DX منتقل کنید.
    CWD یک بیت رو نجات میداد و روی DX کپی می کرد ولی دو بیت بیشتر از اون رو دیگه نمیتونه انتقال بده.


    تنها اتفاقی که می افته موقع اجرای دستور CWD ئه که با ارزش ترین بیت AX (در مثال شما صفر ئه) رو کپی می کنه روی بیت های DX. در بقیه کدتون کاری روی DX انجام نمیشه.
    فرض کنید که AX مقدار ABCDEFGHIJKLMNOP داره که هر حرف نماینده یک بیت ئه. بیت A با ارزش ترین بیت ئه و بیت علامت محسوب میشه.
    با اجرا کردن CWD مقدار AX همونی که هست میمونه و مقدار DX میشه AAAAAAAAAAAAAAAA یعنی با ارزش ترین بیت AX کپی میشه روی همه بیت های DX.
    الان ترکیب DX:AX که AAAAAAAAAAAAAAAA : ABCDEFGHIJKLMNOP ئه از نظر مقدار نسخه 32 بیتی همون مقدار 16 بیتی AX ئه، فرق عددی نداره.
    حالا اگر شما AX رو فقط یک بیت به سمت چپ شیفت بدهید، AX میشه BCDEFGHIJKLMNOP0 و DX هم که دخالتی در SHL نداره همون AAAAAAAAAAAAAAAA که بود میمونه.
    پس در نتیجه ترکیب DX:AX که الان AAAAAAAAAAAAAAAA : BCDEFGHIJKLMNOP0 هست حاصل یک بیت شیفت دادن AX به سمت چپ روی DX:AX شده.

    اما آیا این روال میتونه برای سه شیفت هم درست کار کنه؟ خیر. چون CWD هیچ توجهی به مقدار قبلی داخل DX نداره، مقدار قبلیش رو نابود می کنه. SHL هم اهمیتی به بیت هایی که بیرون می اندازه نداره، از دست شون می دهید.
    0x یا h هر دوشون یک معنی رو دارند، نیازی نیست که هم 0x و هم h درج بشه.

    MOV AX, 7F0Fh
    CWD
    MOV CX, 3
    label1:
    SHL DX, 1
    SHL AX, 1
    ADC DX, 0
    LOOP label1

    ADC صفر + بیت Carry رو به DX اضافه می کنه، یعنی عملا اون بیتی که از AX بیرون انداخته شده رو انتقال میده به اولین بیت DX که قبلا با شیفت جاش خالی شده.
    سه بار اجراش می کنیم تا سه بار DX:AX رو شیفت بدیم.
    خیلی جامع و کامل توضیح دادین بسیار ممنون

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

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