لغة التجميع 8085 Assembly Language for MP
فهرس |
هي عقل الحاسب، تنفذ جميع العمليات الحسابية و المنطقية التي يطلبها البرنامج. فالعمليات الحسابية مثل الجمع و الطرح و الزيادة و التنقيص و المقارنة. و العمليات المنطقية هي عمليات تجرى على مستوى البت (لأن للبت قيمتين فقط 0، 1).
تقوم بتنظيم و التحكم بالاتصال بين المعالج و أجزاء الحاسب المختلفة (أجهزة الإدخال و الإخراج و التخزين). فيسهل على المعالج استقبال البيانات من وحدات الإدخال و إرسال المعلومات إلى أجهزة الإخراج و التوصل مع أجهزة التخزين دون حدوث تعارض أو إرباك عند النقل.
يوجد في المعالج عدة مسجلات يستخدمها في تخزين البيانات مؤقتاً أثناء معالجتها. و "المسجل Register" هو ذاكرة صغيرة، مكونة من هو دوائر إلكترونية من النوع JK Filip-Flop قادرة على تخزين مجموعة محددة من البتات تسمى "كلمة WORD"، و التي يختلف حجمها باختلاف المعالج (8بت أو 16بت أو 32بت ...).
1. Zero Flag يتم تفعيله إذا كان ناتج العملية الحسابية أو المنطقية يساوي صفر. 2.Sign Flag يتم تفعيله إذا كان أعلى bit (Most Significant Bit (MSB)) في ناتج العملية الحسابية أو المنطقية يساوي 1. 3. Auxilary Cary Flag يتفعَّل إذا حدث Carry من البت الرابع إلى الخامس (إذا حدث Carry من النصف الأول للبايت). 4. Parity Flag يتم تفعيله إذا كان عدد الواحدات في ناتج العملية الحسابية أو المنطقية زوجياً. 5. Carry Flag يتم تفعيله إذا كان ناتج العملية الحسابية أكبر من سعة المركم.
ADI, ACI, SUI, SBI, ANI, ORI, XRI
XCHG, LXI, XRI, INX, DCX ? instructions deal with 16 bits و في معالجات ذات 16 bits تسمى المسجلات: AX, BX, CX, DX.
• تقوم بها وحدة الحساب و المنطق Arithmatic & Logic Unit (ALU). • يتم تنفيذها جميعاً على المركم A، و الذي هو في الأساس من أجزاء وحدة الحساب و المنطق ALU. • تؤثر على محتوى المسجل F (Flag Register)، وفق نتيجة العملية المنفذة. • إيعازات الحساب هي: ADD, ADI, ADC, ACI, SUB, SUI, SBB, SBI, INR, DCR • جميع العمليات الحسابية و المنطقية لها "معامل Operand" واحد فقط (و المعامل الأول لا يكتب و هو المركم A). • ما عدا الإيعاز CMA فليس لها "معامل Operand" (معاملها الوحيد لا يكتب و هو المركم A). • إيعاز DAD: ? تقوم بإضافة عدد ذو 16 bit موجود في أحد "أزواج المسجلات rp" B, D, H, SP إلى العدد الموجود في زوج المسجلات H. ? لا تتعامل مع المركم، و لا تؤثر على المسجل F، إلا على CY في حال أن ناتج الجمع قد زاد طوله على 16 bits). ? لها أربعة احتمالات فقط كما يلي: DAD B, DAD D, DAD H, DAD SP
• لتنفيذ أي عملية حسابية أو منطقية نقوم بثلاث مراحل (عموماً): 1. نقل العدد الأول إلى المركم A. 2. تنفيذ العملية الحسابية أو المنطقية عليه. 3. إخراج الناتج من المركم، حتى يتم استخدام المركم في عمليات أخرى. و مثال ذلك: MOV A, B ? (1) ADI 30 ? (2) MOV C, A ? (3)
• تقوم ADD و ADI بالإضافة إلى المركم، بينما تقوم SUB و SUI بالطرح من المركم، و احتمالاتها كالتالي: ADD A, ADD B, ADD C, ADD D, ADD E, ADD H, ADD L, ADD M, ADI nn SUB A, SUB B, SUB C, SUB D, SUB E, SUB H, SUB L, SUB M, SUI nn • موقع الذاكرة الذي يشار إليه بـ M يتم تحديد عنوانه حسب محتوى زوج المسجلات HL. • الإيعازان ADC, ACI تقوما بالإضافة إلى المركم مع إضافة محتوى Carry Flag إلى المركم، و احتمالاتهما كما يلي: ADC A, ADC B, ADC C, ADC D, ADC E, ADC H, ADC L, ADC M, ACI nn • الإيعازان SBB, SBI تقوما بالطرح من المركم مع طرح محتوى Carry Flag من المركم، و احتمالاتهما كما يلي: SBB A, SBB B, SBB C, SBB D, SBB E, SBB H, SBB L, SBB M, SBI nn Examples: XRA A ? A = 00, CY = 0 | XRA A ? A = 00, CY = 0 MVI A, 13 ? A = 13 | MVI A, 13 ? A = 13 ACI F3 ? A = 06, CY = 1 | SUI F3 ? A = 20, CY = 1 ACI 03 ? A = 0A, CY = 0 | SBI 03 ? A = 1C, CY = 0 ACI 03 ? A = 0D, CY = 0 | SBI 03 ? A = 19, CY = 0 ACI FD ? A = 0A, CY = 1 | SUI FD ? A = 1C, CY = 1 ACI FE ? A = 09, CY = 1 | SBI FE ? A = 1E, CY = 1
• تقوم INR بإضافة واحد إلى محتوى المسجل أو الذاكرة بينما تقوم DCR بطرح واحد من محتوى المسجل أو الذاكرة. • موقع الذاكرة الذي يشار إليه بـ M يتم تحديد عنوانه حسب محتوى زوج المسجلات HL. • INR, DCR تؤثران على محتوى المسجل F إلا أنهما لا تؤثران على Carry Flag. أما إحتمالاتهما فهي كما يلي: INR A, INR B, INR C, INR D, INR E, INR H, INR L, INR M DCR A, DCR B, DCR C, DCR D, DCR E, DCR H, DCR L, DCR M • INX تزيد محتوى زوج مسجلات (RegisterPair (rp)) بمقدار واحد، بينما تطرح DCX واحد من زوج مسجلات. و احتمالاتهما: INX B, INX D, INX H, INX SP, DCX B, DCX D, DCX H, DCX SP • INX, DCX لا تؤثران على محتوى المسجل F. و لذلك، بعد تنفيذ DCX لا يمكن تمييز ما إذا وصل زوج المسجلات إلى الصفر عبر ZF. • للتأكد من أن محتوى زوج مسجلات = 0، نقوم بثلاث خطوات: 1. نقل محتوى المسجل الأول إلى المركم A. 2. تنفيذ عملية ORA مع المسجل الثاني. 3. استخدام إحدى دوال القفز (JZ, JNZ) و التي تقفز حسب قيمة ZF. و مثال ذلك، للتأكد من أن زوج المسجلات D = 0: X1: ………
DCX D MOV C, A ? A = C ORA D? A = A v D JNZ X1
• الإيعازات المنطقية هي ANA, ANI, ORA, ORI, XRA, XRI, CMA, CMC, STC ، و تعمل على مستوى البت ما يلي:
A | B | ANA B | ORA B | XRA B | CMA | ANI 4D |
1100 0010 | 1010 0110 | 1000 0010 | 1110 0110 | 0110 0100 | 0011 1101 | 0100 0000 | Anothr Example: MVI A, 36 ? A = 36 0011 0110
ANI 57? A = 16 ? 0101 0111 MOV B, A ? B = 16 0001 0110
• أما احتمالاتها فهي: ANA A, ANA B, ANA C, ANA D, ANA E, ANA H, ANA M, ANA L, ANI nn ORA A, ORA B, ORA C, ORA D, ORA E, ORA H, ORA M, ORA L, ORI nn XRA A, XRA B, XRA C, XRA D, XRA E, XRA H, XRA M, XRA L, XRI nn, CMA, CMC, STC • الإيعاز XRA A تقوم بتصفير المركم (لأن A ? A = 0، "فكل bit يطابق نظيره")، و لا تقوم XRA B مثلاً بالتصفير. MVI A, 36 ? A = 36 0011 0110 | MVI A, 36 ? A = 36 0011 0110 XRA A ? A = 00 0011 0110 | MVI B, 16 ? B = 16 0001 0110
0000 0000 = 0 | XRA B ? B = 20 ? 00010 0000
• الإيعاز CMA ليس لها معامل، و هي تقوم بنفي محتوى المركم (إيجاد 1's Complement)، كما في المثال: MVI A, 36 ? A = 36 0011 0110 CMA ? A = C9 1100 1001 • الإيعاز CMC ليس لها معامل، و هي تقوم بنفي بت CY فقط، و لا تؤثر على بقية الرايات في المسجل F. • الإيعاز STC ليس لها معامل، و هي تقوم بتفعيل بت CY فقط، و لا تؤثر على بقية الرايات في المسجل F. • و لعكس إشارة محتوى المركم (إيجاد 2's Complement) نضيف 1 في المثال السابق باستخدام INR A أو ACI 1 كما يلي: MVI A, 36 0011 0110 ? 54 (as a signed decimal) CMA 1100 1001 ? -55 (as a signed decimal) INR A 1100 1010 ? -54 (as a signed decimal)
• إيعازات التدوير تقوم بتدوير بتَّات المركم إلى اليمين أو اليسار، و لا تؤثر إلا على CY فقط، و لها الاحتمالات: RAR, RRC, RAL, RLC • تقوم RAR بتدوير محتوى المركم بمقدار bit واحد إلى اليمين، و تستخدم CY كوسيط للبتِّ الخارج. | CY | A | | CY | RAR A | | 1 | 1001 0101 | ? | 1 | 1100 1010 | | 0 | 0011 0111 | ? | 1 | 0001 1011 | | 1 | 0101 0110 | ? | 0 | 1010 1011 | • تقوم RRC بتدوير محتوى المركم بمقدار bit واحد إلى اليمين، ولا تستخدم CY كوسيط للبتِّ الخارج، لكنها تؤثر عليه. | CY | A | | CY | RRC A | | 1 | 1001 0101 | ? | 1 | 1100 1010 | | 0 | 0011 0111 | ? | 1 | 1001 1011 | | 1 | 0101 0110 | ? | 0 | 0010 1011 | بعد تنفيذ RRC نلاحظ أن (CY = Most Significant Bit (msb))، و تعبر عن الإشارة للعدد الناتج بعد التدوير. • تقوم RAL بتدوير محتوى المركم بمقدار bit واحد إلى اليسار، و تستخدم CY كوسيط للبتِّ الخارج. | CY | A | | CY | RAL A | | 1 | 1001 0100 | ? | 1 | 0010 1001 | | 0 | 0011 0111 | ? | 0 | 0110 1110 | | 1 | 0101 0110 | ? | 0 | 1010 1101 | • تقوم RLC بتدوير محتوى المركم بمقدار bit واحد إلى اليسار، ولا تستخدم CY كوسيط للبتِّ الخارج، لكنها تؤثر عليه. | CY | A | | CY | RAL A | | 1 | 1001 0100 | ? | 1 | 0010 1001 | | 0 | 0011 0111 | ? | 0 | 0110 1110 | | 1 | 0101 0110 | ? | 0 | 1010 1100 | بعد تنفيذ RLC نلاحظ أن (CY = Least Significant Bit (lsb))، و تحدد ما إذا كان العدد الناتج بعد التدوير فردياً أو زوجياً.
• تقوم بعمل مشابه لعمل SUB و SUI إلا أنها لا تؤثر على أي مسجل و لا تسجل الناتج في المركم، فقط تؤثر على المسجل Flag. و احتمالاتها: CMP A, CMP B, CMP C, CMP D, CMP E, CMP H, CMP L, CMP M, CPI mmnn • نستخدمها غالباً للمقارنة ليتم تغيير مسار تنفيذ البرنامج (باستخدام إيعازات القفز) بناءً على محتوى المسجل F المتأثر بها.
• تعملا على نقل 8 bits، و ليس لهما تأثير على محتوى المسجل F. • الإيعاز MVI تنقل قيمة إلى مسجل، أو إلى الذاكرة. و MOV تنقل محتوى مسجل إلى مسجل، أو محتوى مسجل إلى الذاكرة، أو بايت من الذاكرة إلى مسجل. و موقع الذاكرة الذي يتم النقل منه أو إليه يتم تحديد عنوانه حسب محتوى زوج المسجلات HL. • إحتمالات MVI = 8 إحتمالات، بينما إحتمالات MOV = 63 إحتمال، وهي كما يلي: MVI A,nn; MVI B,nn; MVI C,nn; MVI D,nn; MVI E,nn; MVI H,nn; MVI L,nn; MVI M,nn MOV A, A; MOV B, A; MOV C, A; MOV D, A; MOV A, E; MOV A, H; MOV L, A; MOV M, A MOV A, B; MOV B, B; MOV C, B; MOV D, B; MOV A, E; MOV A, H; MOV L, B; MOV M, B MOV A, C; MOV B, C; MOV C, C; MOV D, C; MOV A, E; MOV A, H; MOV L, C; MOV M, C MOV A, D; MOV B, D; MOV C, D; MOV D, D; MOV A, E; MOV A, H; MOV L, D; MOV M, D MOV A, E; MOV B, E; MOV C, E; MOV D, E; MOV A, E; MOV A, H; MOV L, E; MOV M, E MOV A, H; MOV B, H; MOV C, H; MOV D, H; MOV A, E; MOV A, H; MOV L, H; MOV M, H MOV A, L; MOV B, L; MOV C, L; MOV D, L; MOV A, E; MOV A, H; MOV L, L; MOV M, L MOV A, M; MOV B, M; MOV C, M; MOV D, M; MOV A, E; MOV A, H; MOV L, M • لا تقوم MOV بالنقل من الذاكرة إلى الذاكرة مباشرةً، فلا يمكن كتابة MOV M, M.
• تقوم بنقل عدد عدد ذو 16 bits، إلى زوج مسجلات. ولا تؤثر على محتوى المسجل F، (و لا تعمل مع المسجل PC)، و احتمالاتها كالتالي: LXI B, nnmm; LXI D, nnmm; LXI H, nnmm; LXI SP, nnmm
• تقوم بالنقل بين المركم و الذاكرة، و بالتالي فهي تتعامل مع 16 bits تعبر عن موقع الذاكرة. و لا تؤثر على المسجل F، و احتمالاتها كالتالي: LDA mmnn, STA mmnn, LDAX B, LDAX D, STAX B, STAX D • LDA تنقل بايت من العنوان mmnn إلى المركم، و STA تنقل محتوى المركم إلى العنوان mmnn ، (نقل مباشر Immediate). • LDAX تنقل بايت من الذاكرة إلى المركم، و STAX تحفظ محتوى المركم في الذاكرة، حسب العنوان في زوج المسجلات B أو D فقط، ( نقل غير مباشر InDirect)، و أما SP فستقومPOP بعملٍ قريبٍ من عملها، و أما H فنستخدم لها MOV A, M: MOV H, mm | MOV H, mm MOV L, nn = LDA mmnn | MOV L, nn = STA mmnn MOV A, M | MOV M, A
• تقوم LHLD بنقل بايتين من الذاكرة إلى زوج المسجلات HL، بينما تقوم SHLD بنقل محتوى زوج المسجلات HL إلى الذاكرة، حسب العنوان العطى معهما، و لا تؤثرا على المسجل F، و احتمالاتها كالتالي: LHLD mmnn, SHLD mmnn
• الإيعاز PCHL ينقل محتوى زوج المسجلات HL إلى PC، أما الإيعاز SPHL ينقل محتوى زوج المسجلات HL إلى SP. • لا تؤثر على المسجل F، و ليس لها معامل، و ليس لها إلا الاحتمالات PCHL, SPHL.
• XCHG ليس لها معامل، و هي تُبادل محتوى زوجي المسجلات DE و HL و لا تؤثر على المسجل F، وليس لها إلا الاحتمال XCHG. LXI D, 25f5 MVI H, 3b MVI L, 69 XCHG ? D = 3B, E = 69, H = 25, L = F5 • XTHL تُبادل محتوى قمة المكدس (بايتين من الذاكرة حيث يشير SP) مع زوج المسجلات HL. دون التأثير على المسجل SP أو F.
• تقوم PUSH بنقل محتوى زوج المسجل إلى الذاكرة، و تقوم POP بنقل بايتين من الذاكرة إلى زوج المسجل. • موقع الذاكرة يتم تحديده حسب العنوان الموجود في المسجل SP. و بعد تنفيذ PUSH يخفَّض SP تلقائياً بمقدار 2، حتى يشير إلى البايتين السابقين في الذاكرة (بايتين جديدين). و بعد تنفيذ POP يزداد SP تلقائياً بمقدار 2، حتى يشير إلى البايتين التاليين في الذاكرة. • لا تؤثر على F، و إحتمالاتها: PUSH B, PUSH D, PUSH H, PUSH PSW, POP B, POP D, POP H, POP PSW • يقصد بـ PSW زوج المسجلات AF، و يقصد بالمكدس المنطقة في الذاكرة التي تستخدمهما PUSH و POP. • نستفيد من المكدس في تخزين محتويات المسجلات مؤقتاً في الذاكرة، حتى يتسنَّى استخدام المسجلات في عمل آخر (لقلة المسجلات داخل المعالج). • و نستفيد منه لتخزين محتوى المسجل PC (موقع الإيعاز التالي تنفيذها) مؤقتاً في الذاكرة، حتى يتسنَّى الانتقال لتنفيذ برنامج فرعي ثم العودة. • عندما نبدأ البرنامج نعطي SP قيمة كبيرة، حتى تتوفر لدينا مساحة أكبر للعمل مع PUSH و POP.
• تقوم بتغيير محتوى المسجل PC (الذي يحدد الإيعاز التالية التنفيذ) و بالتالي تغيير مسار البرنامج، و هي كالتالي: - JMP mmnn, JZ mmnn,JNZ mmnn, JM mmnn,JP mmnn, JPE mmnn,JPO mmnn, JC mmnn,JNC mmnn • لا تؤثر على محتوى المسجل F، إلا أنها تتأثر به. • لها معامل وحيد مكون 16 bits، ويمكن الاستعاضة عنه بـ Label يشير إلى موقع الذاكرة الذي سيتم الانتقال إليه. • جميعها ماعدا JMP لا تعمل (لا تقوم بتحويل مسار التنفيذ) إلا إذا تحقق شرط خاص بها، و هي كالتالي:
JZ: Jump if ZF = 1 (Jump if on Zero)، JNZ:Jump if ZF = 0 (Jump if on no Zero) JM: Jump if SF = 1 (Jump if minus) ، JP: Jump if SF = 0 (Jump if Positive) JPE:Jump if PF = 1 (Jump if Parity Even), JPO:Jump if PF = 0 (Jump if Parity Odd) JC: Jump if CY = 1 (Jump if on Carry) ، JNC:Jump if CY = 0 (Jump if on no Carry)
• تقوم بتغيير محتوى المسجل PC كما في إيعازات القفز ، إلا أنها تقوم تلقائياً بتخزين موقع الإيعاز التالية مؤقتاً في المكدس و هي كالتالي: - CALL mmnn, CZ mmnn,CNZ mmnn, CM mmnn,CP mmnn, CPE mmnn,CPO mmnn, CC mmnn,CNC mmnn • تعمل CALL دون شروط كما هي JMP. و تعمل بقية الإيعازات بشروط كما هي نظيراتها من إيعازات القفز. و لا تؤثر على المسجل F. • تقوم بتنفيذ PUSH PC أولاً (و تخفيض محتوى المسجل SP بمقدار 2)، ثم تُغير محتوى PC (تغيير مسار التنفيذ) إلى القيمة mmnn.
• تقوم بتغيير محتوى المسجل PC كما في سابقاتها ، إلا أنها ليس لها مُعامل، بل تسحب موقع الإيعاز التالية من المكدس و هي كالتالي: - RET ، RZ ،RNZ ، RM ،RP ، RPE ،RPO ، RC ،RNC • تعمل RET دون شروط كما هي JMP. و تعمل بقية الإيعازات بشروط كما هي نظيراتها من إيعازات القفز. و لا تؤثر على المسجل F. • تقوم بتنفيذ POP PC فقط. و بالتالي فهي تعمل على زيادة محتوى المسجل SP بمقدار 2. و لا تؤثر على المسجل F.
• احتمالاتها كما يلي: RST 0, RST 1, RST 2, RST 3, RST 4, RST 5, RST 6, RST 7 • تعمل عمل CALL، إلا أنها بدون معامل و بالتالي فهي تتفرع إلى موقع ثابت (من مضاعفات العدد 8) كما يلي: RST 0 ? CALL 0000, RST 1 ? CALL 0008, RST 2 ? CALL 0010, RST 3 ? CALL 0018 RST 4 ? CALL 0020, RST 5 ? CALL 0028, RST 6 ? CALL 0030, RST 7 ? CALL 0038
• نستخدم IN لادخال بايت واحد من أحد منافذ الإدخال إلى المركم، و نستخدم OUT لإخراج محتوى المركم عبر أحد منافذ الإخراج. • لا تؤثر IN أو OUT على المسجل F. و معاملها عدد مكون من بايت واحد فقط، و ليس لها إلا الاحتمالات: IN nn, OUT nn • عندما نستخدم IN نتبعها (غالباً) بإيعاز MOV لإخراج العدد المدخل من المركم A (لأن المركم قد يستخدم في عمليات أخرى) فمثلاً: IN 87 MOV C, A
• إيعاز HLT تقوم بإنهاء تنفيذ البرنامج. و إيعاز NOP لا تعمل شيئاً لكنها تفيد في إشغال المعالج و تأخيره. • إيعاز EI تسمح بمقاطعة تنفيذ البرنامج عبر أجهزة الإدخال و الإخراج. و إيعاز DI تمنع مقاطعة تنفيذ البرنامج عبر أجهزة الإدخال و الإخراج. • إيعاز SIM تقوم بتفعيل أنواع الاعتراضات حسب بتَّات المركم. و كذلك تفعيل أو عدم تفعيل المنفذ التسلسلي. • إيعاز RIM تقوم بقراءة و تسجيل حالة الاعتراضات في المركم. RIM=Read Interrupt Masked SOD=Serial Output Data, ignored if bit6=0 SDE=Serial Data Enable, If 1, bit 7 is output to Data latch RESET RST7.5: If 1, RST7.5 flip-flop is reset OFF MSE=Masking Set Enable, If 0 bits 0-2 ignred, If 1 mask is set SIM=Set Interrupt Masked SID=Serial Input Data Bit, if any I=Pending Interrupts, 1 = Pending IE= Interrupt Enable Flag, 1 = Enabled M= Interrupt Masks, 0=available, 1=Masked
• المقاطعة: هي إيقاف تنفيذ البرنامج الذي يعمل عليه المعالج حالياً و تنفيذ برنامج فرعي ثم العودة لاتمام تنفيذ البرنامج الذي تمت مقاطعته. • في المعالج 8085 طلب المقاطعة: هو إشارة تأتي من أحد الأجهزة Hardware أي من خارج المعالج، من أجل القيام ببرنامج لخدمة لهذا الجهاز. • المعالج يمكنه أن لا يستجيب لهذه المقاطعة أو تلك، ما عدا أحد أنواع المقاطعات تسمى Trap فهي ذات الأولوية الأعلى في التنفيذ. • أما بقية أنواع المقاطعات فيتم الاستجابة فقط في حال السماح لها، و لذلك نستخدام الإيعاز EI للسماح بالمقاطعة، و الإيعاز DI لمنع المقاطعة. • أسماء أنواع المقاطعات الخمسة: هي (Trap – RST 7.5 – RST 6.5 – RST 5.5 – INT) • أما تنفيذ المقاطعة: فهو القيام بتنفيذ برنامج فرعي يسمى "برنامج خدمة المقاطعة Interrupt Service Subroutine (ISS)" • برامج خدمة المقاطعة تكتب في بداية الذاكرة ابتداءً من العنوان 0000H، و التي تسمى "الصفحة الأولى First Page or Zero Page". • يكتب البرنامج فرعي في 8 بايت، و تكون عناوين برامج خدمة المقاطعة هي (0000-0008-0010-0018-0020-0028-0030-0038). • المقاطعة INT: إذا قام أحد الأجهزة بإرسال طلب مقاطعة، و كان قد تم تفعيل الاستجابة للمقاطعات عبر الأمر EI: 1. يرسل المعالج إشارة "الموافقة على المقاطعة Interrupt Aknowlwdge". 2. عندما يستلم الجهاز هذه الموافقة يرسل للمعالج رقم المقاطعة المطلوب الاستجابة لها (من 0 إلى 7). 3. يقوم المعالج بتنفيذ برنامج خدمة المقاطعة الموجود في "الصفحة الأولى Zero Page" و الذي يكون عنوانه هو (رقم المقاطعة × 8). 4. يتم تنفيذ برنامج خدمة المقاطعة عبر استدعائه (كما يحدث في الأمر CALL) كما يلي: 1. يتم تسجيل عنوان الإيعاز الذي تم التوقف عنده في البرنامج الرئيسي في المكدسPUSH PC 2. يتم الانتقال للبرنامج الفرعي الذي عنوانه هو رقم المقاطعة × 8 PC = 8 * NNN • المقاطعات (RST 7.5 – RST 6.5 – RST 5.5):
RST 5.5 ? PC=5.5*8=002C, RST 6.5 ? PC=6.5*8=0034, RST 7.5 ? PC=7.5*8=003C
تستخدم هذه الإيعازات المركم A للقيام بأحد عملين:
1. إذا كان SDE=0 (البت رقم 6) فعندئذٍ: • يقوم الإيعاز SIM بقراءة محتوى المركم ثم يقوم بحجب أو عدم "حجب المقاطعات Masking" حسب قيمة بتات المركم. • يقوم الإيعاز RIM بقراءة حالة حجب المقاطعات إلى المركم. • و حجب مقاطعة يؤدي لعدم الاستجابة لتلك المقاطعة عند حدوثها، فلا يرسل المعالج "قبول المقاطعة Interrupt Acknowledge". • و لكي نسمح للمعالج باستقبال مقاطعة يجب جعل هذه المقاطعة غير محجوبة، و يجب تفعيل استقبال المقاطعات ياستخدام الأمر EI 2. أما إذا كان SDE=1 فعندئذٍ: • يقوم الإيعاز SIM بإرسال بيانات عبر المنفذ التسلسلي (بت واحد في كل مرة) هو البت السابع Serial Output Data (SOD). • يقوم الإيعاز RIM باستقبال بيانات عبر المنفذ التسلسلي.(إلى البت السابع في المركم Serial Input Data (SID))
• عند حدوث أكثر من مقاطعة في نفس الوقت يقوم المعالج بتنفيذ المقاطعة ذات الأولوية الأعلى منها. • المقاطعة Trap لا تحتاج لتنفيذ الإيعاز EI أو DI فهي لا تتأثر بهما. كما أن المقاطعة Trap لها الأولوية الأعلى في التنفيذ. على بقية المقاطعات تليها 7.5 ثم 6.5 ثم 5.5 ثم INT. أما عن طريقة تنفيذ المقاطعة فهي حسب الخطوات التالية:
1) يحدث طلب المقاطعة أولاً من قبل الجهاز. 2) يقوم المعالج بإرسال INT Acknowledge للجهاز، (و يستلم من الجهاز رقم المقاطعة في حالة المقاطعة INT). 3) يكمل المعالج تنفيذ الإيعاز الحالي، ثم يخزن قيمة PC في المكدس PUSH PC 4) يقوم بعد ذلك بتعديل قيمة PC بعنوان برنامج خدمة المقاطعة و الذي تتم معرفته من الصيغة: 8 × رقم المقاطعة. 5) يتم تنفيذ البرنامج الفرعي الخاص بالمقاطعة. 6) عند الانتهاء من برنامج خدمة المقاطعة أي عندما يصل التنفيذ إلى الأمر RET، تتم العودة لإكمال تنفيذ البرنامج الذي تمت مقاطعته.
الفهرس 1 تعريفات DEFINATION & TIPS 1 2 إيعازات اللغة ASSEMBLY 8085 INSTRUCTIONS 2 2 - 1 العمليات الحسابية و المنطقية 2 2 - 1 - 1 الحساب 2 2 - 1 - 2 الزيادة و التخفيض 3 2 - 1 - 3 المنطق 3 2 - 1 - 4 التدوير 3 2 - 1 - 5 إيعازات المقارنة CMP و CPI 4 2 - 2 إيعازات النقل 4 2 - 2 - 1 الإيعازان MOV, MVI 4 2 - 2 - 2 الإيعاز LXI 4 2 - 2 - 3 إيعازات نقل بايت بين الذاكرة و المركم 4 2 - 2 - 4 إيعازات نقل بايتين (16 bits) بين الذاكرة و المسجل HL 4 2 - 2 - 5 إيعازات النقل من مسجلات 16 bits إلى المسجل HL 4 2 - 2 - 6 إيعازات المكدس Stack 4 2 - 2 - 7 إيعازات المبادلة 4 2 - 3 تحويل مسار التنفيذ 5 2 - 3 - 1 إيعازات القفز 5 2 - 3 - 2 إيعازات استدعاء البرامج الفرعية 5 2 - 3 - 3 إيعازات العودة من البرامج الفرعية 5 2 - 3 - 4 إيعازات ReStart 5 2 - 4 الإدخال و الإخراج 5 2 - 5 إيعازات أخرى 5
تمارين برنامج يستقبل عددين من المنفذ 87، بتنفيذ إيعاز CALL مرتين، و كل عدد منهما مكون من 16 بت (بايتين)، ثم يجمعهما بإيعازDAD : تتبع تنفيذ البرنامج باستخدام المحاكي (KIT_8085 مثلاً)، و راقب تغيُّر SP و PC و مواقع ذاكرة المكدس (حيث يشير SP).
PCLabel Instruction
0000 LXI SP,4000 0003 JMP START 0006 I16B: IN 87 0008 MOV L,A 0009 IN 87 000B MOV H,A 000C RET 000D START: CALL I16B 0010 PUSH H 0011 CALL I16B 0014 POP D 0015 DAD D 0016 MOV A,L 0017 OUT 04 0019 MOV A,H 001A OUT 05 001C HLT تتبع البرنامج بالتفصيل (سنتتبع كلاً من PC و SP و ذاكرة المكدس Stack): 0000 LXI SP,4000 ? SP=4000 0003 JMP START ? PC=000D 0006 I16B: IN 87 ? I16B: SubRoutine to input 16 bits number to HL 0008 MOV L,A 0009 IN 87 000B MOV H,A 000C RET ? POP PC increment SP by 2, then Jump as PC 000D START: CALL I16B ? [3FFF] = 00 save High Byte of PC
? [3FFE] = 10 save Low Byte of PC ? SP = 3FFE decremant SP by 2 ? PC = 0006 Jump To I16B
0010 PUSH H ? [3FFF] = H save register H
? [3FFE] = L save register L ? SP = 3FFE decremant SP by 2 ? PC = 0011 No change
0011 CALL I16B ? [3FFD] = 00 save High Byte of PC
? [3FFC] = 14 save Low Byte of PC ? SP = 3FFC decremant SP by 2 ? PC = 0006 Jump To I16B
0014 POP D ? H=[3FFF] load register H
? L=[3FFE] load register L ? SP = 4000 increment SP by 2 ? PC = 0015 No change
0015 DAD D ? HL = HL + DE 0016 MOV A,L 0017 OUT 04 ? Output L 0019 MOV A,H 001A OUT 05 ? Output H 001C HLT
برنامج يقوم بنفس عمل البرنامج السابق: PC Label Instruction 0000 LXI SP,8000 0003 JMP START 0006 I16B: IN 87 0008 MOV L,A 0009 IN 87 000B MOV H,A 000C RET 000D ADD16: CALL I16B 0010 PUSH H 0011 CALL I16B 0014 POP D 0015 DAD D 0016 RET 0017 START: CALL ADD16 001A CALL OUT16 001D HLT 001E OUT16: MOV A,L 001F OUT 04 0021 MOV A,H 0022 OUT 05 0024 RET