لغة التجميع ووضعيات العنونة
| English | العربية |
|---|---|
| assembler/əˈsemblə/ | مبرمج |
| mnemonic/nɪˈmɒnɪk/ | اختصار |
| instruction set/ɪnˈstrʌkʃn set/ | مجموعة التعليمات |
| machine code/məˈʃiːn kəʊd/ | كود الآلة |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | لغة التجميع |
| operand/ˈɒpərænd/ | عامل |
| opcode/ˈɒpkəʊd/ | رمز العملية |
| symbol table/ˈsɪmbl ˈteɪbl/ | جدول الرموز |
| label/ˈleɪbl/ | التسمية |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | المرجعات الأمامية |
| addressing mode/əˈdresɪŋ məʊd/ | وضع العنونة |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | عنونة مباشرة |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | عنونة فورية |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | عنونة غير مباشرة |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | عنونة مؤشَّرة |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | عنونة نسبية |
ثلاثة وعشرون تعليمة في صف واحد من المفاتيح
- في عام 1949، انطلق جهاز EDSAC الحاسوبي في كامبريدج من خلال 31 تعليمة مُعدة على مفاتيح، كتبها ديفيد ويذرلي وأُطلق عليها "الأوامر الأولية".
- كان عملهم بأكمله هو قراءة أحرف مثل A و S من الشريط الورقي وتحويلها إلى الأرقام التي تفهمها الآلة فعليًا: أول مترجم أوامر assembly.
- منذ ذلك الحين، كتب المبرمجون رموزًا اختصارية بدلاً من أنماط البتات، ومجموعة التعليمات الخاصة بالامتحان هي نسل مباشر لذلك.
- تدور هذه الدرس حول عملية الترجمة هذه، وتتبع برنامج يدويًا، والطرق الخمس التي يمكن أن تقول بها التعليمة أين توجد بياناتها.
كود الآلة ولغة assembly
- المعالج يعمل بـ كود الآلة: أنماط بتات، خاصة بمعمارية واحدة، وكل نمط هو رمز عملية (opcode) ومعامل (operand).
- لغة assembly هي الشكل المقروء. تُكتب كل تعليمة باستخدام رمز اختصاري مثل
LDD،ADDأوJMP، وتتحول كل تعليمة assembly إلى تعليمة واحدة بالضبط من كود الآلة. - يقوم الـ assembler بترجمتها. العلاقة هي واحد لواحد، وهو ما يميز assembly عن لغات المستوى العالي، حيث تتحول جملة واحدة إلى العديد من التعليمات.

كل رمز اختصاري يصبح رمز عملية واحد؛ كل عنوان رمزي يصبح رقمًا
لغة التجميع هي:
يستخدم التجميع رموز اختصارية ويرتبط ارتباطاً واحداً لواحد بالكود الآلي؛ يقوم مترجم التجميع بترجمته.
مترجم أوامر assembly ثنائي المرور
- المرحلة 1 تقرأ المصدر وتبني جدول الرموز: في كل مرة يظهر فيها تسمية مثل
LOOP:، يتم تسجيل عنوانها. لا يتم إنتاج أي كود. - المرحلة 2 تقرأ المصدر مرة أخرى وتولد الكود، مستبدلة كل اختصار برمز العملية opcode وكل عنوان رمزي بالرقم من جدول الرموز.
- هناك حاجة لمرورين بسبب الإشارات الأمامية: قد يظهر
JMP LOOPقبل رؤية السطرLOOP:، لذا يكون عنوانه غير معروف في المرور الأول.
ماذا يفعل المرور 1 في مترجم رمزي ثنائي المرور؟
يسجل المرور 1 موقع كل علامة مرجعية (جدول الرموز)؛ ثم يقوم المرور 2 بتوليد الكود باستخدام الجدول لحل إشارات العلامات المرجعية.
ضع عمل مترجم التجميع ثنائي المرور في الترتيب.
يبحث المرور 1 عن جميع العلامات المرجعية أولاً، ليتمكن المرور 2 من حل أي قفز إلى علامة مرجعية مُعرَّفة لاحقًا.
لماذا يحتاج مترجم التجميع إلى مرورين؟
قد يستهدف القفز علامة مرجعية تظهر لاحقاً في المصدر؛ لذلك يبحث المرور 1 عن جميع العلامات أولاً لكي يتمكن المرور 2 من حلها.
مثال محلول: تطبيق المرورين
- يبدأ البرنامج من العنوان 100.
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- المرحلة 1 تحسب عنوان كل سطر وتسجل التسميات:
LOOP= 101،COUNT= 105. لم يُكتب أي شيء آخر. - المرحلة 2 تقوم بالترجمة سطراً بسطر.
LDD COUNTيصبح رمز العملية لـLDDمع عامل 105؛JPN LOOPيصبح رمز العملية لـJPNمع العامل 101. بدون المرحلة 1، لم يكن يمكن ترجمة السطر الأول.
كيف يعمل مترجم التجميع ثنائي المرور
مرر الكود خطوة بخطوة. يقرأ المترجم الرمزي كودك مرتين: المرور 1 يبحث فقط عن مواقع كل العلامات المرجعية، لذا فإن المرور 2 يمكنه ملء العناوين — وهكذا يعمل القفز إلى علامة مرجعية مُعرَّفة لاحقًا.
في المثال المحلول، يسجل المرور 1 العلامة المرجعية LOOP بالعنوان ____ في جدول الرموز.
يبدأ البرنامج من 100، لذا السطر الثاني، LOOP: DEC ACC، يشغل 101. COUNT، في السطر السادس، هو 105.
مجموعة التعليمات
- مجموعة تعليمات كامبريدج تحتوي على مسجل واحد متعدد الأغراض، وهو المجمع ACC، ومسجل فهرسة IX. المعامل
#nعشري،Bnثنائي،&nسداسي عشر، و<address>رقم موقع أو علامة مرجعية. - نقل البيانات:
LDM #n،LDD <address>،LDI <address>،LDX <address>،LDR #n،MOV IX،STO <address>. الإدخال والإخراج:IN،OUT. - العمليات الحسابية:
ADD،SUB،INC،DEC. المقارنة:CMP،CMI. القفزات:JMPغير مشروط،JPEوJPNمشروط. معالجة البتات:AND،OR،XOR،LSL،LSR. ثمEND. - "تم تجميع التعليمات": سمّ المجموعات وأعطِ تعليمة واحدة من كل مجموعة.
أي مما يلي المجموعات في مجموعة التعليمات؟ حدّد كل الخيارات الصحيحة.
نقل البيانات، الإدخال/الإخراج، العمليات الحسابية، المقارنة، القفزات الشرطية وغير الشرطية، ومعالجة البتات. جدول البيانات هو تطبيق برمجي، أعلى بكثير من هذا المستوى.
مثال محلول: تتبع برنامج
- ارسم جدولًا عمودًا للمجمع ACC وعمودًا لكل موقع ذاكرة يستخدمه البرنامج، ثم حدّثه سطرًا تلو الآخر حتى
END.
100 LDM #0
101 STO TOTAL
102 LDD TOTAL
103 ADD #5
104 STO TOTAL
105 LDD COUNT
106 DEC ACC
107 STO COUNT
108 CMP #0
109 JPN 102
110 END
111 TOTAL: 0
112 COUNT: 3
- المرور 1 من الحلقة: ACC 0 → 5 (TOTAL = 5)، COUNT 3 → 2، المقارنة غير متساوية، القفزة. المرور 2: TOTAL = 10، COUNT = 1، القفزة. المرور 3: TOTAL = 15، COUNT = 0، المقارنة متساوية، لا قفزة،
END. - القيم النهائية: TOTAL = 15، COUNT = 0، ACC = 0. اكتب صفاً جديداً فقط عندما يتغير قيمة، ولا تتجاوز المقارنة أبدًا.
في البرنامج المتتبع، ما هي قيمة TOTAL عندما يُصل إلى END؟
تضيف الحلقة 5 إلى TOTAL مرة واحدة لكل من الحلقات الثلاث: 5، 10، 15.
أوضاع العنونة
- وضع العنونة يقول كيف يجد المعالج المعامل.
| الوضع | مكان المعامل | مثال |
|---|---|---|
| العنونة الفورية | القيمة موجودة داخل التعليمة نفسها | LDM #10 تحمل 10 |
| العنونة المباشرة | تحمل التعليمة عنوانًا؛ استخدم القيمة المخزنة هناك | LDD 200 تحمل محتويات 200 |
| العنونة غير المباشرة | العنوان يحمل عنوانًا آخر، الذي يحمل البيانات | LDI 200 |
| العنونة الفهرسية | العنوان الفعال = العنوان المعطى + مسجل الفهرسة | LDX 200 مع IX |
| العنونة النسبية | العنوان هو إزاحة من التعليمة الحالية | القفزات |

نفس حقل المعامل، أربعة معاني مختلفة
في وضع العنونة الفورية (مثل LDM #10)، المعامل هو:
استخدام العنونة الفورية القيمة الحرفية في التعليمة (هنا، 10).
صنّف كل وضع عنونة مع معناه.
فوري = قيمة؛ مباشر = عنوان القيمة؛ غير مباشر = عنوان العنوان؛ فهرسي = أساس + فهرس.
مثال محلول: معامل واحد، أربعة إجابات
- الذاكرة: الموقع 200 يحتوي على 300، الموقع 300 يحتوي على 7، الموقع 202 يحتوي على 9. مسجل الفهرسة IX يحتوي على 2.
LDM #200تضع 200 في ACC: فوري، الرقم نفسه.LDD 200تضع 300 في ACC: مباشرة، محتويات 200.LDI 200تضع 7 في ACC: غير مباشرة، محتويات العنوان الموجود عند 200.LDX 200تضيف IX إلى 200 وتحمل محتويات 202: 9. نفس المعامل مكتوب بأربع طرق، أربع قيم مختلفة.
لماذا يوجد وضع العنونة الفهرسية
- المصفوفة هي سلسلة من المواقع المتجاورة.
LDX 200مع IX = 0، 1، 2، … تقرأ العنصر 0، 1، 2، … دون تغيير التعليمة. - نمط الحلقة:
LDR #0لتصفير الفهرس،LDX ARRAYلجلب عنصر، تنفيذ إجراء،INC IX، المقارنة مع الطول،JPNالعودة. - العنوان المباشر يتطلب تعليمة منفصلة لكل عنصر؛ بينما العنوان المؤشر يتطلب تعليمة واحدة فقط.
يكون العنونة الفهرسية مفيدة بشكل خاص لـ:
العنوان الفعال هو عنوان الأساس + مسجل الفهرس، لذا فإن زيادة الفهرس تمر عبر المصفوفة.
المقارنة والقفز
CMP #nأوCMP <address>يقارن المجمع (ACC) بقيمة ويضبط الرمز. لا يقوم بـ تغيير قيمة المجمع.JPE <address>يقفز إذا وجدت آخر عملية مقارنة أن القيم متساوية؛JPN <address>يقفز إذا كانت غير متساوية؛JMP <address>يقفز دائمًا.- في لغة عالية المستوى، يتحول
IFإلىCMPمتبوعًا بقفزة مشروطة؛ وتتحول الحلقة إلى عملية مقارنة وقفزة عائدة إلى تسمية.
CMP #0 يغير القيمة المحفوظة في المجمع.
عملية المقارنة تحدد فقط العلم الذي يقرأه القفز الشرطي التالي. لا يتغير المجمع، ولهذا السبب لا يظهر قيمة جديدة للمجمع في سطر CMP في التتبع.
علامات ضائعة
LDM #10يحميل الرقم 10؛LDD 10يحميل محتويات الموقع 10. الفرق الكلي هو#.#عشري،Bثنائي،&سداسي عشر.AND &0FوAND B00001111هما نفس القناع؛AND #15أيضًا.CMPيترك المجمع دون تغيير؛ بل يضبط الرمز فقط.JPNيقفز عندما تكون القيم غير متساوية.- مرحلة المرحلة 1 للمترجم البرمجي (assembler) لا تكتب أي كود. مخرجاتها هي جدول الرموز، والمراجع الأمامية هي السبب في وجودها.
لقد فهمت الأمر
- كود الآلة عبارة عن أنماط بتات؛ اللغة التجميعية تستخدم اختصارات، correspondence واحد لواحد، تُترجم بواسطة مترجم آلي
- مرحلتان: المرحلة 1 تبني جدول الرموز لعناوين التسميات، المرحلة 2 تولد الكود؛ مطلوبة من أجل المراجع الأمامية
- تتبع باستخدام جدول للمجمع ولكل موقع، صف واحد لكل تغيير؛ CMP يضبط الرمز، JPE/JPN تقرأه
- العنونة: مباشرة
#nالقيمة · عنوان مباشر محتويات العنوان · عنوان غير مباشر عنوان العنوان · عنوان مؤشر عنوان + IX (المصفوفات) · نسبي إزاحة