اوامر الدوران
هنالك عدة اوامر للدوران في لغة الاسمبلي
1.دوران نحو اليمين: فهنا تتحرك البتات من اليسار الى جهة اليمين اي ان البت الاولى تنتقل مكان البت الاخيرة والاخيرة الى قبل الاخيرة وهكذا. صورة من البت الاولى التي انتقلت الى البت الاخيرة تدخل الى راية CF
ROR OP,1
DATA
CF
مثال:
MOV AL,3DH
ROR AL,1
0
0
1
1
1
1
0
1
AL CF
1
0
0
1
1
1
1
0
1
ملاحظة:المصدر هنا عبارة عن قيمة عددية ويجب ان تكون 1 وفقط واحد وفي حالة اذا اردنا تدوير اكثر من بت واحدة فهنالك حلان
الحل الاول ان نسجل الامر بقدر عدد مرات البتات المراد تدويرها مثلا:
MOV AL,23H; AL=00100011
ROL AL,1
ROL AL,1
ROL AL,1
فهنا تم تدوير ثلاث بتات .
AL CF
0
1
1
0
0
1
0
0
0
حل اخر: نضع في CL عدد مرات الدوران ثما نسجل الامر
مثال:
MOV AL,26H
MOV CL,3
ROR AL,CL
لاحظ انه البت التي تتحرك تخرج من ال DATA تضع صورة من قيمتها في الراية CF وتنتقل البت الى اخر ال DATA وان القيمة المحفوظة في الراية CF هي قيمة اخر بت خرجت من ال DATA
تمرين: اكتب مقطع برنامج يحفظ في المسجل BL عدد البتات التي قيمتها 1 في المسجل AX
الحل:
فكرة الحل هي تدوير بتات المسجل AX 16 دورة وفي كل دورة نسأل عن قيمة الراية CF اذا كانت 1 نضيف للعداد BL القيمة 1. نسأل عن الراية cf لان كل بت تنتقل من البداية الى النهاية تضع صورة منها في داخل هذه الراية
MOV CX,16
MOV BL,0
T1:ROR AX,1
JC CF_1
JMP CF_0
CF_1:ADD BL,1
CF_0:LOOP T1
2) الامر الثاني المتخصص في الدوران هو الدوران لليسار والامر هو
ROL OP,1
فهنا البت الموجودة في نهاية المسجل تضع صورة لها في الراية CF وتنتقل الى البداية. كما هو مبين في الشكل التالي:
DATA
CF
مثال: لو فرضنا ان المسجل BL يحتوي على قيمة 6CH ونفذنا الامر التالي:
ROL BL,1
0
1
1
0
1
1
0
0
1
1
0
1
1
0
0
0
عندها نحصل على ما يلي: BL CF
0
السؤال اذا اردنا ان نقوم بتدوير عدة بتات مرة واحدة فاننا نستعمل المسجل CL ونضع فيه عدد الدورات
مثال:
ROL DL,1
ROL DL,1
ROL DL,1
ROL DL,1
يمكن ان نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,4
ROL DL,CL
هنالك اوامر ازاحة بتات تتخصص في الاعداد الموجبة وهنالك اوامر ازاحة تتخصص في الاعداد الموجهة
1.ازاحة نحو اليمين الاعداد الموجبة.
SHR OP,1
هنا يتم اضافة صفر في نهاية ال OP ونقوم بدفع البتات الاخرى الى اليمين وفي هذه الحالة تخرج البت الاولى الى راية CF
كما هو مبين في الشكل التالي:
DATA
CF
0
مثال: معطى BL=75H اذا نفذنا الامر التالي:
SHR BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1
المسجل BL قبل تنفيذ الامر
بعد عملية التنفيذ نحصل على
0
0
1
1
1
0
1
0
1
CF BL
ملاحظة: هذه الامر يقوم بعملية قسمة القيمة على 2 ولكن دون باق أي انه يحفظ الناتج الصحيح من خارج القسمة والباقي يذهب الى الراية CF
لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SHR AL,1
SHR AL,1
SHR AL,1
يمكن نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SHR AL,CL
ملاحظة: هنا لا يمكن تخزين الباقي في الراية CF لانه يمكن ان نخزن بت واحدة فقط وهي اخر بت خرجت من المسجل او المتغير. هنا تمت قسمة المسجل عل القيمة 8 لانه في كل ازاحة نقسم على 2 وهنا عملنا ثلاث ازاحات اذا قسمنا على 8
2.ازاحة نحو اليسار.
SHL OP,1
هنا يتم اضافة صفر في بداية ال OP ونقوم بدفع البتات الاخرى الى اليسار وفي هذه الحالة تخرج البت الاخيرة الى راية CF
كما هو مبين في الشكل التالي:
DATA
CF
0
مثال: معطى BL=75H اذا نفذنا الامر التالي:
SHL BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1
المسجل BL قبل تنفيذ الامر
بعد عملية التنفيذ نحصل على
1
1
1
0
1
0
1
0
BL CF
0
ملاحظة: هذه الامر يقوم بعملية ضرب القيمة بالعدد 2 البت الاخيرة تنتقل الى الراية CF
لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SHL AL,1
SHL AL,1
SHL AL,1
يمكن ان نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SHL AL,CL
هنا تم ضرب العدد بالقيمة 8 والسبب هو ان كل ازاحة عبارة عن ضرب العدد بالقيمة 2 وهنا عملنا ثلاث ازاحات أي 2*2*2=8 المهم ان ننتبه جيدا لانه في بعض الاحيان المسجل لا يمكنه ان يستوعب النتيجة الجديدة وهنا نخسر بتات من النتيجة وتكون النتيجة الموجودة في المسجل غير صحيحة.
الحل ان نستعين عندها في مسجل كامل مثلا
MOV AH,0
MOV CL,3
SHL AX,CL
3.ازاحة نحو اليسار للاعداد الموجهة( السالبة والموجبة).
SAL OP,1
هنا يتم اضافة صفر في بداية ال OP ونقوم بدفع البتات الاخرى الى اليسار وفي هذه الحالة تخرج البت الاخيرة الى راية CF
كما هو مبين في الشكل التالي:
DATA
CF
0
مثال: معطى BL=75H اذا نفذنا الامر التالي:
SAL BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1
المسجل BL قبل تنفيذ الامر
بعد عملية التنفيذ نحصل على
1
1
1
0
1
0
1
0
BL CF
0
ملاحظة: هذه الامر يقوم بعملية ضرب القيمة بالعدد 2 البت الاخيرة تنتقل الى الراية CF
لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SAL AL,1
SAL AL,1
SAL AL,1
يمكن ان نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SAL AL,CL
هنا تم ضرب العدد بالقيمة 8 والسبب هو ان كل ازاحة عبارة عن ضرب العدد بالقيمة 2 وهنا عملنا ثلاث ازاحات أي 2*2*2=8 المهم ان ننتبه جيدا لانه في بعض الاحيان المسجل لا يمكنه ان يستوعب النتيجة الجديدة وهنا نخسر بتات من النتيجة وتكون النتيجة الموجودة في المسجل غير صحيحة.
الحل ان نستعين عندها في مسجل كامل مثلا
MOV AH,0
MOV CL,3
SAL AX,CL
4.ازاحة نحو اليمين للاعداد الموجهة السالبة والموجبة.
SAR OP,1
هنا يتم نسخ البت الاخيرة من جهة اليسار في نهاية ال OP ونضعها في نهاية ال OP ونقوم بدفع البتات الاخرى الى اليمين وفي هذه الحالة تخرج البت الاولى الى راية CF
كما هو مبين في الشكل التالي:
DATA
CF
مثال: معطى BL=F5H اذا نفذنا الامر التالي:
SAR BL,1
اننا نحصل على الشكل التالي:
1
1
1
1
0
1
0
1
المسجل BL قبل تنفيذ الامر
بعد عملية التنفيذ نحصل على
1
1
1
1
1
0
1
0
1
CF BL
ملاحظة: هذه الامر يقوم بعملية قسمة القيمة على 2 ولكن دون باق أي انه يحفظ الناتج الصحيح من خارج القسمة والباقي يذهب الى الراية CF
مثال: معطى BL=75H اذا نفذنا الامر التالي:
SAR BL,1
اننا نحصل على الشكل التالي:
0
1
1
1
0
1
0
1
المسجل BL قبل تنفيذ الامر
بعد عملية التنفيذ نحصل على
0
0
1
1
1
0
1
0
1
CF BL
لو اردنا ان نعمل الامر عدة مرات فاننا سوف نسجل الامر عدة مرات او نستعين في بالمسجل CL
مثال:
SAR AL,1
SAR AL,1
SAR AL,1
يمكن نسجل بدلا من هذه الاوامر ما يلي:
MOV CL,3
SAR AL,CL
ملاحظة: هنا لا يمكن تخزين الباقي في الراية CF لانه يمكن ان نخزن بت واحدة فقط وهي اخر بت خرجت من المسجل او المتغير. هنا تمت قسمة المسجل عل القيمة 8 لانه في كل ازاحة نقسم على 2 وهنا عملنا ثلاث ازاحات اذا قسمنا على 8
5.التدوير الى اليمين مع الراية CF
RCR OP,1
هنا يتم اعتبار الراية CF من ضمن البتات التي يجب تدويرها انظر الشكل التالي:
DATA
CF
مثال:معطى CF=1 AL=3DH
اذا نفذنا الامر التالي:
RCR AL,1
قبل التنفيذ
CF AL
0
0
1
1
1
1
0
1
1
بعد التنفيذ:
AL CF
1
0
0
1
1
1
1
0
1
ملاحظة:المصدر هنا عبارة عن قيمة عددية ويجب ان تكون 1 وفقط واحد وفي حالة اذا اردنا تدوير اكثر من بت واحدة فهنالك حلان
الحل الاول ان نسجل الامر بقدر عدد مرات البتات المراد تدويرها مثلا:
RCR AL,1
RCR AL,1
RCR AL,1
فهنا تم تدوير ثلاث بتات .
حل اخر: نضع في CL عدد مرات الدوران ثما نسجل الامر
مثال:
MOV CL,3
RCR AL,CL
6.التدوير الى اليسار مع الراية CF
RCL OP,1
هنا يتم اعتبار الراية CF من ضمن البتات التي يجب تدويرها انظر الشكل التالي:
DATA
CF
مثال:معطى CF=0 AL=3DH
اذا نفذنا الامر التالي:
RCL AL,1
قبل التنفيذ
AL CF
0
0
1
1
1
1
0
1
0
بعد التنفيذ:
AL
0
1
1
1
1
0
1
0
0
ملاحظة:المصدر هنا عبارة عن قيمة عددية ويجب ان تكون 1 وفقط واحد وفي حالة اذا اردنا تدوير اكثر من بت واحدة فهنالك حلان
الحل الاول ان نسجل الامر بقدر عدد مرات البتات المراد تدويرها مثلا:
RCL AL,1
RCL AL,1
RCL AL,1
فهنا تم تدوير ثلاث بتات .
حل اخر: نضع في CL عدد مرات الدوران ثم نسجل الامر
مثال:
MOV CL,3
RCL AL,CL
الامر
الاختصار
ROR
ROTATE RIGHT
ROL
ROTATE LEFT
RCR
ROTATE RIGHT WITH CARRY
RCL
ROTATE LEFT WITH CARRY
SAL
SHIFT ARITHMETIC LOGICAL LEFT
SAR
SHIFT ARITHMETIC LOGICAL RIGHT