ويمكنكم الاطلاع ايضا على الدروس السابقة من خلال الروابط التالية :
الدرس الثاني معالجات 4CISC و معالجات RISC - computer interface
الدرس الثالث المعالجات التواردية pipelining
الدرس الخامس المتحكمات الصغرية Microcontroller
الدرس السابع البنية الداخلية للمعالج 8088/ 8086
الدرس الثامن السجلات الداخلية للمعالج 8088/ 8086
الدرس التاسع تنظيم ذاكرة المعالج 8086
الدرس العاشر انماط العنونة addressing modes
الدرس الحادي غشر البرمجة بلغة التجميع assembly language
الدرس الثاني عشر موجِّهات او ايعازات لغة التجميع Assembler Directives
الدرس الثالث عشر تعليمات المعالج 8088/ 8086 - لغة التجميع
الدرس الرابع عشر تعليمات القفز المشروط - شرح المعالج 8086
الدرس الخامس عشر تعليمات الإزاحة - شرح المعالج 8086
الدرس الخامس عشر تعليمات الإزاحة - شرح المعالج 8086
الدرس السادس عشر تعليمات المكدس - شرح المعالج 8086
واليوم نأخذ الحلقة التكرارية loop في الاسمبلي, تسمح تعليمات الحلقات بتكرار تنفيذ مجموعة من التعليمات عدة مرات.
التعليمة LOOP
تُنقص تعليمة LOOP محتوى CX بواحد ومن ثم يجري القفز إلى الموقع المحدد بالتعليمة إذا كانت قيمة CX لا تساوي الصفر بعد عملية الإنقاص.
يجب أن يقع مكان القفز ضمن -128 و +128 بايت عن تعليمة ال .LOOP
مثال: يعمل البرنامج التالي على وضع في المصفوفة array , المكونة من 256
عنصر، القيم 0 1 2 3 …..
MOV CX, 255
ArrayLp: MOV Array[CX], CL
LOOP ArrayLp
MOV Array[0], 0
التعليمتان LOOPE/LOOPZ
انهما متكافئتان تنقص كلتا التعليمتان محتوى
CX بواحد وتقفز إلى الموقع المحدد بالتعليمة إذا كانت: قيمة CX لا تساوي الصفر بعد عملية الإنقاص و ZF تساوي 1. يجب أن يقع مكان القفز ضمن 128 - و 127
+ بايت عن التعليمة LOOPZ أو
LOOPE .
هاتان التعليمتان مفيدان في تكرار حلقة عدد من المرات طالما بقيت قيمة متحول ما مختلفة عن
(لا تساوي) قيمة معينة.
مثال: بفرض أن عدد عناصر المصفوفة Array هو 16
، فإن التعليمات التالية تقوم بالبحث عن أول عنصر في المصفوفة Array لا يساوي الصفر.
MOV CX, 16 ;Max 16 array
elements.
MOV BX, -1 ;Index into the
array (note next inc).
SearchLp: INC BX ;Move on to next array element.
CMP Array[BX], 0 ;See if
this element is zero.
LOOPE SearchLp ;Repeat if it
is.
JE AllZero ;Jump if all
elements were zero.
التعليمتان LOOPNE/LOOPNZ
إن التعليمتان LOOPNE و LOOPNZ أيضًا متكافئتان. ُتنقص كلتا التعليمتان محتوى
CX بواحد وتقفز إلى الموقع المحدد بالتعليمة: إذا كانت قيمة CX لا تساوي الصفر بعد عملية الإنقاص و ZF تساوي 0. يجب أن يقع مكان القفز ضمن 128 - و 127
+ بايت عن التعليمة LOOPE أو
LOOPNZ .
هاتان التعليمتان مفيدان في تكرار حلقة عددًا من المرات بانتظار أن يتحقق شرط آخر.
مثال: بفرض أن عدد عناصر المصفوفة Array هو 16
، فإن التعليمات التالية تقوم بالبحث في المصفوفة عن أول عنصر يساوي
.0h
MOV CX, 16 ;Maximum #
of array elements.
MOV BX, -1 ;Index into
array.
LoopWhlNot0: INC BX
;Move on to next array element.
CMP Array[BX],0 ;Does
this element contain zero?
LOOPNE LoopWhlNot0
;Quit if it does, or more than 16 bytes.
التعليمة JCXZ
تقفز هذه التعليمة إلى الموقع المشار إليه في التعليمة إذا كانت قيمة CX لا تساوي 0. يمكن أن تستخدم هذه التعليمة لفحص فيما إذا كان [CX]=0 كما تستخدم هذه التعليمة قبل بداية الحلقة لمنع الدخول في الحلقة إذا كان [CX]=0 .
اختبار ذاتي: اكتب برنامجًا يبحث عن العلامة الأعظم من بين 5 علامات مخزنة في الذاكرة، اكتب النتيجة في DL.
الجواب
DATA DB 51, 44, 99,
88, 80 ;
MOV CX,5 ;set up loop
counter
MOV BX, OFFSET
DATA ;BX points to GRADE data
SUB AL,AL ;AL holds highest grade
found so far
AGAIN: CMP
AL,[BX] ;compare next grade to
highest
JA NEXT ;jump if AL still
highest
MOV AL,[BX] ;else AL holds new
highest
NEXT:INC BX ;point to next grade
LOOP AGAIN ;continue search
MOV DL, AL
الى اللقاء في التدوينة القادمة
لا تنسى دعمنا بالمشاركة ونسخ الرابط في المواقع المفضلة لديك
دمت بألف خير عزيزنا الزائر
إرسال تعليق
لا تبخل علينا باقتراحك او قم بمشاركة الموضوع ليستفيد الاخرين ايضاً شكرا لزيارتك عزيزي الزائر