نقل قول نوشته شده توسط 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 رو شیفت بدیم.
خیلی جامع و کامل توضیح دادین بسیار ممنون