شیفت به چپ در اسمبلی

HO3EINBABAIE

New Member
سلام دوستان میشه بفرمایید داخل این سوال چرا برای شیفت به چپ از CL استفاده کرده ؟ در صورتی که داخل CX عدد وارد کرده در خط اول ؟


WhatsApp Image 2021-12-29 at 00.44.07.jpeg
 

the_king

مدیرکل انجمن
سلام دوستان میشه بفرمایید داخل این سوال چرا برای شیفت به چپ از CL استفاده کرده ؟ در صورتی که داخل CX عدد وارد کرده در خط اول ؟


مشاهده پیوست 114677
دلیل اش اینه که در پردازنده های 8086 برای دستورات Shift و Rotate پارامتر دوم که تعداد بیت جابجایی است فقط و فقط دو حالت تعریف شده وجود داره.
یا باید صریحا عدد 1 باشه یا باید CL باشه. نه میتونه 2 و 3 و ... باشه و نه رجیستر دیگری بجز CL. این جزو محدودیت های دستورات پردازنده است.
برای همین اگر بخواهند در یک دستور SAL بیش از یک بیت جابجا کنند، بجز CL گزینه دیگری نیست.
ولی در پردازنده های نسل بعد (80286 و 80386 و ...) اعداد دیگری بجز 1 هم می تواند بصورت صریح بکار برده شود.
 

HO3EINBABAIE

New Member
دلیل اش اینه که در پردازنده های 8086 برای دستورات Shift و Rotate پارامتر دوم که تعداد بیت جابجایی است فقط و فقط دو حالت تعریف شده وجود داره.
یا باید صریحا عدد 1 باشه یا باید CL باشه. نه میتونه 2 و 3 و ... باشه و نه رجیستر دیگری بجز CL. این جزو محدودیت های دستورات پردازنده است.
برای همین اگر بخواهند در یک دستور SAL بیش از یک بیت جابجا کنند، بجز CL گزینه دیگری نیست.
ولی در پردازنده های نسل بعد (80286 و 80386 و ...) اعداد دیگری بجز 1 هم می تواند بصورت صریح بکار برده شود.
ممنونم از پاسختون
اما سوال من این بود که ما در این مثال برای CL عددی وارد نکردیم پس چند بار شیفت انجام میشود ؟
 

the_king

مدیرکل انجمن
ممنونم از پاسختون
اما سوال من این بود که ما در این مثال برای CL عددی وارد نکردیم پس چند بار شیفت انجام میشود ؟
registers.png
رجیستر های AX و BX و CX و DX که دو بایتی (16 بیتی) هستند برای هر بایت شون یک اسم رجیستر 8 بیتی هم دارند که می توانند بصورت مجزا مورد دسترسی قرار بگیرند. مثلا AX تشکیل شده از دو بایت AH و AL که در کنار هم دو بایتی AX را تشکیل داده اند یا CX که از ترکیب CH و CL تشکیل شده.
یعنی وقتی مقدار CX رو تغییر می دهید مقادیر CL و CH رو تغییر داده اید یا وقتی مقادیر CL یا CH رو تغییر می دهید مقدار CX هم تغییر کرده.
برای همین وقتی به CX مقدار 0x0502 را می دهید، در واقع به CH مقدار 0x05 و به CL مقدار 0x02 را داده اید.
 

HO3EINBABAIE

New Member
بسیار سپاسگزارم
فقط اگر میشه این خط رو بیشتر توضیح میدین ؟
برای همین وقتی به CX مقدار 0x0502 را می دهید، در واقع به CH مقدار 0x05 و به CL مقدار 0x02 را داده اید.
که چطور این اتفاق میفته ؟ ممنون
و اینکه 0x0502 چه عددی هس ؟ سایتی هس که بتونم اعداد هگز رو به عددهای معمولی تبدیل کنم ؟
 

the_king

مدیرکل انجمن
بسیار سپاسگزارم
فقط اگر میشه این خط رو بیشتر توضیح میدین ؟

که چطور این اتفاق میفته ؟ ممنون
و اینکه 0x0502 چه عددی هس ؟ سایتی هس که بتونم اعداد هگز رو به عددهای معمولی تبدیل کنم ؟
0x یا 0X (یا یک h در انتهای عدد) نماد اعداد مبنای 16 است و میذاریمش کنار. 05 و 02 و کلا هر دو رقم در مبنای 16 معادل یک بایت ئه و دو رقم سمت چپی در بایت با ارزش بیشتر (اونی که اسم رجیسترش به H ختم میشه) قرار میگیره و دو رقم سمت راستی در بایت با ارزش کمتر (اونی که رجیستر اش به L ختم میشه) قرار میگیره. یعنی 0502 داره در CHCL قرار میگیره.
پس 05 در CH قرار میگیره و 02 در AL.
تبدیل اعداد مبنای 16 به مبنای 10 و برعکس رو هم که با ماشین حساب ها و سایت های آنلاین می توانید انجام بدهید.
خود ویندوز هم ماشین حساب داره با مود Programmer اش تبدیل مبنا داره.
گرچه که بهتره بجای استفاده از ماشین حساب یاد بگیرید بصورت ذهنی این تبدیل مبنا ها رو انجام بدهید.
 

HO3EINBABAIE

New Member
0x یا 0X (یا یک h در انتهای عدد) نماد اعداد مبنای 16 است و میذاریمش کنار. 05 و 02 و کلا هر دو رقم در مبنای 16 معادل یک بایت ئه و دو رقم سمت چپی در بایت با ارزش بیشتر (اونی که اسم رجیسترش به H ختم میشه) قرار میگیره و دو رقم سمت راستی در بایت با ارزش کمتر (اونی که رجیستر اش به L ختم میشه) قرار میگیره. یعنی 0502 داره در CHCL قرار میگیره.
پس 05 در CH قرار میگیره و 02 در AL.
تبدیل اعداد مبنای 16 به مبنای 10 و برعکس رو هم که با ماشین حساب ها و سایت های آنلاین می توانید انجام بدهید.
خود ویندوز هم ماشین حساب داره با مود Programmer اش تبدیل مبنا داره.
گرچه که بهتره بجای استفاده از ماشین حساب یاد بگیرید بصورت ذهنی این تبدیل مبنا ها رو انجام بدهید.
ممنون ازتون
پس با توجه به توضیحات شما جواب این سوال گزینه "ب" هستش ؟
ممنون میشم اگر پیویتون رو هم چک کنید
 

the_king

مدیرکل انجمن
ممنون ازتون
پس با توجه به توضیحات شما جواب این سوال گزینه "ب" هستش ؟
نه. هیچکدوم از گزینه ها مطابقت نداره.
چون بیت ها در مبنای 2 هستند، هر یک بیت شیفت دادن به سمت چپ مقدار عدد رو دو برابر میکنه.
اگر یک بیت به سمت چپ شیفت پیدا کنه، 2 برابر میشه.
اگر دو بیت به سمت چپ شیفت پیدا کنه، 2 * 2 برابر میشه، یعنی 4 برابر.
اگر سه بیت به سمت چپ شیفت پیدا کنه، 2 * 2 * 2 برابر میشه، یعنی 8 برابر.
...
MOV DX, n
فرض کنیم در DX عدد n قرار داره چون نمیدونیم مقدار DX چیه.

MOV CX, 0x0502
مقدار 0x02 در CL و 0x05 در CH قرار میگیره. پس در CL عدد 2 قرار داره.

MOV AX, DX
مقدار n در AX کپی میشه.

SAL DX, CL
چون CL مقدار 2 داشت، مقدار DX که برابر n بود دو بیت به سمت چپ منتقل میشه، یعنی چهار برابر میشه و در DX مقدار 4 * n قرار میگیره.

ADD DX, AX
به DX (که مقدار 4 * n داره)، مقدار AX (که مقدار n داره) اضافه میشه، پس DX میشه (4 * n + (n یعنی 5 * n

SAL DX, 1
مقدار DX (که n * 5 هست) یک بیت به سمت چپ منتقل میشه، یعنی دو برابر میشه و n * 10 در DX قرار میگیره.

ممنون میشم اگر پیویتون رو هم چک کنید
لطفا قانون عمومی E5 مجید آنلاین رو مطالعه کنید.
 

HO3EINBABAIE

New Member
نه. هیچکدوم از گزینه ها مطابقت نداره.
چون بیت ها در مبنای 2 هستند، هر یک بیت شیفت دادن به سمت چپ مقدار عدد رو دو برابر میکنه.
اگر یک بیت به سمت چپ شیفت پیدا کنه، 2 برابر میشه.
اگر دو بیت به سمت چپ شیفت پیدا کنه، 2 * 2 برابر میشه، یعنی 4 برابر.
اگر سه بیت به سمت چپ شیفت پیدا کنه، 2 * 2 * 2 برابر میشه، یعنی 8 برابر.
...
MOV DX, n
فرض کنیم در DX عدد n قرار داره چون نمیدونیم مقدار DX چیه.

MOV CX, 0x0502
مقدار 0x02 در CL و 0x05 در CH قرار میگیره. پس در CL عدد 2 قرار داره.

MOV AX, DX
مقدار n در AX کپی میشه.

SAL DX, CL
چون CL مقدار 2 داشت، مقدار DX که برابر n بود دو بیت به سمت چپ منتقل میشه، یعنی چهار برابر میشه و در DX مقدار 4 * n قرار میگیره.

ADD DX, AX
به DX (که مقدار 4 * n داره)، مقدار AX (که مقدار n داره) اضافه میشه، پس DX میشه (4 * n + (n یعنی 5 * n

SAL DX, 1
مقدار DX (که n * 5 هست) یک بیت به سمت چپ منتقل میشه، یعنی دو برابر میشه و n * 10 در DX قرار میگیره.
ینی سوال اشتباهه ؟ :)))
این سوال ترم پیش درس اسمبلی ما هست !!!

بله حتما
امکانش هست برای امتحان انلاین این درس به بنده کمک کنید ؟
امتحانش کلا5و6 تا سوال تستی هستش به همین سبک که مشاهده کردین
جسارتا هزینه هم تقبل میکنم
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ینی سوال اشتباهه ؟ :)))
این سوال ترم پیش درس اسمبلی ما هست !!!
احتمالا منظور طراح چیزی شبیه به 0x0501 بوده تا نتیجه 6X بشه.
بله حتما
امکانش هست برای امتحان انلاین این درس به بنده کمک کنید ؟
امتحانش کلا5و6 تا سوال تستی هستش به همین سبک که مشاهده کردین
جسارتا هزینه هم تقبل میکنم
خیر.
 

جدیدترین ارسال ها

بالا