في التدوينة السابقة اخذنا
مقاطعات (Interrupt) المعالج 8088/8086
ناخذ اليوم موضوع المقاطعات الداخلية (شرح المعالج 8086) - Internal Interrupts
يولد المعالج آليًا المقاطعات التالية:
المقاطعة نمط 0: خطأ تقسيم Divide Error تحدث هذه المقاطعة داخليًا عندما يكون ناتج عملية . القسمة أكبر من سعة سجل الوجهة أو عند محاولة القسمة على 0
المقاطعة نمط 1: مقاطعة الخطوة الواحدة Single Step Interrupt يولد المعالج مقاطعة من النمط 1
بعد تنفيذ كل تعليمة، إذا كان TF=0 يستخدم هذا نمط من المقاطعة عادة في تنقيح debug
البرنامج.
يمكننا، مثلا، إظهار أو طباعة سجلات المعالج الداخلية، ضمن إجرائية خدمة هذه المقاطعة.
المقاطعة نمط 3: مقاطعة نقطة التوقف Breakpoint Interrupt يجري عادة إقحام طلب هذه المقاطعة بكتابة التعليمة INT 3 عند نقطة حرجة في البرنامج خلال مرحلة تنقيحه، لإظهار محتوى
سجلات المعالج أو الذاكرة أو غير ذلك.
المقاطعة نمط 4: مقاطعة الطفح Overflow تسبب المقاطعة INTO مقاطعة من النمط 4
بعد
الانتهاء من تنفيذ التعليمة الحالية إذا كان OF=1
للمقاطعات الداخلية (ما عدا مقاطعة الخطوة الواحدة) أولوية على المقاطعات الخارجية، كما لا يمكننا، باستثناء مقاطعة الخطوة الواحدة، تحجيب هذه المقاطعات.
مثال:
تنتج التعليمة DIV في البرنامج التالي مقاطعة من نمط 0
لأنها تقسم محتوى CL على صفر .
MOV AL,92
SUB CL, CL
DIV CL ; 92/0 undefined
اختبار ذاتي:
اكتب إجرائية تطبع على الشاشة ‘Division by zero attempted’ كلما جرت محاولة القسمة على الصفر .
الجواب:
.MODEL TINY
.CODE
JMP START
OLD DD ? ; space for old vector
Prompt DB 'Division by zero attempted$'
Diverr PROC FAR ;
procedure print Prompt
PUSH DX
MOV AH, 09h
MOV DX, offset prompt
INT 21h
POP DX
IRET
Diverr ENDP
; start installation
START:
MOV AX,0 ;
address segment 0000h
MOV DS, AX
MOV AX, DS:[00h] ; get INT 00h
offset
MOV WORD PTR CS:OLD,AX ; save it
MOV AX, DS:[02h] ; get INT 00h
MOV WORD PTR CS:OLD+2,AX ; save it
MOV DS:[100], OFFSET Diverr ; save
offset
MOV DS:[102], CS ; save segment
التعليمات الخاصة بالمقاطعات
تتضمن محموعة تعليمات المعالج 8088/8086 تعليمات خاصة بالمقاطعات، وهي:
-
:CLI تضع صفرًا في الراية
IF
, وتستخدم لحجب المقاطعات الخارجية.
-
STI تضع واحدًا في الراية
IF
,
وتستخدم لتأهيل المقاطعات الخارجية .
-
INT nn
: تطلب برمجيًا المقاطعة ذات النمط nn .
-
IRET
تنهي هذه التعليمة إجرائية المقاطعة. يجب الانتباه هنا إلى أنه يجب استخدام التعليمة
IRET
وليس
RET
لإنهاء إجرائية المقاطعة والعودة إلى البرنامج المقاطع، لأن التعليمة IRET تعيد تحميل سجل الراية قبل العودة إلى البرنامج المقاطع بينما لا تفعل ذلك التعليمة RET .
-
:INTO
تنفذ هذه التعليمة المقاطعة ذات النمط 4 في حال حدوث طفح نتيجة لتنفيذ تعليمة سابقة أدت إلى وضع 1 في الراية OF يفضل استخدام هذه التعليمة بعد كل عملية حسابية يمكن أن تنتج طفحًا.
-
HLT ينتظر المعالج بعد تنفيذ هذه التعليمة حدوث مقاطعة خارجية أو إعادة تشغيل reset
-
WAIT
ينتظر المعالج بعد تنفيذ هذه التعليمة حتى يصبح الدخل على مغرز المعالج TEST' مساويًا 1 .
اختبار ذاتي: لا تتضمن مجموعة تعليمات المعالج 8088/8086 تعليمة تسمح بتغيير حالة الراية TF اكتب تعليمات ُتعكس حالة الراية TF
الجواب:
PUSHF
POP A
XOR AX,
0000000100000000B
PUSH AX
POPF
أولويات المقاطعات
يحتوي المعالج على خمسة أنواع من المقاطعات:
اولا Reset
ثانيا المقاطعات الداخلية
ثالثا المقاطعات البرمجية
رابعا المقاطعة الخارجية غير قابلة للحجب NMI
خامسا المقاطعة الخارجية على المغرز
INTR
.
وهذه المقاطعات مرتبة بحسب أولويتها من الأعلى إلى الأدنى.
فإذا حدث أكثر من مقاطعة بآن واحد
فإن المعالج يخدم المقاطعة الأعلى أولوية ثم الأقل وهكذا. يمكن لمقاطعة أن تقاطع مقاطعة لها أولوية أدنى منها، بينما على المقاطعة انتظار انتهاء المقاطعة الأعلى منها أولوية حتى يجري تخديمها.
إرسال تعليق
لا تبخل علينا باقتراحك او قم بمشاركة الموضوع ليستفيد الاخرين ايضاً شكرا لزيارتك عزيزي الزائر