Navigation

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

تسمح تعليمات الإزاحة بإزاحة بتات معامل، بطول بايت أو 2 بايت، إزاحة منطقية أوحسابية. يمكن أن تنفذ تعليمات الإزاحة على الأكثر 255 إزاحة، ويُحدد معامل العد count operand في التعليمة عدد مرات الإزاحة. يمكن أن يكون معامل العد قيمة ثابتة أومحتوى السجل CL . تؤثر هذه التعليمات على حالة

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

ضمن دروس learn 8086 assembly language programming , نواصل معكم ...

في التدوينات الماضية بعض تاريخ عائلات المعالجات CPU – computer interface ثم تحدثنا عن معالجات 4CISC و معالجات RISC وذكرنا الفرق بين معالجات 4CISC و معالجات RISC ومبدأ المعالجة التواردية

واليوم نأخذ :
تعليمات الإزاحةتسمح تعليمات الإزاحة بإزاحة بتات معامل، بطول بايت أو 2 بايت، إزاحة منطقية أوحسابية.
يمكن أن تنفذ تعليمات الإزاحة على الأكثر 255 إزاحة، ويُحدد معامل العد count operand في التعليمة عدد مرات الإزاحة. يمكن أن يكون معامل العد قيمة ثابتة أومحتوى السجل CL .
تؤثر هذه التعليمات على حالة بعض رايات سجل الراية، كما يجري إزاحة البت الأولى منالمعامل إلى بت الحامل CF في عمليات الإزاحة نحو اليمين، و إزاحة البت العليا منالمعامل إلى بت الحامل CF في عمليات الإزاحة نحو اليسار. يبين الشكل التالي عملتعليمات الإزاحة
SHL, SAL, SHRو SAR




التعليمتان 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 .





التعليمة 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 كما هو مبين في الصورة التالية







تبدأ إجرائية بمعرف يحدد اسم الإجرائية متبوعًا بالكلمة المختزلة 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 بالعنوان المنطقي للتعليمة الأولى من الإجرائية.


يمكن أن يكون العنوان المنطقي جزء من التعليمة أو في موقع ذاكرة، وبالتالي يمكن أننميز
بين استدعاء بعنونة مباشرة أو غير مباشرة.
عنونة مباشرة: تتضمن التعليمة، في العنونة المباشرة، العنوان المنطقي لبداية الإجرائية،الذي يشحن في زوج السجلات .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
مشاركة

أضف تعليق:

0 comments: