تعليمات الإزاحة - شرح المعالج 8086 تعليمات الإزاحة - شرح المعالج 8086 - اقرا معي وتعلم على الانترنت

تعليمات الإزاحة - شرح المعالج 8086

تعليمات الإزاحة - شرح المعالج 8086

ضمن دروس learn 8086 assembly language programming ,  نواصل معكم ...
في التدوينات الماضية بعض تاريخ عائلات المعالجات CPU – computer interface ثم تحدثنا عن معالجات 4CISC و معالجات RISC وذكرنا الفرق بين معالجات 4CISC و معالجات RISC ومبدأ المعالجة التواردية 
هذا روابط التدوينا السابقة 
واليوم نأخذ :
تعليمات الإزاحة
تسمح تعليمات الإزاحة بإزاحة بتات معامل، بطول بايت أو 2 بايت، إزاحة منطقية أو حسابية.
يمكن أن تنفذ تعليمات الإزاحة على الأكثر 255 إزاحة، ويُحدد معامل العد count operand في التعليمة عدد مرات الإزاحة. يمكن أن يكون معامل العد قيمة ثابتة أو محتوى السجل CL .
تؤثر هذه التعليمات على حالة بعض رايات سجل الراية، كما يجري إزاحة البت الأولى من المعامل إلى بت الحامل CF في عمليات الإزاحة نحو اليمين، و إزاحة البت العليا من المعامل إلى بت الحامل CF في عمليات الإزاحة نحو اليسار. يبين الشكل التالي عمل تعليمات الإزاحة
SHL, SAL, SHRو SAR

تعليمات الإزاحة - شرح المعالج 8086


التعليمتان  SHL و SAL
هاتان التعليمتان متكافئتان، تعملان على إزاحة بتات معامل الوجهة يسارًا. يجري إدخال صفر
في البت الأولى من المعامل بعد كل إزاحة.

التعليمة SHR
تنفذ هذه التعليمة إزاحة منطقية على معامل الوجهة يمينًا. يجري إدخال صفر في البت الأخيرة
من المعامل بعد كل إزاحة.

التعليمة SAR
تنفذ هذه التعليمة إزاحة حسابية على معامل الوجهة نحو اليمين. يجري دومًا إدراج بت الإشارة
في البت الأعلى من المعامل.

مثال:
MOV AL, 11100000b
SHL AL, 1 ; AL = 11000000b, CF=1.

اختبار ذاتي: اكتب برنامجًا يضرب AX بـ 10 مستخدمًا عمليات إزاحة وجمع.
الجواب
SHL AX,1
MOV BX, AX
MOV CL, 2
SHL AX, CL
ADD AX, BX

تعليمات الدوران
تسمح تعليمات الدوران بإزاحة بتات معامل، بطول بايت أو 2 بايت، يمينًا أو يسارًا كما في
تعليمات الإزاحة، ويكمن الفرق بين تعليمات الإزاحة والدوران أنه لا يجري في تعليمات
الدوران إهمال البت المزاحة خارجًا وإنما يعاد إدخالها من جديد في المعامل. تؤثر هذه
التعليمات على حالات بعض الرايات.

يبين الشكل التالي عمل تعليمات الدوران RCL , ROL, RCR و ROR .
تعليمات الإزاحة - شرح المعالج 8086

التعليمة RCL
تنفذ هذه التعليمة إزاحة دورانية لبتات معامل الوجهة نحو اليسار عبر الحامل. يجري في هذه التعليمة إدراج الحامل CF في البت الأولى من المعامل ويأخذ الحامل قيمة البت العليا من المعامل.
التعليمة ROL
تنفذ هذه التعليمة إزاحة دورانية لبتات معامل الوجهة نحو اليسار عبر الحامل. يجري في هذه
التعليمة إدراج البت العليا في البت الأولى من المعامل ويأخذ الحامل أيضًا قيمة البت العليا من
المعامل.
التعليمة RCR
تنفذ هذه التعليمة إزاحة دورانية لبتات معامل الوجهة نحو اليمين عبر الحامل. يجري في هذه التعليمة إدراج الحامل CF في البت الأعلى من المعامل ويأخذ الحامل قيمة البت الأولى من المعامل .

التعليمة ROR
تنفذ هذه التعليمة إزاحة دورانية لبتات معامل الوجهة نحو اليمين عبر الحامل. يجري في هذه
التعليمة إدراج البت الأولى في البت العليا من المعامل ويأخذ الحامل أيضًا قيمة البت الأولى من
المعامل.
مثال:
STC ; set carry (CF=1).
MOV AL, 1Ch ; AL = 00011100b
RCL AL, 1 ; AL = 00111001b, CF=0.
اختبار ذاتي: اكتب برنامجًا يُحصي عدد الوحدان في بايت ويضع الناتج في BL :
الحل
DATA1 DB 97 ; 61h
SUB BL,BL ;clear BL to keep the number of 1s
MOV DL,8 ;rotate total of 8 times
MOV AL,DATA1
AGAIN:
ROL AL,1 ;rotate it once
JNC NEXT ;check for 1
INC BL ;if CF=1 then add one to count
NEXT: DEC DL ;go through this 8 times
JNZ AGAIN ;if not finished go backNOP

تعليمات البرامج الفرعية
إذا كان برنامجك يُكرر تنفيذ مجموعة من التعليمات، مثل جمع قيم مصفوفة أو إيجاد القيمة
العظمى بين مجموعة معطيات، فمن الأفضل وضع هذه التعليمات معًا ضمن وحدة تسمى
برنامجًا فرعيًا أو إجرائية.
يمكن طلب الإجرائية من أي نقطة من برنامجك الرئيس باستخدام تعليمة CALL , عندها يُخزِن المعالج عنوان أول بايت من التعليمة التي تلي تعليمة CALL في المكدس، ثم يَشحن IP بعنوان أول بايت من التعليمة الأولى في البرنامج الفرعي. يُنفذ المعالج تعليمات الإجرائية حتى يصل إلى تعليمة RET , التي تُشير إلى نهاية الإجرائية. عندها يَشحن المعالج IP بالعنوان المخزن في المكدس ويعود المعالج ليتابع تنفيذ التعليمات ابتداءً من التعليمة التي تلت تعليمة الاستدعاء CALL كما هو مبين في الصورة التالية
تعليمات الإزاحة - شرح المعالج 8086


تبدأ إجرائية بمعرف يحدد اسم الإجرائية متبوعًا بالكلمة المختزلة proc , وتنتهي أيضًا باسم الإجرائية متبوعًا بالكلمة المختزلة .endp ويمكننا التمييز بين نوعين من الاستدعاء:
قريب NEAR CALL و بعيد .FAR CALL
الاستدعاء القريب NEAR CALL
في الاستدعاء القريب تقع الإجرائية ضمن مقتطع البرنامج الرئيس نفسه، في هذه الحالة تخزن (تدفع) قيمة IP في المكدس ويُشحن IP بالعنوان الفعال للتعليمة الأولى من الإجرائية. يمكن أن يكون العنوان الفعال مضمنًا في التعليمة نفسها أو موجودًا في أحد سجلات المعالج أو في موقع
ذاكرة، وبالتالي يمكن أن نميز بين استدعاء بعنونة مباشرة أو غير مباشرة.
عنونة مباشرة: في هذه الحالة تتضمن تعليمة CALL إزاحة بطول 2-بايت مع إشارة، ويُحسب عنوان بداية الإجرائية بإضافة هذه الإزاحة إلى IP. يمكن بهذه الطريقة طلب إجرائية تبعد على الأكثر بين -32768  و +32767  بايت عن أول بايت من التعليمة التي تلي تعليمة ال CALL
عنونة غير مباشرة: في هذه الحالة يقع العنوان الفعال للإجرائية في أحد سجلات المعالج أو
في موقعين متتاليين من الذاكرة. ويمكننا بالتالي استخدام أحد أنماط عنونة الذاكرة غير المباشرة لقراءة العنوان الفعال للإجرائية.
مثال:
CALL CallTbl[bx] ;Index into an array of pointers.
CALL word ptr [bx] ;BX points at word to use.

الاستدعاء البعيد FAR CALL
في الاستدعاء البعيد، يقع البرنامج الفرعي ضمن مقتطع مختلف عن المقتطع الذي يحتوي
البرنامج الرئيس. يجري في الاستدعاء البعيد:
-1 دفع قيمة IP و CS الى المكدس.
-2 تحميل CS:IP بالعنوان المنطقي للتعليمة الأولى من الإجرائية.
تعليمات الإزاحة - شرح المعالج 8086

يمكن أن يكون العنوان المنطقي جزء من التعليمة أو في موقع ذاكرة، وبالتالي يمكن أن نميز
بين استدعاء بعنونة مباشرة أو غير مباشرة.
عنونة مباشرة: تتضمن التعليمة، في العنونة المباشرة، العنوان المنطقي لبداية الإجرائية، الذي يشحن في زوج السجلات .CS:IP يخزن في التعليمة أولاً الانزياح ثم يليها المقتطع.
عنونة غير مباشرة: في هذه الحالة يقع العنوان المنطقي لبداية الإجرائية في أربع موقع متتالية من الذاكرة، يحتوي أول بايتين قيمةIP ويحوي البايتين الثالث والرابع على قيمة CS.
يمكننا استخدام أحد أنماط عنونة الذاكرة غير المباشرة لقراءة العنوان المنطقي للإجرائية.

مثل
CALL DWordVar
CALL dword ptr [bx]

تعليمة RET
عندما يصادف المعالج تعليمة RET يُنهي تنفيذ تعليمات الإجرائية ويعود إلى البرنامج الذي استدعى الإجرائية. يتابع المعالج تنفيذ التعليمات ابتداءً من التعليمة التي تلت مباشرة تعليمة طلب الإجرائية. ويتم ذلك بشحن IP بآخر كلمة مخزنة في المكدس إذا كانت تعليمة CALL من النوع القريب، أو بشحن زوج السجلات CS:IP بآخر كلمة مضاعفة مخزنة في المكدس إذا كانت تعليمة CALL من النوع البعيد.
مثال: يبين البرنامج التالي مثالا عن تمرير متغيرات parameters إلى إجرائية عبر المكدس. يضع أولا البرنامج الرئيس قيمًا في السجلين AX و BX ومن ثم يدفع بهما إلى المكدس، ويستدعي أخيرًا الإجرائية ADDM لجمع القيمتين. تقرأ الإجرائية ADDM المتغيرات من المكدس وتضع ناتج جمعهما في AX .
MOV AX, 30
MOV BX, 40
PUSH AX ; stack parameter 1
PUSH BX ; stack parameter 2
CALL ADDM
ADDM PROC NEAR
PUSH BP ; save BP
MOV BP, SP ; address stack with BP
MOV AX, [BP+4] ; get parameter 1
ADD AX, [BP+6] ; add parameter 2
POP BP
RET
ADDM ENDP


شارك الموضوع
تعليقات
محتوى قد يهمك

.