ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

دستورات منطقي و شيفت :

 
Post new topic   Reply to topic    ParsX.com Forum Index -> ساختمان و زبان ماشين
View previous topic :: View next topic  
Author Message
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Sat Dec 04, 2004 8:33 pm    Post subject: دستورات منطقي و شيفت : Reply with quote

لازم به ذكر است كه دستورات منطقي به صورت بيت به بيت عمل مي كنند .
يعني دستوراتي كه بيت به بيت هر بايت را با بيت به بيت هر بايت ديگر در عملگرهاي منطقي كه دو عملوند ميپذيرند مقايسه و عمليات را بر انها انجام ميدهند .
براي عملگر not كه هميشه يك عملوند دارد نيز عمليات تنها برروي هان عملوند انجام ميشود .
دستورات منطقي شامل دستورات زير مي باشند :
الف ) دستور منطقيAnd كه بروي دو عملوند (مثلا يك بايتي) در مبناي دو عمل مي كنند به اين صورت كه دستور And بيت اول از عملوند اول را با بيت اول از عملوند دوم And ميكند و حاصل را در بيت اول از عملوند اول ميريزد . اين عمل به همين ترتيب براي بيت هاي بعدي دو عملوند تا انتهاي بايت يعني هشت بيت ( هشت بار تكرار عمليات فوق ) انجام ميپذيرد .
ب ) دستور منطقي Or كه بروي دو عملوند عمل مي كند و طرز كار ان دقيقا مانند and بالا است با اين تفاوت كه بيت هاي دو عملوند را بيت به بيت با يكديگر or ميكند
پ ) دستور منطقي Not كه بروي يك عملوند عمل ميكند تمامي بيت هاي عملوند خود را برعكس ميكند . يعني مكمل يك عملوند خود را در همان عملوند ميريزد .

مثال: And , Or دو عدد 7 و 14 وهمچنين Not عدد 14 را به وسيله يك تكه برنامه محاسبه كنيد ؟
Mov al,7
Mov bl,14
And al,bl
Mov cl,al
Mov al,7
Or al,bl
Mov ch,al
Not bl

در مثال فوق با دستور Mov al,7 عدد 7 را در al و به همين ترتيب عدد 14 را در bl مي ريزيم . در al عدد 7 به صورت 00000111 و در bl عدد 14 به صورت 00001110 ذخيره مي شود زيرا عددها در كامپيوتر در مبناي دو ذخيره مي شوند . با دستور And al,bl عمل And منطقي به صورت بيت به بيت انجام مي شود و در نهايت عدد 00000110 ( كه نمايش عدد 6 است ) در al ذخيره مي شود و با دستور Mov cl,al عدد را در cl نگه مي داريم . دوباره در al عدد 7 را قرار داده و al و bl را Or منطقي كرده و حاصل را در ch نگه مي داريم . حال با دستور Not bl عدد 14 را Not منطقي كرده و حاصل را در bl نگه مي داريم .
ت ) دستور shift به چپ كه به صورت shl در زبان اسمبلي استفاده ميشود به اين صورت عمل ميكند كه بيت ها را همگي با هم باندازه عملوند دوم خودش به سمت چپ منتقل ميكند فرضا مثال زير بيت ها را سه بار به سمت چپ منتقل ميكند
shl al,3
دستور shl در واقع بازاي هر بار حركت دادن بيت ها يك صفر به سمت راست عدد اضافه ميكند ( عدد را در مبناي خودش ضرب ميكند : مبناي مفروض 2 است بنابراين حاصل را ميتوان اينطور در نظر گرفت كه عدد در 2 ضرب شده است ) منتهي از ان طرف بيت ها را بيرون ميريزد و در اينصورت CF يا همان Carry Flag ما در صورت خارج شدن يك هاي همان بايت يك ميشود .
ث ) دستور shift به راست كه به صورت shr در زبان اسمبلي ميباشد نيز مانند دستور فوق است منتهي اين بار بيت ها را به سمت مخالف يعني سمت راست منتقل ميكند . بنابراين ميتوان در صورتي كه بدانيم عدد بدون علامت است از ان بعنوان تقسيم بر مبناي عدد ( كه در اينجا دو است ) استفاده كنيم منتهي اين تقسيم در خروجي عدد صحيح ميدهد و مانند عملگر DIV در پاسكال عمل ميكند . البته با عملگر DIV در اسمبلي كاملا متفائت است . ميتوان عمليات انجام شده توسط انرا به اين صورت در نظر گرفت كه جزؤ صحيح عملوند اول را حساب ميكند و بر عملوند دوم تقسيم ميكند .
مثال : به وسيله يك تكه برنامه عدد 7 را يك با شيفت به چپ ويك بار شيفت به راست دهيد ؟
Mov al,7
Shl al,1
Mov cl,al
Shr al,2

در مثال فوق عدد 7 كه به صورت 00000111 مي باشد با دستور Shl al,1 يك بار شيفت به چپ مي دهيم و نتيجه آن 00001110 مي شود ( كه نمايش عدد 14 مي باشد ) و آن را در cl نگه مي داريم . با دستور Shr al,2 عددي كه در al است را دو بار شيفت به راست ميدهيم اولين بار براي اينكه عدد 7 حاصل شود و دومين بار عدد 7 را يك بار شيفت راست مي دهيم . و عدد 00000011 حاصل مي شود كه معادل عدد 3 مي باشد .
همان طور كه در مثال بالا مي بينيد هر بار شيفت به چپ عدد ، عدد دو برابر مي شود و با هر بار شيفت به چپ جزؤ صحيح عدد تقسيم بر 2 حاصل مي شود .

نكته Exclamation :
در اعداد علامت دار اگر عدد منفي باشد و شيفت به راست بدهيم عمل تقسيم بر 2 انجام نمي شود زيرا در صورت يك بودن سمت چپ ترين بيت به سمت چپ شيفت داده شده و جاي آن 0 مي نشيند كه در اين صورت عدد مثبت مي شود . براي جلوگيري از اين مشكل كافيست به جاي دستور Shr از دستور Sar استفاده كنيم . دستور Sar بدين صورت عمل مي كند كه اگر سمت چپ ترين عدد 1 بود 1 واگر 0 بود 0 از سمت چپ وارد مي شود .
معادل با دستور Shl نيز دستور Sal وجود كه باهم هيچ گونه تفاوتي ندارد .
تكميليه دارد ...
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Fri Dec 10, 2004 11:55 am    Post subject: دستورات منطقي Reply with quote

دستورات منطقي
عبارتند از : AND , OR , XOR , TEST , NOT و ... كه توسط اين دستورات عمليات منطقي روي هر يك از بيتهاي ثباتها , خانه هاي حافظه انجام ميشوند . با اين عمليات ميتوان برروي يك بيت يا گروهي از بيتهاي ثباتها يا خانه هاي حافظه عملياتي انجام داد و آنها را متناسب با كاربرد يك يا صفر نمود . به همين دليل گاها به اين دستورات دستورات عمليات روي بيتها نيز ميگويند .
اين دستورات روي بيتهاي پرچم CF , PF , SF , OF , ZF تاثير ميگذارند .
نكته براي صفر كردن يك عملوند ميتوان انرا با خودش XOR نمود . در واقع دو دستور زير هر دو يك كار را انجام ميدهند :
ADD AX,0
XOR AX,AX

توجه داشته باشيد كه دستور NOT بر بيتهاي پرچم اثري ندارد .
دستور XOR براي مكمل كردن بيشتر به كار ميرود .
براي تست كردن عملوندي به صورت زير عمل ميكنيم
OR DX,DX
JZ LABEL1

همانطور كه گفته شد دستورات منطقي جز OR روي پرچم ها موثر هستند بنابراين براي انكه بهميم ايا ثبات DX سفر است يا نه از روش فوق استفاده كرديم .
دستورات شيفت :
توسط دستورات شيفت محتواي ثباتهاي پردازشگر يا خانه هاي حافظه يك يا چند بيت به طرف راست يا چپ شيفت داده ميشوند و دو نوع شيفت رياضي و منطقي وجود دارد .
شيفت به چپ : اين شيفت تفاوت چنداني در نوع منطقي و رياضي ان ندارد . و هر دو مانند يكديگر عمل ميكنند :
عملكرد اين شيفت به اين صورت است كه يك صفر به اولين بيت ( بيت صف ام بايت مورد نظر ) وارد ميشود و كليه بيتها همگي به سمت چپ منتقل ميشوند و اخرين بيت كه بيرون انداخته ميشود به CF ميرود .
بازاي هر شيفت بايت مذكور در دو ضرب ميشود : فرضا در رجيستر BL مقدار 3 را ريخته ايم :
SHL AX,1
SHL AX,CL

دستور اول باعث ميشود عدد ما باندازه يك بايت به سمت چپ شيفت داده شود يعني عدد در دو ظرب شود .
اما دستور دوم رجيستر AX را 3 بار ( باندازه محتويات CL منتقل) ميكند . يعني اين دستور عدد مارا 3 بار در 2 ضرب ميكند و اين يعني عدد در 8 ضرب شده باشد .
صورت دستور شيفت به راست به صورت زير است :
SHL عملوند1 ,   عملوند 2

SHL مخفف SHIFT LOGICAL LEFT ميباشد . عملوند اولي يا همان عملوند مقصد است كه حاصل عبارت منطقي فوق درون ان ريخته ميشود . عملوند دوم عملوند منبع است كه به تعداد ان عمليات شيفت رخ ميدهد .
براي دستور رياضي ان نيز كه براي اعداد علامت دار است از دستور SAL استفاده ميكنيم كه مخفف SHIFT ARITHMATIC LEFT ميباشد .
شيفت به راست :
دو نوع است يكي شيفت منطقي براي اعداد بدون علامت و ديگري شيفت رياضي براي اعداد علامت دار .
در شيفت منطقي براي اعداد بدون علامت ساختمان دستور مانند همانستكه در بالا در مورد شيفت به چپ توضيح داده شد منتهي به جاي SHL از SHR استفاده ميكنيم كه R مخفف RIGHT است
عملكرد ان به اين صورت است كه يك صفر از سمت چپ وارد بزرگترين بيت بايت مورد نظر ميشود و كليه بيتها به اندازه يك واحد به سمت راست حركت ( شيفت ) ميكنند و بيت اخري در CF ميرود .
اين عمل عدد مذكور را بر عدد 2 تقسيم ميكند . با اين تفاوت كه باقيمانده اي نخواهيم داشت .
اما تفاوت شيفت منطقي به چپ با شيفت رياضي به چپ انستكه در اين شيفت يعني شيفت منطقي علامت عدد مهم نيست و در هر صورت عدد فاقد علامت است . اما در اعداد علامت دار همانطور كه ميدانيم پرارزشترين بيت بيانگر علامت عدد است بنابراين در صورت كه بيتي از سمت چپ وارد بايت بشود بيت علامت در صورتي كه يك ميبود صفر خواهد شد بنابراين براي رفع اين مشكل از شيفت به چپ رياضي استفاده ميشود كه بيت ورودي را اگر عدد منفي باشد با مقدار يك وارد ميكند و در غير اينطورت مقدار صفر وارد ميكند .
به جاي SHR از SAR استفاده ميكنيم
به اين نكته توجه داشته باشيد كه اگر در تقسيم بر دو عدد 5 و 7 باشد يعني عددي فرد باشد حاصل به ترتيب 2 و 3 ميشود . حال انكه اگر همين اعداد منفي باشند يعني 5- و 7- باشند حاصل بترتيب 3- و 4- ميشود .
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> ساختمان و زبان ماشين All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum