انجام عمل ضرب با شیفت دادن در اسمبلی

nazbal

New Member
سوال درمورد دستورات شيفت و چرخش در اسمبلي

سلام تو رو خدا هر كس اين سوال ها را مي تونه حل كنه يه للطفي در حق من بكنه خيلي به جواباش نياز دارم كمكم كنيد
با استفاده از دستورات شيفت چرخش حل مي شن :
1- عدد 2 به توان 6 را حساب كنيد
2- ميانگين چهار عدد را حساب كنيد بدون استفاده از دستور تقسيم
3- اگر بخواهيم محتواي دو متغير را در زبان اسمبلي بدون استفاده از متغير كمكي و دستور xchg و دستور mov و دستور sub جا به جا كنيم ، چگونه اين كار را انجام دهيم ؟

راهنمايي :
* هر بار شيفت به چپ معادل يك بار ضرب در 2 است
* هر بار شيفت به راست معادل يك بار تقسيم بر 2 است
 

GFX Master

مدیر انجمن گرافیک دو بعدی ومسئول فروشگاه
دوست عزیز به انجمن خوش اومدید.

برای سوالاتتون سعی کنید انجمن مناسب رو انتخاب کنید تا سریعتر به جواب برسید.

انتقال
 

scooter2005

Member
سوال ساده اسمبلی

سه سوالی داشتم دوستان
وقتی میگن بدون استفاده از تقسیم رابطه x=(al/16)-2 را محاسبه کنید و جواب هم میشه
shr al,4
sub al,2
mov x,al

ممنون اگر کسی خط اول رو توضیح بده

یا مثلا در این مورد هم همینطور
بدون استفاده از ضرب al=8bl + 15 را محاسبه کنید

shl bl , 3
add al , 15
mov al , bl
 

saalek110

Well-Known Member
سلام.
شیفت به راست
و
شیفت به چپ
.
چون مبنای 2 کار می کنیم با شیفت به دو طرف یعنی داریم ضرب در 2 یا تقسیم بر 2 می کنیم. وقتی 4 بار شیفت بدهیم میشه 16 برابر کوچکتر کردن یا بزرگتر کردن.
و 3 بار شیفت میشه 8 بار کوچک یا بزرگ کردن(بسته به اینکه شیفت به چپ باشه یا به راست).

مثلا اگر 100 داشته باشیم که میشه 4 . اگر به چپ شیفت بدهیم میشه 8 یعنی در مبنای 2 میشه 1000 .
و با شیفت به راست 100(این عدد در مبنای 2 است) به عدد مبنای 2 که 10 است می رسیم که همان 2 در مبنای 10 است. یعنی 4 تبدیل به 2 شد با شیفت دادن.
 

scooter2005

Member
ممنون از پاسخت اما من دقیق متوجه نشدم . تو اینجور سوالها ، سوال رو میدن بعد باید کل جواب رو بنویسیم
الان مثلا در جواب سوال اول نوشتیم
shr al,4
یعنی به گفته شما عدد شانزده رو 4 با کوچک کردیم یعنی چطوری شد 16؟
یا مثلا در 100 داشته باشیم که میشه 4 . اگر به چپ شیفت بدهیم میشه 8 یعنی در مبنای 2 میشه 1000
2*2*2*2*2*2*2*2=256
اینجوری که میشه 256
ممنون اگر یکم دقیقتر توضیح بدید تا کاملا متوجه شم
 

saalek110

Well-Known Member
اعداد زیر که در مبنای 2 هستند را ببین:
1
10
100
1000
اینها در مبنای ده می شوند:
1
2
4
8
وقتی به شکل آنها در مبنای دو نگاه کنی می بینی که انگار فقط عدد 1 را بردیم سمت چپ. یعنی شیفت به چپ دادیم. کلا در مبنای دو با شیفت به راست و چپ داریم دو برابر به توان n (تعداد شیفت) کوچکتر یا بزرگتر می کنیم.
 

saalek110

Well-Known Member
در مبنای 10 اعداد زیر را ببین:
22
220
2200
22000

هر یک ده برابر قبلی است. و از لحاظ شکلی انگار به سمت چپ هل داده شده اند.

در مبنای 2 هم مشابه این حالت است.
ولی هر یک بر حسب مبنایش.

در مبنای ده با هر شیفت 10 برابر می شود
و در مبنای 2 با هر شیفت 2 برابر می شود.
 

scooter2005

Member
مدیر جان ممنون ، ولی فکر کنم یکمی گیج شدم
اگر تو مثال خودم توضیح بدی بهتره
x=(al/16)-2
الان این شده
shr al,4
یا مثلا
al=8bl + 15
شده
shl bl , 3

اگر خودت عددهای مختلف هم داری مثال بزن

مثلا الان جواب این چی میشه ؟
بدون استفاده از دستور ضرب

x=(ch*20)-35
 

saalek110

Well-Known Member
al/16
حل:
shr al,4

در بالا با 4 بار شیفت به راست همان تقسیم بر 16 انجام میشه. چون با هر بار شیفت به راست یک بار تقسیم بر 2 میشه و با 4 بار شیفت دادن عدد ما تقسیم بر 16 میشه.
------------------------------------------------------------
8bl
حل:
shl bl , 3
در اینجا برخلاف قبلی شیفت به چپ داریم نه شیفت به راست. و 3 تا شیفت دادیم که ضرب در 8 را برای ما به همراه خواهد داشت.

--------------------------------------
در مورد سومی ضرب در 20 می خواهیم.
یعنی میشه بدون استفاده از ضرب به ضرب در 20 رسید؟ کسی بلده این را حل کنه؟
 

the_king

مدیرکل انجمن
اگر خودت عددهای مختلف هم داری مثال بزن

مثلا الان جواب این چی میشه ؟
بدون استفاده از دستور ضرب

x=(ch*20)-35

در مورد سومی ضرب در 20 می خواهیم.
یعنی میشه بدون استفاده از ضرب به ضرب در 20 رسید؟ کسی بلده این را حل کنه؟

مضرب 20 رو از جمع دو مضرب 16 و 4 خواهیم ساخت :

کد:
mov 	ah, ch
shl 	ch, 4
shl 	ah, 2
add 	ch, ah
sub 	ch, 35
mov 	x, ch
 

the_king

مدیرکل انجمن
با استفاده از دستورات شيفت چرخش حل مي شن :
1- عدد 2 به توان 6 را حساب كنيد

برای محاسبه 2 به توان 6 بایستی عدد 2 در پنج عدد 2 دیگر ضرب شود، یعنی 2 به تعداد 5 بیت به سمت چپ
شیفت داده شود :
کد:
mov     ax, 2
mov     cl, 5
shl     ax, cl
 

the_king

مدیرکل انجمن
2- ميانگين چهار عدد را حساب كنيد بدون استفاده از دستور تقسيم

کد زیر میانگین چهار عدد 100 و 200 و 300 و 400 را در si محاسبه می کند :

کد:
mov     ax, 100
mov     bx, 200
mov     cx, 300
mov     dx, 400
mov     si, ax
add     si, bx
add     si, cx
add     si, dx
shr     si, 1
shr     si, 1
 

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

بالا