لغة التجميع

في مجال الحوسبة، تُعرف لغة التجميع (أو لغة المُجمِّع [ 1 ] أو رمز الآلة الرمزي[ 2 ] [ 3 ] [ 4 ] والتي يُشار إليها غالبًا ببساطة باسم التجميع ويُختصر عادةً إلى ASM أو asm ، بأنها أي لغة برمجة منخفضة المستوى تتميز بتطابق قوي جدًا بين التعليمات المكتوبة في اللغة وتعليمات رمز الآلة الخاصة بالمعمارية . [ 5 ] عادةً ما تحتوي لغة التجميع على عبارة واحدة لكل تعليمة من تعليمات رمز الآلة (1:1)، ولكنها تدعم أيضًا الثوابت والتعليقات وتوجيهات المُجمِّع ، [ 6 ] والتسميات الرمزية ، على سبيل المثال، لمواقع الذاكرة والسجلات والماكرو . [ 7 ] [ 1 ]

أول كود تجميعي يُستخدم فيه لغة لتمثيل تعليمات لغة الآلة وُجد في كتاب كاثلين وأندرو دونالد بوث الصادر عام 1947 بعنوان " البرمجة لـ ARC" . [ 8 ] يُحوّل كود التجميع إلى لغة آلة قابلة للتنفيذ بواسطة برنامج مساعد يُسمى المُجمِّع . يُنسب مصطلح "المُجمِّع" عمومًا إلى ويلكس وويلر وجيل في كتابهم الصادر عام 1951 بعنوان " إعداد البرامج للحاسوب الرقمي الإلكتروني" ، [ 9 ] الذين استخدموا المصطلح بمعنى "برنامج يُجمِّع برنامجًا آخر يتكون من عدة أقسام في برنامج واحد". [ 10 ] تُسمى عملية التحويل بالتجميع ، كما هو الحال في تجميع الكود المصدري . تُسمى الخطوة الحسابية التي يُعالج فيها المُجمِّع برنامجًا ما بوقت التجميع . [ 11 ]

لأن لغة التجميع تعتمد على تعليمات لغة الآلة، فإن كل لغة تجميع [ ملاحظة 1 ] خاصة ببنية حاسوب معينة مثل x86 أو ARM . [ 12 ] [ 13 ] [ 14 ]

أحيانًا يوجد أكثر من مُجمِّع لنفس البنية، وأحيانًا يكون المُجمِّع خاصًا بنظام تشغيل أو بأنظمة تشغيل مُحددة. لا تُوفر مُعظم لغات التجميع صيغةً مُحددة لاستدعاءات نظام التشغيل، ويمكن استخدامها بشكل عام مع أي نظام تشغيل، [ ملاحظة 2 ] لأن اللغة تُتيح الوصول إلى جميع الإمكانيات الحقيقية للمعالج ، والتي تعتمد عليها جميع آليات استدعاء النظام في نهاية المطاف. على عكس لغات التجميع، فإن مُعظم لغات البرمجة عالية المستوى قابلة للنقل عمومًا عبر بنى مُتعددة، ولكنها تتطلب تفسيرًا أو ترجمةً ، وهي مهام أكثر تعقيدًا من التجميع.

في العقود الأولى للحوسبة، كان من الشائع برمجة الأنظمة والتطبيقات بالكامل باستخدام لغة التجميع. ورغم أنها لا تزال ضرورية لبعض الأغراض، إلا أن غالبية البرمجة تُجرى الآن بلغات برمجة عالية المستوى، سواءً كانت مُفسَّرة أو مُجمَّعة. في كتابه " لا حل سحري "، لخّص فريد بروكس آثار التحوّل من برمجة لغة التجميع قائلاً: "لا شك أن أقوى خطوة لتحسين إنتاجية البرمجيات وموثوقيتها وبساطتها كانت الاستخدام التدريجي للغات البرمجة عالية المستوى. ويعزو معظم المراقبين الفضل لهذا التطور في زيادة الإنتاجية بمقدار خمسة أضعاف على الأقل، وما صاحب ذلك من تحسينات في الموثوقية والبساطة وسهولة الفهم." [ 15 ]

أصبح من الشائع اليوم استخدام كميات صغيرة من كود لغة التجميع ضمن أنظمة أكبر مُنفذة بلغة برمجة عالية المستوى، وذلك لأسباب تتعلق بالأداء أو للتفاعل المباشر مع المكونات المادية بطرق لا تدعمها لغة البرمجة عالية المستوى. على سبيل المثال، كُتب أقل من 2% من كود مصدر نواة لينكس الإصدار 4.9 بلغة التجميع، بينما كُتب أكثر من 97% بلغة سي . [ 16 ]

بناء جملة لغة التجميع

تستخدم لغة التجميع رموزًا مختصرة لتمثيل تعليمات الآلة منخفضة المستوى ( رموز العملياتوالتوجيهات ، وعادةً سجلات وعلامات معمارية . [ 17 ] قد تكون بعض هذه الرموز مدمجة، بينما يُعرّف بعضها الآخر من قِبل المستخدم. تتطلب العديد من العمليات مُعاملًا واحدًا أو أكثر لتكوين تعليمة كاملة. تسمح معظم مُجمّعات التجميع باستخدام ثوابت مُسمّاة، وسجلات، وعلامات لمواقع البرنامج والذاكرة، كما يمكنها حساب تعابير للمعاملات. وبالتالي، يتحرر المبرمجون من العمليات الحسابية المتكررة والمملة، وتكون برامج التجميع أكثر قابلية للقراءة من شفرة الآلة. اعتمادًا على بنية النظام، يمكن أيضًا دمج هذه العناصر لتعليمات أو أنماط عنونة مُحددة باستخدام الإزاحات أو بيانات أخرى، بالإضافة إلى العناوين الثابتة. توفر العديد من مُجمّعات التجميع آليات إضافية لتسهيل تطوير البرامج، والتحكم في عملية التجميع، والمساعدة في تصحيح الأخطاء .

بعضها مُصمم بنظام الأعمدة، حيث تُخصص أعمدة مُحددة لحقول مُعينة؛ وكان هذا شائعًا جدًا في الآلات التي تستخدم البطاقات المثقبة في خمسينيات وستينيات القرن العشرين. بعض المُجمّعات ذات بنية حرة، حيث تُفصل الحقول بعلامات، مثل علامات الترقيم والمسافات . بعض المُجمّعات هجينة، حيث تُخصص أعمدة مُعينة للتسميات، بينما تُفصل الحقول الأخرى بعلامات؛ وقد أصبح هذا النوع أكثر شيوعًا من نظام الأعمدة في ستينيات القرن العشرين.

مصطلحات

  • المجمع الكلي هو مجمع يتضمن مرفق تعليمات كلية بحيث يمكن تمثيل نص لغة التجميع (المعلم) باسم، ويمكن استخدام هذا الاسم لإدراج النص الموسع في التعليمات البرمجية الأخرى.
    • يشير مصطلح "الرمز المفتوح" إلى أي مدخلات للمجمع خارج تعريف الماكرو.
  • المُجمِّع المتقاطع (انظر أيضًا المُترجم المتقاطع ) هو مُجمِّع يُشغَّل على حاسوب أو نظام تشغيل ( النظام المُضيف ) من نوع مختلف عن النظام الذي سيُشغَّل عليه الكود الناتج ( النظام الهدف ). يُسهِّل التجميع المتقاطع تطوير البرامج للأنظمة التي لا تملك الموارد اللازمة لدعم تطوير البرمجيات، مثل الأنظمة المُدمجة أو وحدات التحكم الدقيقة . في هذه الحالة، يجب نقل الكود الناتج إلى النظام الهدف، عبر ذاكرة القراءة فقط (ROM، EPROM ، إلخ)، أو مُبرمج (عندما تكون ذاكرة القراءة فقط مُدمجة في الجهاز، كما هو الحال في وحدات التحكم الدقيقة)، أو وصلة بيانات باستخدام نسخة طبق الأصل من الكود أو تمثيل نصي لهذا الكود (مثل Intel hex أو Motorola S-record ).
  • برنامج التجميع عالي المستوى هو برنامج يوفر تجريدات لغوية ترتبط في كثير من الأحيان باللغات عالية المستوى، مثل هياكل التحكم المتقدمة ( IF/THEN/ELSE ، DO CASE، إلخ) وأنواع البيانات المجردة عالية المستوى، بما في ذلك الهياكل/السجلات والاتحادات والفئات والمجموعات.
  • المُجمِّع الدقيق هو برنامج يساعد في إعداد برنامج دقيق للتحكم في العمليات منخفضة المستوى للحاسوب.
  • المُجمِّع الفائق هو "برنامج يستقبل الوصف النحوي والدلالي للغة التجميع، ويُنشئ مُجمِّعًا لتلك اللغة"، [ 18 ] أو يستقبل ملف مصدر المُجمِّع مع هذا الوصف، ويُجمِّع ملف المصدر وفقًا لذلك الوصف. مُجمِّعات "الرموز الفائقة" لسلسلة حواسيب SDS 9 وسلسلة SDS Sigma هي مُجمِّعات فائقة. [ 19 ] كما وفّرت شركة Sperry Univac مُجمِّعًا فائقًا لسلسلة UNIVAC 1100/2200 . [ 20 ]
  • المُجمِّع المُضمَّن (أو المُجمِّع المُدمج ) هو كود مُجمِّع مُضمَّن داخل برنامج مكتوب بلغة برمجة عالية المستوى. [ 21 ] ويُستخدم هذا النوع غالبًا في برامج الأنظمة التي تحتاج إلى وصول مباشر إلى المكونات المادية.

المفاهيم الأساسية

مُجمِّع

يقوم برنامج التجميع بإنشاء رمز الكائن عن طريق ترجمة مجموعات من الرموز المختصرة وبنية العمليات وأنماط العنونة إلى مكافئاتها العددية. يتضمن هذا التمثيل عادةً رمز العملية (" opcode ") بالإضافة إلى بتات التحكم والبيانات الأخرى. كما يحسب المُجمِّع التعبيرات الثابتة ويحل الأسماء الرمزية لمواقع الذاكرة والكيانات الأخرى. [ 22 ] يُعد استخدام المراجع الرمزية ميزة أساسية في المُجمِّعات، إذ يوفر العمليات الحسابية الشاقة وتحديثات العناوين اليدوية بعد تعديلات البرنامج. تتضمن معظم المُجمِّعات أيضًا إمكانيات الماكرو لإجراء استبدال نصي - على سبيل المثال، لإنشاء تسلسلات قصيرة شائعة من التعليمات كتعليمات مضمنة ، بدلاً من استدعاء إجراءات فرعية .

قد تتمكن بعض المجمعات أيضًا من إجراء بعض التحسينات البسيطة الخاصة بمجموعة التعليمات . ومن الأمثلة الملموسة على ذلك مجمعات x86 واسعة الانتشار من مختلف الموردين. تُعرف هذه العملية باسم " تحديد حجم القفزة " [ 22 ] ، حيث تستطيع معظمها استبدال تعليمات القفز (استبدال القفزات الطويلة بقفزات قصيرة أو نسبية) في أي عدد من الدورات، عند الطلب. بل قد تقوم مجمعات أخرى بإعادة ترتيب أو إدراج تعليمات بسيطة، مثل بعض مجمعات معمارية RISC التي تساعد في تحسين جدولة التعليمات بشكل مناسب لاستغلال خط أنابيب وحدة المعالجة المركزية بأقصى كفاءة ممكنة. [ 23 ]

كانت لغات التجميع متاحة منذ خمسينيات القرن الماضي، كخطوة أولى فوق لغة الآلة وقبل لغات البرمجة عالية المستوى مثل فورتران ، وألغول ، وكوبول، وليسب . كما ظهرت عدة فئات من المترجمات ومولدات الأكواد شبه الآلية ذات خصائص مشابهة لكل من لغة التجميع واللغات عالية المستوى، ولعل سبيد كود أحد أشهر الأمثلة على ذلك.

قد توجد عدة مُجمِّعات ذات صيغ مختلفة لوحدة معالجة مركزية أو بنية مجموعة تعليمات معينة. على سبيل المثال، قد تكون تعليمة إضافة بيانات ذاكرة إلى مُسجِّل في معالج من عائلة x86 مكتوبة بصيغة Inteladd eax,[ebx] الأصلية ، بينما تُكتب بصيغة AT&T التي يستخدمها مُجمِّع GNU . على الرغم من اختلاف الصيغ، فإن الأشكال النحوية المختلفة تُنتج عمومًا نفس رمز الآلة الرقمي . قد يحتوي المُجمِّع الواحد أيضًا على أوضاع مختلفة لدعم الاختلافات في الأشكال النحوية وتفسيراتها الدلالية الدقيقة (مثل صيغة FASM ، وصيغة TASM ، والوضع المثالي، وما إلى ذلك، في حالة برمجة التجميع x86 ).addl (%ebx),%eax

عدد مرات المرور

يوجد نوعان من المجمعات بناءً على عدد مرات المرور عبر المصدر المطلوبة (عدد المرات التي يقرأ فيها المجمع المصدر) لإنتاج ملف الكائن.

  • تقوم مُجمِّعات المرور الواحد بمعالجة الكود المصدري مرة واحدة. بالنسبة للرموز المستخدمة قبل تعريفها، يُصدر المُجمِّع "تصحيحات" بعد التعريف النهائي، مُخبراً الرابط أو المُحمِّل بتصحيح المواقع التي استُخدمت فيها الرموز غير المُعرَّفة بعد.
  • تقوم المجمعات متعددة المراحل بإنشاء جدول يحتوي على جميع الرموز وقيمها في المراحل الأولى، ثم تستخدم الجدول في المراحل اللاحقة لإنشاء التعليمات البرمجية.

في كلتا الحالتين، يجب أن يكون المُجمِّع قادرًا على تحديد حجم كل تعليمة في المراحل الأولى لحساب عناوين الرموز اللاحقة. هذا يعني أنه إذا كان حجم عملية ما تشير إلى مُعامل مُحدد لاحقًا يعتمد على نوع المُعامل أو بُعده، فسيُجري المُجمِّع تقديرًا مُتحفظًا عند مُصادفة العملية لأول مرة، وإذا لزم الأمر، سيضيف إليها تعليمة أو أكثر من تعليمات " عدم التنفيذ " في مرحلة لاحقة أو في قائمة التصحيحات. في مُجمِّع مُزوَّد بتحسين "الرؤية المُسبقة "، يُمكن إعادة حساب العناوين بين المراحل للسماح باستبدال التعليمات المُتحفظة بتعليمات مُخصصة للمسافة الدقيقة من الهدف.

كان السبب الأصلي لاستخدام مُجمِّعات أحادية المرور هو حجم الذاكرة وسرعة التجميع، إذ غالبًا ما كانت المرورة الثانية تتطلب تخزين جدول الرموز في الذاكرة (للتعامل مع المراجع الأمامية )، وإعادة لف وقراءة مصدر البرنامج على الشريط ، أو إعادة قراءة مجموعة من البطاقات أو شريط ورقي مثقوب . أما الحواسيب اللاحقة ذات الذاكرة الأكبر بكثير (وخاصةً التخزين على الأقراص)، فقد امتلكت المساحة الكافية لإجراء جميع عمليات المعالجة اللازمة دون الحاجة إلى إعادة القراءة. وتكمن ميزة المُجمِّع متعدد المرور في أن غياب الأخطاء يجعل عملية الربط (أو تحميل البرنامج إذا كان المُجمِّع يُنتج رمزًا تنفيذيًا مباشرةً) أسرع. [ 24 ]

مثال: في مقتطف الشفرة التالي، يستطيع مُجمِّع ذو تمريرة واحدة تحديد عنوان المرجع العكسي BKWD عند تجميع العبارة S2 ، ولكنه لا يستطيع تحديد عنوان المرجع الأمامي FWD عند تجميع عبارة التفرع S1 ؛ بل قد يكون FWD غير مُعرَّف. أما المُجمِّع ذو تمريرتين، فيُحدِّد كلا العنوانين في التمريرة الأولى، وبالتالي يكونان معروفين عند توليد الشفرة في التمريرة الثانية.

S1 B FWD ... FWD EQU * ... BKWD EQU * ... S2 B BKWD

مُجمّعون ذوو مستوى عالٍ

توفر المجمعات عالية المستوى الأكثر تطوراً تجريدات لغوية مثل:

انظر تصميم اللغة أدناه لمزيد من التفاصيل.

لغة التجميع

يتألف البرنامج المكتوب بلغة التجميع من سلسلة من تعليمات المعالج المختصرة والعبارات الوصفية (المعروفة بأسماء مختلفة مثل العمليات التصريحية، والتوجيهات، والتعليمات الزائفة، والعمليات الزائفة، والعمليات الزائفة)، والتعليقات، والبيانات. تتكون تعليمات لغة التجميع عادةً من رمز العملية المختصر متبوعًا بمعامل ، والذي قد يكون قائمة بيانات أو وسائط أو معلمات. [ 26 ] قد تكون بعض التعليمات "ضمنية"، مما يعني أن البيانات التي تعمل عليها التعليمات مُحددة ضمنيًا من خلال التعليمات نفسها - لا تتطلب هذه التعليمات معاملًا. يقوم المُجمِّع بترجمة العبارة الناتجة إلى تعليمات لغة الآلة التي يمكن تحميلها في الذاكرة وتنفيذها.

على سبيل المثال، تُخبر التعليمات التالية معالج x86 / IA-32 بنقل قيمة فورية مكونة من 8 بتات إلى مسجل . الشفرة الثنائية لهذه التعليمات هي 10110 متبوعة بمعرف مكون من 3 بتات لتحديد المسجل المراد استخدامه. معرف المسجل AL هو 000، لذا فإن شفرة الآلة التالية تُحمّل المسجل AL بالبيانات 01100001. [ 26 ]

10110000 01100001

يمكن جعل هذا الكود الحاسوبي الثنائي أكثر قابلية للقراءة البشرية عن طريق التعبير عنه بالنظام الست عشري كما يلي.

ب0 61

هنا، B0تعني "نقل نسخة من القيمة التالية إلى AL61وهي تمثيل سداسي عشري للقيمة 01100001، والتي تساوي 97 بالنظام العشري . توفر لغة التجميع لعائلة 8086 الاختصار MOV (اختصار لكلمة move ) لتعليمات كهذه، لذا يمكن كتابة كود الآلة أعلاه بلغة التجميع كما يلي، مع إضافة تعليق توضيحي إذا لزم الأمر، بعد الفاصلة المنقوطة. هذا أسهل بكثير في القراءة والتذكر.

MOV AL , 61h ; تحميل AL برقم عشري 97 (61 سداسي عشري)

في بعض لغات التجميع (بما فيها هذه اللغة)، قد يُستخدم نفس الرمز، مثل MOV، لمجموعة من التعليمات المترابطة لتحميل البيانات ونسخها ونقلها، سواءً كانت هذه البيانات قيمًا فورية، أو قيمًا في المسجلات، أو مواقع ذاكرة يُشار إليها بواسطة قيم في المسجلات أو بواسطة عناوين مباشرة مضمنة في التعليمات. وقد تستخدم مُجمِّعات أخرى رموزًا مختلفة لرموز العمليات، مثل L لنقل البيانات من الذاكرة إلى المسجل، وST لنقل البيانات من المسجل إلى الذاكرة، وLR لنقل البيانات من المسجل إلى المسجل، وMVI لنقل المعامل الفوري إلى الذاكرة، وما إلى ذلك.

إذا استُخدم نفس الرمز التذكيري لتعليمات مختلفة، فهذا يعني أن هذا الرمز يُقابل عدة رموز تعليمات ثنائية مختلفة، باستثناء البيانات (مثل البيانات 61hفي هذا المثال)، وذلك بحسب المعاملات التي تلي الرمز. على سبيل المثال، بالنسبة لوحدات المعالجة المركزية x86/IA-32، MOV AL, AHيُمثل بناء جملة لغة التجميع من إنتل تعليمة تنقل محتويات المسجل AH إلى المسجل AL . الصيغة السداسية العشرية لهذه التعليمة هي:

88 E0

يحدد البايت الأول، 88h، عملية نقل بين سجل بحجم بايت وسجل آخر أو ذاكرة، ويتم ترميز البايت الثاني، E0h، (بثلاثة حقول بت) لتحديد أن كلا المعاملين عبارة عن سجلات، وأن المصدر هو AH ، والوجهة هي AL .

في حالة كهذه، حيث يمكن أن يُمثّل الرمز نفسه أكثر من تعليمة ثنائية، يُحدّد المُجمّع التعليمة التي سيُولدها بفحص المُعاملات. في المثال الأول، المُعامل 61hهو ثابت عددي سداسي عشري صالح وليس اسم سجل صالح، لذا فإن B0التعليمة الوحيدة المُطبّقة هي التعليمة المذكورة. في المثال الثاني، المُعامل AHهو اسم سجل صالح وليس ثابتًا عدديًا صالحًا (سداسي عشري، أو عشري، أو ثماني، أو ثنائي)، لذا فإن 88التعليمة الوحيدة المُطبّقة هي التعليمة المذكورة.

تُصمَّم لغات التجميع دائمًا بحيث يُفرض هذا النوع من عدم الغموض عالميًا من خلال تركيبها النحوي. على سبيل المثال، في لغة التجميع Intel x86، يجب أن يبدأ الثابت الست عشري برقم، لذا يُكتب العدد الست عشري 'A' (المساوي لعشرة عشرية) على النحو التالي: 0Ahأو 0AH، وليس AH، تحديدًا حتى لا يُظن أنه اسم المسجل AH . (تمنع القاعدة نفسها أيضًا الغموض في أسماء المسجلات BH و CH و DH ، وكذلك في أي رمز مُعرَّف من قِبل المستخدم ينتهي بالحرف H ويحتوي فقط على أحرف وأرقام ست عشرية، مثل كلمة "BEACH").

بالعودة إلى المثال الأصلي، بينما يقوم رمز العملية x86 10110000 B0بنسخ قيمة 8 بت إلى المسجل AL ، يقوم الرمز 10110001 B1بنقلها إلى المسجل CL ، ويقوم الرمز 10110010 B2بنقلها إلى المسجل DL . فيما يلي أمثلة بلغة التجميع لهذه الرموز. [ 26 ]

MOV AL , 1h ; تحميل AL بالقيمة الفورية 1 MOV CL , 2h ; تحميل CL بالقيمة الفورية 2 MOV DL , 3h ; تحميل DL بالقيمة الفورية 3

يمكن أن يكون بناء جملة MOV أكثر تعقيدًا كما توضح الأمثلة التالية. [ 27 ]

MOV EAX , [ EBX ] ; انقل البايتات الأربعة الموجودة في الذاكرة عند العنوان الموجود في EBX إلى EAX. MOV [ ESI + EAX ], CL ; انقل محتويات CL إلى البايت الموجود عند العنوان ESI + EAX. MOV DS , DX ; انقل محتويات DX إلى سجل القطاع DS.

في كل حالة، يتم ترجمة رمز MOV مباشرةً إلى أحد رموز العمليات 88-8C، 8E، A0-A3، B0-BF، C6 أو C7 بواسطة مُجمِّع، وعادةً لا يحتاج المبرمج إلى معرفة أو تذكر أي منها. [ 26 ]

يقوم المُجمِّع بتحويل لغة التجميع إلى لغة الآلة، ويمكن للمُفكِّك تحقيق العكس جزئيًا على الأقل . على عكس لغات البرمجة عالية المستوى ، توجد علاقة تناظرية بين العديد من عبارات التجميع البسيطة وتعليمات لغة الآلة. مع ذلك، في بعض الحالات، قد يُوفِّر المُجمِّع تعليماتٍ زائفة (عبارة عن وحدات ماكرو) تتوسع إلى عدة تعليمات بلغة الآلة لتوفير الوظائف المطلوبة بشكل شائع. على سبيل المثال، بالنسبة لجهاز يفتقر إلى تعليمة "التفرع إذا كان أكبر من أو يساوي"، قد يُوفِّر المُجمِّع تعليمة زائفة تتوسع إلى تعليمة "التعيين إذا كان أصغر من" و"التفرع إذا كان صفرًا (على نتيجة تعليمة التعيين)". كما تُوفِّر معظم المُجمِّعات كاملة الميزات لغة ماكرو غنية (سيتم شرحها لاحقًا) يستخدمها المُصنِّعون والمبرمجون لإنشاء تعليمات برمجية وتسلسلات بيانات أكثر تعقيدًا. بما أن المعلومات المتعلقة بالتعليمات الزائفة والماكرو المُعرّفة في بيئة المُجمِّع غير موجودة في البرنامج الهدف، فإن برنامج التفكيك لا يستطيع إعادة بناء استدعاءات الماكرو والتعليمات الزائفة، بل يقتصر دوره على تفكيك تعليمات الآلة الفعلية التي أنشأها المُجمِّع من كيانات لغة التجميع المجردة تلك. وبالمثل، بما أن المُجمِّع يتجاهل التعليقات في ملف مصدر لغة التجميع، ولا تؤثر على كود البرنامج الهدف الذي يُنشئه، فإن برنامج التفكيك يعجز تمامًا عن استعادة تعليقات المصدر.

لكل بنية حاسوبية لغة آلة خاصة بها. وتختلف الحواسيب في عدد ونوع العمليات التي تدعمها، وفي أحجام وعدد المسجلات، وفي تمثيلات البيانات المخزنة. ورغم أن معظم الحواسيب العامة قادرة على أداء الوظائف نفسها أساسًا، إلا أن طرق أدائها تختلف؛ وتعكس لغات التجميع المقابلة هذه الاختلافات.

قد توجد عدة مجموعات من الرموز المختصرة أو صيغ لغة التجميع لمجموعة تعليمات واحدة، وعادةً ما تُستخدم في برامج تجميع مختلفة. في هذه الحالات، تكون الصيغة الأكثر شيوعًا هي تلك التي يوفرها مُصنِّع وحدة المعالجة المركزية وتُستخدم في وثائقه.

من الأمثلة على وحدات المعالجة المركزية التي تستخدم مجموعتين مختلفتين من الرموز المختصرة، عائلة Intel 8080 و Intel 8086/8088. ولأن شركة Intel ادّعت حقوق الملكية الفكرية لرموز لغة التجميع الخاصة بها (في كل صفحة من وثائقها المنشورة في سبعينيات وأوائل ثمانينيات القرن الماضي على الأقل)، فقد ابتكرت بعض الشركات التي أنتجت وحدات معالجة مركزية متوافقة مع مجموعات تعليمات Intel رموزًا مختصرة خاصة بها. يدعم معالج Zilog Z80 ، وهو نسخة محسّنة من Intel 8080A ، جميع تعليمات 8080A بالإضافة إلى العديد من التعليمات الأخرى؛ وقد ابتكرت Zilog لغة تجميع جديدة كليًا، ليس فقط للتعليمات الجديدة ، بل أيضًا لجميع تعليمات 8080A. على سبيل المثال، بينما تستخدم Intel الرموز المختصرة MOV و MVI و LDA و STA و LXI و LDAX و STAX و LHLD و SHLD لتعليمات نقل البيانات المختلفة، تستخدم لغة تجميع Z80 الرمز المختصر LD لجميعها. يُعدّ معالجا NEC V20 و V30 مثالًا مشابهًا ، فهما نسختان مُحسّنتان من معالجي Intel 8086 و8088 على التوالي. وكما فعلت شركة Zilog مع معالج Z80، ابتكرت NEC رموزًا مختصرة جديدة لجميع تعليمات 8086 و8088، لتجنب اتهامات انتهاك حقوق الملكية الفكرية لشركة Intel. (يبقى مدى صحة هذه الحقوق محل شك، وقد أعادت شركات تصنيع المعالجات اللاحقة، مثل AMD [ ملاحظة 4 ] و Cyrix ، نشر رموز تعليمات x86/IA-32 الخاصة بشركة Intel بدقة تامة دون إذن أو عقوبة قانونية). ومن المشكوك فيه عمليًا أن يكون العديد ممن برمجوا V20 وV30 قد استخدموا لغة التجميع الخاصة بشركة NEC بدلًا من لغة Intel؛ فبما أن أي لغتي تجميع لنفس بنية مجموعة التعليمات متماثلتان (كما هو الحال بين الإنجليزية ولغة Pig Latin )، فلا يوجد شرط لاستخدام لغة التجميع المنشورة من قِبل الشركة المصنعة مع منتجاتها.

أمثلة

"مرحباً بالعالم!" على أجهزة x86 ذات 32 بت فقط

يمكن طباعة عبارة "Hello, world!" باستخدام لغة التجميع 32 بت لمعالج x86 مع مساعدة بسيطة من نظام التشغيل. يستدعي الأمر "call outchr" آليةً ما لطباعة حرف بلغة التجميع على وحدة التحكم. يجب إنهاء أي سلسلة نصية غير صفرية ببايت قيمته صفر.

hello: mov esi , msg ; عنوان السلسلة في ESI cld ; اضبط الاتجاه لزيادة ESI lodsb ; حمّل الحرف الأول في AL، وزد ESI chrlp: call outchr ; اطبع الحرف في AL lodsb ; حمّل الحرف التالي في AL، وزد ESI or al , al ; هل هو حرف إنهاء السلسلة؟ bne chrlp ; إذا لم يكن كذلك، فتابع ret ; ارجع إلى المُستدعيmsg: db 'Hello, world!' , 0xa , 0x0 ; سلسلة نصية للطباعة

"مرحباً بالعالم!" على نظام لينكس x86 ذي 32 بت

في لغة التجميع 32 بت لنظام لينكس على معالج x86 ، ستتم طباعة عبارة "Hello, world!" بواسطة استدعاء واحد لنظام التشغيل:

section .text ; بداية مقطع الكود global _start ; تعريف _start ليكون مرئيًا في ملف الكائن المُنشأ _start: mov edx , len ; طول السلسلة، الوسيط الثالث للدالة write() mov ecx , msg ; عنوان السلسلة، الوسيط الثاني للدالة write() mov ebx , 1 ; مُعرّف الملف (الإخراج القياسي)، الوسيط الأول للدالة write() mov eax , 4 ; رقم استدعاء النظام للدالة write() int 0x80 ; مُقاطعة استدعاء النظام mov ebx , 0 ; رمز الخروج، الوسيط الأول للدالة exit() mov eax , 1 ; رقم استدعاء النظام للدالة exit() int 0x80 ; مُقاطعة استدعاء النظامsection .data ; بداية مقطع البيانات msg db 'Hello, world!' , 0xa ; السلسلة المراد طباعتها len equ $ - msg ; طول تلك السلسلة كثابت يتم حسابه في وقت التجميع

تصميم اللغة

العناصر الأساسية

يوجد تنوع كبير في طريقة تصنيف مطوري لغات التجميع للتعليمات وفي المصطلحات التي يستخدمونها. على وجه الخصوص، يصف البعض أي شيء غير رمز الآلة أو الرمز الموسع بأنه عملية زائفة (pseudo-op). تتكون لغة التجميع النموذجية من ثلاثة أنواع من تعليمات البرمجة التي تُستخدم لتعريف عمليات البرنامج:

  • رموز العمليات
  • تعريفات البيانات
  • توجيهات الجمعية

رموز التذكير ورموز التذكير الموسعة

تتميز التعليمات (العبارات) في لغة التجميع ببساطتها، على عكس تلك الموجودة في لغات البرمجة عالية المستوى . عادةً، يُمثل الرمز المختصر اسمًا رمزيًا لتعليمة واحدة قابلة للتنفيذ في لغة الآلة ( رمز العملية )، ويوجد رمز مختصر واحد على الأقل لكل تعليمة. تتكون كل تعليمة عادةً من عملية أو رمز عملية بالإضافة إلى صفر أو أكثر من المعاملات . تشير معظم التعليمات إلى قيمة واحدة أو زوج من القيم. يمكن أن تكون المعاملات فورية (قيمة مُشفّرة في التعليمة نفسها)، أو سجلات مُحددة في التعليمة أو مُضمنة، أو عناوين بيانات موجودة في مكان آخر في الذاكرة. يُحدد ذلك بنية المعالج الأساسية: فالمُجمِّع يعكس فقط كيفية عمل هذه البنية. غالبًا ما تُستخدم الرموز المختصرة الموسعة لتحديد تركيبة من رمز العملية مع معامل مُحدد، على سبيل المثال، يستخدم مُجمِّع System/360 Bالرمز المختصر الموسع لـ BCمع قناع 15 و NOP("لا عملية" - لا تفعل شيئًا لخطوة واحدة) لـ BCمع قناع 0.

تُستخدم الرموز المختصرة الموسعة غالبًا لدعم استخدامات متخصصة للتعليمات، لأغراض غير واضحة من اسم التعليمة. على سبيل المثال، لا تحتوي العديد من وحدات المعالجة المركزية على تعليمة NOP صريحة، ولكنها تحتوي على تعليمات يمكن استخدامها لهذا الغرض. في وحدات المعالجة المركزية 8086، تُستخدم التعليمة لـ ، حيث يمثل رمزًا زائفًا لتشفير التعليمة . تتعرف بعض برامج تفكيك التعليمات على ذلك، وتقوم بفك تشفير التعليمة على أنها . وبالمثل، تستخدم مُجمِّعات IBM لأنظمة System/360 و System/370 الرموز المختصرة الموسعة و لـ و مع أقنعة صفرية. بالنسبة لبنية SPARC، تُعرف هذه بالتعليمات التركيبية . [ 28 ]xchgax,axnopnopxchgax,axxchgax,axnopNOPNOPRBCBCR

تدعم بعض المجمعات أيضًا تعليمات ماكرو مدمجة بسيطة تُولّد تعليمتين أو أكثر من تعليمات الآلة. على سبيل المثال، في بعض مجمعات Z80، ld hl,bcتُعرف التعليمة بأنها تُولّد تعليمة ld l,cمتبوعة بـ ld h,b. [ 29 ] تُعرف هذه أحيانًا باسم رموز العمليات الزائفة .

الرموز المختصرة هي رموز اعتباطية؛ في عام 1985، نشر معهد مهندسي الكهرباء والإلكترونيات (IEEE) المعيار 694 لمجموعة موحدة من الرموز المختصرة لاستخدامها من قبل جميع المجمعات. [ 30 ] وقد تم سحب المعيار منذ ذلك الحين.

توجيهات البيانات

توجد تعليمات تُستخدم لتعريف عناصر البيانات التي تحتوي على البيانات والمتغيرات. تُحدد هذه التعليمات نوع البيانات وطولها ومحاذاتها . كما تُحدد ما إذا كانت البيانات متاحة للبرامج الخارجية (البرامج المُجمّعة بشكل منفصل) أو فقط للبرنامج الذي تم فيه تعريف قسم البيانات. تُصنف بعض المُجمّعات هذه التعليمات على أنها عمليات زائفة.

توجيهات الجمعية

تُعرف توجيهات التجميع، والتي تُسمى أيضًا رموز العمليات الزائفة أو العمليات الزائفة، بأنها أوامر تُعطى للمُجمِّع "لتوجيهه إلى تنفيذ عمليات أخرى غير تجميع التعليمات". [ 22 ] تؤثر هذه التوجيهات على طريقة عمل المُجمِّع، و"قد تؤثر على رمز الكائن، وجدول الرموز، وملف القائمة، وقيم معلمات المُجمِّع الداخلية". يُستخدم مصطلح " رمز العملية الزائف " أحيانًا حصريًا للإشارة إلى التوجيهات التي تُولِّد رمز الكائن، مثل تلك التي تُولِّد البيانات. [ 31 ]

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

تتيح المجمعات الرمزية للمبرمجين ربط أسماء عشوائية ( علامات أو رموز ) بمواقع الذاكرة والثوابت المختلفة. عادةً، يُعطى كل ثابت ومتغير اسمًا حتى تتمكن التعليمات من الإشارة إلى تلك المواقع بالاسم، مما يعزز توثيق التعليمات البرمجية ذاتيًا . في التعليمات البرمجية القابلة للتنفيذ، يرتبط اسم كل روتين فرعي بنقطة دخوله، بحيث يمكن لأي استدعاء لروتين فرعي استخدام اسمه. داخل الروتينات الفرعية، تُعطى وجهات GOTO علامات. تدعم بعض المجمعات الرموز المحلية التي غالبًا ما تكون مختلفة معجميًا عن الرموز العادية (مثل استخدام "10$" كوجهة GOTO).

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

تسمح لغات التجميع، كمعظم لغات البرمجة الأخرى، بإضافة تعليقات إلى شفرة المصدر البرمجية ، والتي تُتجاهل أثناء عملية التجميع. يُعدّ استخدام التعليقات المناسبة أمرًا بالغ الأهمية في برامج لغة التجميع، إذ قد يصعب تحديد معنى وهدف سلسلة من تعليمات الآلة الثنائية. يصعب قراءة شفرة لغة التجميع "الخام" (غير المُعلّقة) التي تُنتجها المترجمات أو برامج التفكيك عند الحاجة إلى إجراء تغييرات عليها.

وحدات الماكرو

تدعم العديد من برامج التجميع وحدات الماكرو المُعرَّفة مسبقًا ، بينما تدعم برامج أخرى وحدات ماكرو يُعرّفها المبرمج (ويمكن إعادة تعريفها مرارًا وتكرارًا) تتضمن تسلسلات من أسطر نصية تحتوي على متغيرات وثوابت. غالبًا ما يكون تعريف الماكرو مزيجًا من عبارات التجميع، مثل التوجيهات وتعليمات الآلة الرمزية وقوالب عبارات التجميع. قد يتضمن هذا التسلسل من الأسطر النصية رموز العمليات أو التوجيهات. بمجرد تعريف الماكرو، يمكن استخدام اسمه بدلًا من اختصار. عندما يُعالج برنامج التجميع مثل هذه العبارة، فإنه يستبدلها بأسطر النص المرتبطة بذلك الماكرو، ثم يُعالجها كما لو كانت موجودة في ملف شفرة المصدر (بما في ذلك، في بعض برامج التجميع، توسيع أي وحدات ماكرو موجودة في النص البديل). يعود تاريخ وحدات الماكرو بهذا المعنى إلى برامج الترميز التلقائي من IBM في خمسينيات القرن العشرين. [ 32 ]

تحتوي مُجمِّعات الماكرو عادةً على توجيهات، على سبيل المثال، لتعريف وحدات الماكرو، وتعريف المتغيرات، وتعيين قيم المتغيرات لنتيجة تعبير حسابي أو منطقي أو نصي، والتكرار، وتوليد التعليمات البرمجية بشكل مشروط. قد يقتصر استخدام بعض هذه التوجيهات على تعريف الماكرو، مثل MEXIT في HLASM ، بينما يُسمح باستخدام توجيهات أخرى في التعليمات البرمجية المفتوحة (خارج تعريفات الماكرو)، مثل AIF و COPY في HLASM.

في لغة التجميع، يُمثل مصطلح "الماكرو" مفهومًا أشمل مما هو عليه في بعض السياقات الأخرى، مثل المعالج المسبق في لغة البرمجة C ، حيث يُستخدم توجيه #define عادةً لإنشاء ماكروات قصيرة من سطر واحد. ويمكن أن تكون تعليمات الماكرو في لغة التجميع، مثل الماكروات في PL/I وبعض اللغات الأخرى، "برامج" طويلة بحد ذاتها، يتم تنفيذها عن طريق تفسير المُجمِّع أثناء عملية التجميع.

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

تسمح مُجمِّعات الماكرو عادةً للماكرو باستقبال مُعاملات . تتضمن بعض المُجمِّعات لغات ماكرو متطورة للغاية، تُدمج عناصر لغوية عالية المستوى مثل المُعاملات الاختيارية، والمتغيرات الرمزية، والشروط، ومعالجة السلاسل النصية، والعمليات الحسابية، وكلها قابلة للاستخدام أثناء تنفيذ ماكرو مُعين، مما يسمح للماكرو بحفظ السياق أو تبادل المعلومات. وبالتالي، قد يُولِّد الماكرو العديد من تعليمات لغة التجميع أو تعريفات البيانات، بناءً على مُعاملات الماكرو. يُمكن استخدام هذا لإنشاء هياكل بيانات على نمط السجلات أو حلقات " مُفكَّكة "، على سبيل المثال، أو يُمكنه إنشاء خوارزميات كاملة بناءً على مُعاملات مُعقدة. على سبيل المثال، يُمكن لماكرو "فرز" قبول تحديد مفتاح فرز مُعقد وإنشاء رمز مُصمم خصيصًا لهذا المفتاح، دون الحاجة إلى اختبارات وقت التشغيل المطلوبة لإجراء عام يُفسِّر هذا التحديد. يُمكن اعتبار المؤسسة التي تستخدم لغة تجميع تم توسيعها بشكل كبير باستخدام مجموعة ماكرو كهذه، تعمل بلغة عالية المستوى لأن هؤلاء المُبرمجين لا يعملون مع العناصر المفاهيمية منخفضة المستوى للحاسوب. تأكيدًا على هذه النقطة، استُخدمت وحدات الماكرو لتنفيذ آلة افتراضية مبكرة في لغة SNOBOL4 (1967)، والتي كُتبت بلغة تنفيذ SNOBOL (SIL)، وهي لغة تجميع خاصة بالآلات الافتراضية. وكانت الآلة المستهدفة تُترجم هذه اللغة إلى شفرتها الأصلية باستخدام مُجمِّع الماكرو . [ 33 ] وقد أتاح ذلك درجة عالية من قابلية النقل في ذلك الوقت.

استُخدمت وحدات الماكرو لتخصيص أنظمة برمجية واسعة النطاق لعملاء محددين في عصر الحواسيب المركزية، كما استخدمها موظفو العملاء لتلبية احتياجات أصحاب العمل من خلال إنشاء نسخ مخصصة من أنظمة تشغيل الشركات المصنعة. فعلى سبيل المثال، قام مبرمجو الأنظمة بذلك من خلال العمل مع نظام مراقبة المحادثات/الآلة الافتراضية ( VM/CMS ) من شركة IBM ، ومع إضافات "معالجة المعاملات في الوقت الفعلي" من IBM، ونظام التحكم في معلومات العملاء (CICS) ، ونظام ACP / TPF ، وهو نظام شركات الطيران/الأنظمة المالية الذي بدأ في سبعينيات القرن الماضي ولا يزال يُشغّل العديد من أنظمة حجز الحجوزات الحاسوبية (CRS) وأنظمة بطاقات الائتمان الكبيرة حتى اليوم.

من الممكن أيضًا استخدام قدرات معالجة الماكرو الخاصة بالمُجمِّع فقط لإنشاء كود مكتوب بلغات مختلفة تمامًا، على سبيل المثال، لإنشاء نسخة من برنامج مكتوب بلغة كوبول باستخدام برنامج مُجمِّع ماكرو بحت يحتوي على أسطر من كود كوبول داخل عوامل تشغيل وقت التجميع التي تُوجِّه المُجمِّع لإنشاء كود عشوائي. يستخدم نظام التشغيل IBM OS/360 وحدات الماكرو لتنفيذ عملية إنشاء النظام . يُحدِّد المستخدم الخيارات من خلال كتابة سلسلة من وحدات الماكرو الخاصة بالمُجمِّع. يؤدي تجميع هذه الوحدات إلى إنشاء سلسلة مهام لبناء النظام، بما في ذلك لغة التحكم في المهام وعبارات التحكم في الأدوات المساعدة .

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

على الرغم من قوة المعالجة الكلية، فقد تم التخلي عنها في العديد من لغات البرمجة عالية المستوى (باستثناءات رئيسية مثل C و C++ و PL/I) بينما ظلت عنصراً أساسياً في لغات التجميع.

يتم استبدال معلمات الماكرو بالاسم فقط: أثناء معالجة الماكرو، تُستبدل قيمة المعلمة باسمها نصيًا. أشهر أنواع الأخطاء الناتجة عن ذلك هو استخدام معلمة عبارة عن تعبير وليس اسمًا بسيطًا، بينما كان كاتب الماكرو يتوقع اسمًا. في الماكرو:

foo: macro a تحميل a*b

كان الهدف هو أن يُقدّم المُستدعي اسم متغير، ويُستخدم المتغير أو الثابت "العام" b لضرب "a". إذا تم استدعاء foo مع المعامل a-c، فسيتم توسيع الماكرو الخاص load a-c*bبه. لتجنب أي لبس محتمل، يمكن لمستخدمي معالجات الماكرو وضع المعاملات الرسمية بين قوسين داخل تعريفات الماكرو، أو يمكن للمُستدعين وضع معاملات الإدخال بين قوسين. [ 34 ]

دعم البرمجة الهيكلية

تم تطوير حزم من وحدات الماكرو لتوفير عناصر برمجة مُهيكلة لترميز تدفق التنفيذ. كان أول مثال على هذا النهج هو مجموعة وحدات الماكرو Concept-14، [ 35 ] التي اقترحها هارلان ميلز (مارس 1970)، ونفذها مارفن كيسلر في قسم الأنظمة الفيدرالية بشركة IBM، والتي وفرت عبارات IF/ELSE/ENDIF وكتل تحكم مماثلة لبرامج التجميع الخاصة بنظام التشغيل OS/360. كانت هذه طريقة لتقليل أو إلغاء استخدام عمليات GOTO في كود التجميع، وهو أحد العوامل الرئيسية المسببة لظاهرة "الكود المعقد" في لغة التجميع. لاقى هذا النهج قبولًا واسعًا في أوائل ثمانينيات القرن العشرين (آخر أيام استخدام لغة التجميع على نطاق واسع). تتضمن مجموعة أدوات التجميع عالية المستوى من IBM [ 36 ] حزمة ماكرو مماثلة.

كان من بين التصاميم الأخرى لغة A-Natural، [ 37 ] وهي لغة تجميع "موجهة نحو التدفق" لمعالجات 8080/ Z80 من شركة Whitesmiths Ltd. (مطورو نظام التشغيل Idris الشبيه بنظام Unix ، وما قيل إنه أول مترجم لغة C تجاري ). صُنفت اللغة كلغة تجميع لأنها تتعامل مع عناصر الآلة الخام مثل رموز العمليات والسجلات ومراجع الذاكرة؛ ولكنها تضمنت صيغة تعبيرية للإشارة إلى ترتيب التنفيذ. تتحكم الأقواس والرموز الخاصة الأخرى، إلى جانب بنيات البرمجة الهيكلية الموجهة نحو الكتل، في تسلسل التعليمات المُولدة. صُممت لغة A-Natural كلغة كائن لمترجم لغة C، وليس للبرمجة اليدوية، ولكن صيغتها المنطقية حظيت ببعض المعجبين.

لم يظهر طلبٌ يُذكر على مُجمِّعات أكثر تطورًا منذ تراجع تطوير لغات التجميع واسعة النطاق. [ 38 ] ومع ذلك، لا تزال هذه المُجمِّعات قيد التطوير والتطبيق في الحالات التي تمنع فيها قيود الموارد أو خصائص بنية النظام المستهدف الاستخدام الفعال للغات عالية المستوى. [ 39 ]

تتيح برامج التجميع المزودة بمحرك ماكرو قوي البرمجة المنظمة عبر وحدات الماكرو، مثل ماكرو التبديل المرفق مع حزمة Masm32 (هذا الكود عبارة عن برنامج كامل):

تضمين \ masm32 \ تضمين \ masm32rt.inc ; استخدام مكتبة Masm32.code demomain: REPEAT 20 switch rv ( nrandom , 9 ) ; توليد رقم بين 0 و 8 mov ecx , 7 case 0 print "case 0" case ecx ; على عكس معظم لغات البرمجة الأخرى، print "case 7" ; يسمح مفتاح Masm32 بـ "حالات متغيرة" case 1 .. 3 .if eax == 1 print "case 1" .elseif eax == 2 print "case 2" .else print "cases 1 to 3: other" .endif case 4 , 6 , 8 print "cases 4, 6 or 8" default mov ebx , 19 ; طباعة 20 نجمة .Repeat print "*" dec ebx .Until Sign? ; حلقة حتى يتم تعيين علامة الإشارة endsw print chr$ ( 13 , 10 ) ENDM exit end demomain

استخدام لغة التجميع

عندما ظهر الحاسوب ذو البرامج المخزنة ، كانت البرامج تُكتب بلغة الآلة، وتُحمّل إلى الحاسوب من شريط ورقي مثقوب أو تُنقل مباشرةً إلى الذاكرة عبر مفاتيح وحدة التحكم. يُنسب إلى كاثلين بوث "اختراع لغة التجميع" [ 40 ] [ 41 ] استنادًا إلى عمل نظري بدأته عام 1947، أثناء عملها على جهاز ARC2 في بيركبيك، جامعة لندن ، بعد استشارة أندرو بوث (زوجها لاحقًا) مع عالم الرياضيات جون فون نيومان والفيزيائي هيرمان غولدستاين في معهد الدراسات المتقدمة . [ 41 ] [ 42 ]

في أواخر عام 1948، دُمج مُجمِّع (يُسمى "الأوامر الأولية") في برنامج التمهيد الخاص بجهاز الحاسبة الإلكترونية ذات التخزين المؤجل (EDSAC) . وقد استخدم هذا المُجمِّع رموزًا مختصرة من حرف واحد طوّرها ديفيد ويلر ، الذي تُنسب إليه جمعية مهندسي الكهرباء والإلكترونيات (IEEE) الفضل في ابتكار أول "مُجمِّع". [ 22 ] [ 43 ] [ 44 ] وقد أدخلت التقارير المتعلقة بجهاز EDSAC مصطلح "التجميع" للإشارة إلى عملية دمج الحقول في كلمة تعليمات. [ 45 ] أما لغة SOAP ( برنامج التجميع الأمثل الرمزي ) فكانت لغة تجميع لجهاز IBM 650، كتبها ستان بولي عام 1955. [ 46 ]

ساهمت لغات التجميع في التخلص من الكثير من البرمجة المعقدة والمملة والمستهلكة للوقت التي كانت مطلوبة في الجيل الأول من الحواسيب، والتي كانت عرضة للأخطاء، مما حرر المبرمجين من مهام شاقة مثل حفظ الرموز الرقمية وحساب العناوين. كانت تُستخدم على نطاق واسع في جميع أنواع البرمجة. وبحلول أواخر الخمسينيات، حلت لغات البرمجة عالية المستوى محلها إلى حد كبير سعيًا لتحسين إنتاجية البرمجة . [ 47 ] واليوم، لا تزال لغة التجميع تُستخدم للتحكم المباشر في الأجهزة، والوصول إلى تعليمات المعالج المتخصصة، أو لمعالجة مشكلات الأداء الحرجة. [ 48 ] وتشمل استخداماتها الشائعة برامج تشغيل الأجهزة ، والأنظمة المدمجة منخفضة المستوى ، وأنظمة الوقت الحقيقي (انظر §  الاستخدام الحالي ).

كُتبت العديد من البرامج بالكامل بلغة التجميع. وكان حاسوب Burroughs MCP (1961) أول حاسوب لم يُطوّر نظام تشغيله بالكامل بلغة التجميع؛ بل كُتب بلغة ESPOL ( لغة الأنظمة التنفيذية الموجهة نحو حل المشكلات )، وهي لهجة من لغة Algol. كما كُتبت العديد من التطبيقات التجارية بلغة التجميع، بما في ذلك جزء كبير من برامج الحواسيب المركزية لشركة IBM التي طورتها شركات كبرى. وفي نهاية المطاف، حلت لغات COBOL و FORTRAN وبعض لغات PL/I محل لغة التجميع، على الرغم من أن عددًا من المؤسسات الكبيرة احتفظت ببنية تحتية لتطبيقات لغة التجميع حتى تسعينيات القرن العشرين.

كانت لغة التجميع هي لغة البرمجة الأساسية لأجهزة الكمبيوتر المنزلية ذات 8 بت، مثل Apple II ، وأجهزة Atari ذات 8 بت ، و ZX Spectrum ، و Commodore 64. لم توفر لغة BASIC المُفسَّرة على هذه الأنظمة أقصى سرعة تنفيذ واستخدامًا كاملًا للإمكانيات المتاحة في الأجهزة. وكانت لغة التجميع هي الخيار الافتراضي لبرمجة أجهزة الألعاب ذات 8 بت، مثل Atari 2600 و Nintendo Entertainment System . [ 49 ]

كُتبت البرامج الرئيسية لأجهزة الكمبيوتر المتوافقة مع IBM PC، مثل MS-DOS و Turbo Pascal وبرنامج الجداول الإلكترونية Lotus 1-2-3، بلغة التجميع. ومع التطور الهائل في سرعة الحواسيب، أصبحت لغة التجميع أداةً لتسريع أجزاء من البرامج، مثل عرض لعبة Doom ، بدلاً من أن تكون لغة تطوير رئيسية. في تسعينيات القرن الماضي، استُخدمت لغة التجميع لتعزيز أداء أنظمة مثل Sega Saturn ، [ 50 ] ولغةً أساسيةً لأجهزة ألعاب الفيديو التي تستخدم معالج TMS34010 المدمج (وحدة المعالجة المركزية/وحدة معالجة الرسومات)، مثل Mortal Kombat و NBA Jam .

الاستخدام الحالي

دار نقاش حول جدوى وأداء لغة التجميع مقارنةً باللغات عالية المستوى. [ 51 ]

على الرغم من أن لغة التجميع لها استخدامات متخصصة محددة حيث تكون مهمة (انظر أدناه)، إلا أن هناك أدوات أخرى للتحسين. [ 52 ]

اعتبارًا من يوليو 2017 يُصنّف مؤشر TIOBE لشعبية لغات البرمجة لغة التجميع في المرتبة الحادية عشرة، متقدمةً على لغة Visual Basic ، على سبيل المثال. [ 53 ] يُمكن استخدام لغة التجميع لتحسين السرعة أو الحجم. في حالة تحسين السرعة، يُزعم أن مُجمّعات التحسين الحديثة [ 54 ] تُحوّل اللغات عالية المستوى إلى شفرة يُمكن تشغيلها بنفس سرعة لغة التجميع المكتوبة يدويًا، على الرغم من وجود بعض الأمثلة المُخالفة. [ 55 ] [ 56 ] [ 57 ] يُؤدي تعقيد المعالجات الحديثة وأنظمة الذاكرة الفرعية إلى جعل التحسين الفعال أكثر صعوبةً بالنسبة للمُجمّعات ومُبرمجي لغة التجميع على حدٍ سواء. [ 58 ] [ 59 ] أدى تحسين أداء المعالجات إلى أن تكون مُعظم وحدات المعالجة المركزية في وضع الخمول مُعظم الوقت، [ 60 ] مع تأخيرات ناتجة عن اختناقات يُمكن التنبؤ بها مثل أخطاء ذاكرة التخزين المؤقت وعمليات الإدخال/الإخراج والتقسيم إلى صفحات ، مما يجعل سرعة تنفيذ الشفرة الخام غير مُشكلة بالنسبة للعديد من المُبرمجين.

لا تزال هناك بعض مجالات برمجة الحاسوب التي يشيع فيها استخدام لغة التجميع:

  • كتابة التعليمات البرمجية للأنظمة ذات المعالجات القديمة التي تتمتع بخيارات محدودة للغات البرمجة عالية المستوى مثل أتاري 2600 وكومودور 64 والآلات الحاسبة البيانية . [ 61 ] غالبًا ما تُكتب البرامج لهذه الحواسيب التي تعود إلى سبعينيات وثمانينيات القرن الماضي في سياق ثقافة الديموسين أو ثقافة ألعاب الفيديو القديمة .
  • التعليمات البرمجية التي يجب أن تتفاعل مباشرة مع الأجهزة، على سبيل المثال في برامج تشغيل الأجهزة ومعالجات المقاطعات .
  • في المعالج المدمج أو معالج الإشارات الرقمية ، تتطلب المقاطعات ذات التكرار العالي أقصر عدد من الدورات لكل مقاطعة، مثل المقاطعة التي تحدث 1000 أو 10000 مرة في الثانية.
  • البرامج التي تحتاج إلى استخدام تعليمات خاصة بالمعالج غير مُنفذة في المُترجم. ومن الأمثلة الشائعة على ذلك تعليمات تدوير البتات التي تُعدّ أساسية في العديد من خوارزميات التشفير، بالإضافة إلى الاستعلام عن تكافؤ البايت أو بت الحمل ذي الأربع بتات في عملية الجمع.
  • الملفات التنفيذية المستقلة التي يجب أن تعمل دون اللجوء إلى مكونات وقت التشغيل أو المكتبات المرتبطة بلغة عالية المستوى، مثل البرامج الثابتة للهواتف وأنظمة الوقود والإشعال في السيارات وأنظمة التحكم في تكييف الهواء وأنظمة الأمان.
  • البرامج ذات الحلقات الداخلية الحساسة للأداء، حيث توفر لغة التجميع فرصًا للتحسين يصعب تحقيقها في لغة عالية المستوى. على سبيل المثال، الجبر الخطي باستخدام BLAS [ 55 ] [ 62 ] أو تحويل جيب التمام المنفصل (مثل إصدار SIMD من لغة التجميع x264 [ 63 ] ).
  • برامج تقوم بإنشاء وظائف متجهة للبرامج المكتوبة بلغات عالية المستوى مثل لغة C. في اللغة عالية المستوى، يتم أحيانًا مساعدة ذلك بواسطة وظائف المترجم المضمنة التي ترتبط مباشرة برموز SIMD، ولكنها مع ذلك تؤدي إلى تحويل تجميعي واحد لواحد خاص بمعالج المتجهات المحدد.
  • تُستخدم هذه الأنظمة في برامج الوقت الحقيقي ، مثل أنظمة المحاكاة، وأنظمة الملاحة الجوية، والمعدات الطبية. فعلى سبيل المثال، في نظام التحكم الإلكتروني بالطيران ، يجب تفسير بيانات القياس عن بُعد والتعامل معها ضمن قيود زمنية صارمة. يجب أن تتخلص هذه الأنظمة من مصادر التأخير غير المتوقع، والتي قد تنشأ عن لغات البرمجة المفسرة، أو جمع البيانات المهملة تلقائيًا ، أو عمليات الترحيل، أو تعدد المهام الاستباقي . يمنح اختيار لغة التجميع أو لغات البرمجة منخفضة المستوى لهذه الأنظمة المبرمجين رؤيةً وتحكمًا أكبر في تفاصيل المعالجة.
  • خوارزميات التشفير التي يجب أن تستغرق دائمًا نفس الوقت بالضبط للتنفيذ، مما يمنع هجمات التوقيت .
  • تحتوي برامج ترميز وفك ترميز الفيديو مثل rav1e (برنامج ترميز لـ AV1 ) [ 64 ] و dav1d (برنامج فك الترميز المرجعي لـ AV1) [ 65 ] على لغة التجميع للاستفادة من تعليمات AVX2 و ARM Neon عند توفرها.
  • تعديل وتوسيع التعليمات البرمجية القديمة المكتوبة لأجهزة الكمبيوتر المركزية من شركة IBM . [ 66 ] [ 67 ]
  • المواقف التي تتطلب سيطرة كاملة على البيئة، في المواقف الأمنية عالية للغاية حيث لا يمكن اعتبار أي شيء أمراً مفروغاً منه .
  • فيروسات الكمبيوتر ، وبرامج تحميل الإقلاع ، وبرامج تشغيل أجهزة معينة ، أو عناصر أخرى قريبة جدًا من الأجهزة أو نظام التشغيل منخفض المستوى.
  • محاكيات مجموعة التعليمات للمراقبة والتتبع وتصحيح الأخطاء حيث يتم تقليل النفقات العامة الإضافية إلى الحد الأدنى.
  • الحالات التي لا توجد فيها لغة برمجة عالية المستوى، على معالج جديد أو متخصص لا يتوفر له مترجم متقاطع .
  • الهندسة العكسية وتعديل ملفات البرامج مثل:
    • الملفات الثنائية الموجودة التي ربما تكون أو لا تكون قد كُتبت في الأصل بلغة عالية المستوى، على سبيل المثال عند محاولة إعادة إنشاء البرامج التي لا يتوفر لها رمز المصدر أو فُقدت، أو اختراق حماية النسخ للبرامج الاحتكارية.
    • تُعرف ألعاب الفيديو أيضاً باسم اختراق ذاكرة القراءة فقط ( ROM hacking )، وهو أمر ممكن عبر عدة طرق. الطريقة الأكثر شيوعاً هي تعديل كود البرنامج على مستوى لغة التجميع.

لا تزال لغة التجميع تُدرَّس في معظم برامج علوم الحاسوب والهندسة الإلكترونية . ورغم أن قلة من المبرمجين اليوم يستخدمون لغة التجميع كأداة بشكل منتظم، إلا أن المفاهيم الأساسية لا تزال مهمة. فمواضيع أساسية كالحساب الثنائي ، وتخصيص الذاكرة ، ومعالجة المكدس ، وتشفير مجموعة الأحرف ، ومعالجة المقاطعات ، وتصميم المترجمات ، يصعب دراستها بالتفصيل دون فهم كيفية عمل الحاسوب على مستوى العتاد. وبما أن سلوك الحاسوب يُحدَّد أساسًا بمجموعة تعليماته، فإن الطريقة المنطقية لتعلم هذه المفاهيم هي دراسة لغة التجميع. تمتلك معظم الحواسيب الحديثة مجموعات تعليمات متشابهة. لذا، تكفي دراسة لغة تجميع واحدة لتعلم المفاهيم الأساسية، والتعرف على الحالات التي قد يكون فيها استخدام لغة التجميع مناسبًا، ومعرفة كيفية إنشاء شفرة تنفيذية فعالة من لغات البرمجة عالية المستوى. [ 25 ]

التطبيقات النموذجية

انظر أيضاً

ملحوظات

  1. بخلاف المجمعات الفوقية
  2. ومع ذلك، هذا لا يعني أن برامج التجميع التي تنفذ تلك اللغات عالمية.
  3. هذا أحد شكلين متكررين لهذه التعليمات يعملان بنفس الطريقة. يحتوي معالج 8086 والعديد من المعالجات الأخرى من أواخر السبعينيات/أوائل الثمانينيات على تكرارات في مجموعات تعليماتها، لأنه كان من الأسهل على المهندسين تصميم هذه المعالجات (لتتناسب مع رقائق السيليكون ذات الأحجام المحدودة) باستخدام الرموز المتكررة بدلاً من إزالتها (انظر المصطلحات غير المهمة ). عادةً ما يُولّد كل مُجمِّع واحدًا فقط من اثنين أو أكثر من ترميزات التعليمات المتكررة، ولكن عادةً ما يتعرف مُفكِّك الشفرة على أي منها.
  4. قامت شركة AMD بتصنيع معالجات Intel 8086 و8088 و80286 من مصادر ثانوية، وربما معالجات 8080A و8085A، بموجب ترخيص من Intel، ولكن بدءًا من معالج 80386، رفضت Intel مشاركة تصميمات معالجات x86 الخاصة بها مع أي شخص - رفعت AMD دعوى قضائية بشأن هذا الأمر لخرق العقد - وقامت AMD بتصميم وتصنيع وبيع معالجات x86 من عائلة 32 بت و64 بت دون مساعدة أو تأييد من Intel.
  5. في برنامج 7070 Autocoder، تعريف الماكرو هو برنامج مولد ماكرو 7070 الذي يستدعيه المجمع؛ يوفر Autocoder وحدات ماكرو خاصة لمولدات الماكرو لاستخدامها.

مراجع

  1. 1 2 "لغة التجميع" . لغة التجميع عالية المستوى لأنظمة z/OS و z/VM و z/VSE، المرجع اللغوي، الإصدار 1، الإصدار 6. شركة IBM . 2014 [1990] . SC26-4940-06.
  2. "لغة التجميع: مراجعة" (ملف PDF) . علوم وهندسة الحاسوب. كلية الهندسة، جامعة ولاية أوهايو . 2016. مؤرشف (ملف PDF) من الأصل بتاريخ 24-03-2020 . تم الاطلاع عليه بتاريخ 24-03-2020 .
  3. آرتشر، بنجامين (نوفمبر 2016). لغة التجميع للطلاب . نورث تشارلستون، كارولاينا الجنوبية، الولايات المتحدة الأمريكية: دار كريت سبيس للنشر المستقل . رقم ISBN 978-1-5403-7071-6. يمكن أيضاً تسمية لغة التجميع بلغة الآلة الرمزية.
  4. ستريب، جيمس ت. (2020). "دليل لغة التجميع". مواضيع جامعية في علوم الحاسوب . تشام: دار نشر سبرينغر الدولية. doi : 10.1007/978-3-030-35639-2 . ISBN 978-3-030-35638-5ISSN 1863-7310 . S2CID 195930813. البرمجة بلغة التجميع لها نفس فوائد البرمجة بلغة الآلة، إلا أنها أسهل .  
  5. ساكسون، جيمس أ.؛ بليت، ويليام س. (1962). برمجة جهاز IBM 1401، دليل برمجة ذاتي التعليم . إنجلوود كليفس، نيو جيرسي، الولايات المتحدة الأمريكية: برنتيس هول . LCCN 62-20615 . (ملاحظة: استخدام مصطلح برنامج التجميع .)
  6. كورنيليس، أ. ف. (2010) [2003]. "مجمع عالي المستوى - نظرة عامة على رموز العمليات، توجيهات المجمع" . مؤرشف من الأصل بتاريخ 24-03-2020 . تم الاسترجاع بتاريخ 24-03-2020 .
  7. "تعليمات الماكرو" . مرجع لغة التجميع عالي المستوى لأنظمة z/OS و z/VM و z/VSE، الإصدار 1، الإصدار 6. شركة IBM . 2014 [1990]. SC26-4940-06.
  8. بوث، أندرو د؛ بريتن، كاثلين هـ. ف. (1947). ترميز ARC (ملف PDF) . معهد الدراسات المتقدمة، برينستون . تم الاطلاع عليه بتاريخ 4 نوفمبر 2022 .
  9. ويلكس، موريس فنسنت ؛ ويلر، ديفيد جون ؛ جيل، ستانلي جيه. (1951). إعداد البرامج للحاسوب الرقمي الإلكتروني (طبعة مُعاد طباعتها عام 1982). دار نشر توماش . ISBN  978-0-93822803-5. OCLC 313593586 . {{cite book}}عدم توافق رقم ISBN / التاريخ ( مساعدة )
  10. فيرهيد، هاري (16 نوفمبر 2017). "تاريخ لغات البرمجة - العقد الكلاسيكي، الخمسينيات" . مجلة I Programmer . مؤرشف من الأصل في 2 يناير 2020. تم الاطلاع عليه في 6 مارس 2020 .
  11. "تعريف ومعنى وقت التجمع | Dictionary.com" . www.dictionary.com . تم الاطلاع عليه بتاريخ 14 يوليو 2026 .
  12. "كيف تعتمد لغات التجميع على أنظمة التشغيل؟" . ستاك إكستشينج . ستاك إكستشينج إنك. 28 يوليو 2011. مؤرشف من الأصل في 24 مارس 2020. تم الاطلاع عليه في 24 مارس 2020 .(ملاحظة: غالبًا ما تختلف استدعاءات النظام، على سبيل المثال بالنسبة لـ MVS مقابل VSE مقابل VM/CMS؛ وقد تختلف أيضًا تنسيقات الملفات الثنائية/التنفيذية لأنظمة التشغيل المختلفة.)
  13. أوسترليتز، هوارد (2003). "لغات برمجة الحاسوب". تقنيات جمع البيانات باستخدام أجهزة الحاسوب الشخصية . إلسيفير. ص 326-360 . doi : 10.1016/b978-012068377-2/50013-9 . ISBN  9780120683772لغة التجميع (أو المُجمِّع) هي لغة حاسوبية مُترجمة ومنخفضة المستوى. وهي تعتمد على المعالج، إذ تُترجم رموز المُجمِّع مباشرةً إلى الأوامر التي يفهمها المعالج المركزي، وذلك بنسبة واحد إلى واحد. تُمثل رموز المُجمِّع هذه مجموعة التعليمات الخاصة بذلك المعالج .
  14. كارنز، بو (27 أبريل 2022). "تعلم برمجة لغة التجميع باستخدام ARM" . freeCodeCamp.org . تاريخ الاسترجاع: 21 يونيو 2022. غالبًا ما تكون لغة التجميع خاصة ببنية حاسوب معينة، لذا توجد أنواع متعددة من لغات التجميع. تُعد لغة التجميع ARM من لغات التجميع التي تزداد شعبيتها.
  15. بروكس، فريدريك ب. (1986). "لا يوجد حل سحري - الجوهر والصدفة في هندسة البرمجيات". وقائع المؤتمر العالمي العاشر للحوسبة التابع للاتحاد الدولي لمعالجة المعلومات . الصفحات 1069-1076 . 
  16. أنغويانو، ريكاردو. "linux kernel mainline 4.9 sloccount.txt" . جيست . تم الاسترجاع في 4 مايو 2022 .
  17. "ما هي لغة التجميع؟" . GeeksforGeeks . 19-10-2023 . تم الاطلاع عليه بتاريخ 24-04-2026 .
  18. داينتيث، جون، محرر. (2019). "المُجمِّع الفائق" . قاموس الحوسبة . مؤرشف من الأصل بتاريخ 24-03-2020 . تم الاسترجاع بتاريخ 24-03-2020 .
  19. أنظمة بيانات زيروكس (أكتوبر 1975). دليل مرجعي للغة وعمليات حواسيب زيروكس ميتا-سيمبول سيجما 5-9 (ملف PDF) . صفحة 6. مؤرشف (ملف PDF) من الأصل بتاريخ 9 أكتوبر 2022. تم الاطلاع عليه بتاريخ 7 يونيو 2020. يُستخدم كمجمع فائق، مما يُمكّن المستخدم من تصميم لغات البرمجة الخاصة به وإنشاء معالجات لهذه اللغات بأقل جهد ممكن. 
  20. أنظمة حاسوب سبيري يونيفاك (1977). مرجع مبرمج لغة التجميع الفوقية (MASM) لأنظمة حاسوب سبيري يونيفاك (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 9 أكتوبر 2022. تم الاطلاع عليه بتاريخ 7 يونيو 2020 .
  21. "كيفية استخدام لغة التجميع المضمنة في كود C" . gnu.org . تم الاطلاع عليه بتاريخ 2020-11-05 .
  22. 1 2 3 4 سالومون، ديفيد (فبراير 1993) [1992]. كُتب في جامعة ولاية كاليفورنيا، نورثريدج، كاليفورنيا، الولايات المتحدة الأمريكية. تشيفرز، إيان د. (محرر). المُجمِّعات والمُحمِّلات (ملف PDF) . سلسلة إليس هوروود في الحواسيب وتطبيقاتها ( الطبعة الأولى). تشيستر، غرب ساسكس، المملكة المتحدة: إليس هوروود المحدودة / مجموعة سيمون وشوستر الدولية . الصفحات 237-238 . ISBN   0-13-052564-2تمت أرشفة الملف (PDF) من النسخة الأصلية بتاريخ 23 مارس 2020. تم الاطلاع عليه بتاريخ 1 أكتوبر 2008 .(xiv+294+4 صفحات)
  23. فينلايسون، إيان؛ ديفيس، براندون؛ جافين، بيتر؛ أوه، جانج-ريونج؛ والي، ديفيد؛ سيلاندر، ماغنوس؛ تايسون، جاري (2013). "تحسين كفاءة المعالج من خلال التجميع الثابت للتعليمات" . وقائع المؤتمر الرابع عشر لجمعية ACM SIGPLAN/SIGBED حول اللغات والمترجمات والأدوات للأنظمة المدمجة . الصفحات 33-44 . doi : 10.1145/2465554.2465559 . ISBN  9781450320856. S2CID 8015812 . 
  24. بيك، ليلاند ل. (1996). "2". برمجيات النظام: مقدمة في برمجة الأنظمة . أديسون ويسلي .
  25. 1 2 هايد، راندال (سبتمبر 2003) [1996-09-30]. "مقدمة ("لماذا قد يتعلم أي شخص هذه الأشياء؟") / الفصل 12 - الفئات والكائنات". فن لغة التجميع ( الطبعة الثانية). دار نشر نو ستارش . ISBN  1-886411-97-2أُرشف من المصدر الأصلي بتاريخ 2010-05-06 . تم الاطلاع عليه بتاريخ 2020-06-22 .تصحيحات:(928 صفحة)
  26. 1 2 3 4 دليل مطوري برامج معمارية إنتل، المجلد 2: مرجع مجموعة التعليمات (ملف PDF) . المجلد 2. شركة إنتل . 1999. مؤرشف من الأصل (ملف PDF) بتاريخ 11 يونيو 2009. تم الاطلاع عليه بتاريخ 18 نوفمبر 2010 . 
  27. فيراري، آدم؛ باتسون، آلان؛ لاك، مايك؛ جونز، أنيتا (19 نوفمبر 2018) [ربيع 2006]. إيفانز، ديفيد (محرر). "دليل لغة التجميع x86" . علوم الحاسوب CS216: تمثيل البرامج والبيانات. جامعة فرجينيا . مؤرشف من الأصل في 24 مارس 2020. تم الاسترجاع في 18 نوفمبر 2010 .
  28. "دليل بنية SPARC، الإصدار 8" (ملف PDF) . SPARC International . 1992. مؤرشف من الأصل (ملف PDF) بتاريخ 10 ديسمبر 2011. تم الاطلاع عليه بتاريخ 10 ديسمبر 2011 .
  29. موكسهام، جيمس (1996). "مترجم ZINT Z80" . رموز عمليات Z80 لـ ZINT . مؤرشف من الأصل بتاريخ 24-03-2020 . تم الاطلاع عليه بتاريخ 21-07-2013 .
  30. معيار IEEE 694-1985: معيار IEEE للغة التجميع الخاصة بالمعالجات الدقيقة . جمعية IEEE للحاسبات. 1985. ISBN 0-7381-2752-3. OCLC 1415906564 . 
  31. هايد، راندال . "الفصل 8. MASM: التوجيهات ورموز العمليات الزائفة" (ملف PDF) . فن برمجة الحاسوب . مؤرشف (PDF) من الأصل بتاريخ 24-03-2020 . تم الاطلاع عليه بتاريخ 19-03-2011 .
  32. نظام التشفير التلقائي 1401، البرنامج رقم 1401-AU-037، الإصدار 3، مستوى التعديل 11 (ملف PDF) . 7 ديسمبر 1965. تاريخ الاسترجاع: 21 يناير 2024. يسري القيد أو التحديد الطفيف التالي فيما يتعلق باستخدام برنامج التشفير التلقائي 1401 عند ترميز تعليمات الماكرو...
  33. غريسولد، رالف إي. (1972). "الفصل 1". تطبيق الماكرو لـ SNOBOL4 . سان فرانسيسكو، كاليفورنيا، الولايات المتحدة الأمريكية: دبليو إتش فريمان وشركاه . ISBN 0-7167-0447-1.
  34. "وحدات الماكرو (C/C++)، مكتبة MSDN لـ Visual Studio 2008" . شركة مايكروسوفت . 16 نوفمبر 2012. مؤرشف من الأصل في 24 مارس 2020. تم الاطلاع عليه في 22 يونيو 2010 .
  35. كيسلر، مارفن م. (18 ديسمبر 1970). "التقرير المفاهيمي 14 - تطبيق وحدات الماكرو لتمكين البرمجة المهيكلة في نظام التشغيل OS/360" . برنامج MVS: وحدات الماكرو المفاهيمية 14. غايثرسبيرغ، ماريلاند، الولايات المتحدة الأمريكية: شركة آي بي إم . مؤرشف من الأصل في 24 مارس 2020. تم الاطلاع عليه في 25 مايو 2009 .
  36. "ميزة مجموعة أدوات التجميع عالية المستوى تزيد من إنتاجية المبرمجين" . رسائل إعلانية . شركة آي بي إم . 12 ديسمبر 1995. A95-1432. مؤرشف من الأصل في 7 مارس 2023.
  37. شركة وايتسميث المحدودة (15-07-1980). دليل مرجعي للغة الطبيعية .
  38. "لغة التجميع: تعريفها ومعلومات أخرى كثيرة من Answers.com" . answers.com . مؤرشف من الأصل بتاريخ 8 يونيو 2009. تم الاطلاع عليه بتاريخ 19 يونيو 2008 .
  39. بروفينسيانو، برايان (17 أبريل 2005). "نيشلا: مُجمِّع 6502 عالي المستوى ومفتوح المصدر لنظام نينتندو الترفيهي" . مؤرشف من الأصل في 24 مارس 2020. تم الاطلاع عليه في 24 مارس 2020 .
  40. دوفريسن، ستيفن (21 أغسطس 2018). "كاثلين بوث: تجميع الحواسيب المبكرة أثناء اختراع لغة التجميع" . مؤرشف من الأصل في 24 مارس 2020. تم الاطلاع عليه في 10 فبراير 2019 .
  41. ١ ٢ بوث، أندرو دونالد ؛ بريتن، كاثلين هيلدا فاليري (سبتمبر ١٩٤٧) [أغسطس ١٩٤٧]. اعتبارات عامة في تصميم حاسوب رقمي إلكتروني متعدد الأغراض (ملف PDF) (الطبعة الثانية ). معهد الدراسات المتقدمة، برينستون، نيو جيرسي، الولايات المتحدة الأمريكية: كلية بيركبيك، لندن . مؤرشف (ملف PDF) من الأصل بتاريخ ٢٠٢٠-٠٣-٢٤ . تم الاسترجاع بتاريخ ٢٠١٩-٠٢-١٠ . الأفكار غير الأصلية، الواردة في النص التالي، مستمدة من عدد من المصادر، ... ومع ذلك، من الضروري توجيه الشكر إلى البروفيسور جون فون نيومان والدكتور هيرمان غولدشتاين على العديد من المناقشات المثمرة ... 
  42. كامبل-كيلي، مارتن (أبريل 1982). "تطور برمجة الحاسوب في بريطانيا (1945 إلى 1955)". حوليات معهد مهندسي الكهرباء والإلكترونيات لتاريخ الحوسبة . 4 (2): 121-139 . doi : 10.1109/MAHC.1982.10016 . S2CID 14861159 . 
  43. كامبل-كيلي، مارتن (1980). "برمجة EDSAC: النشاط البرمجي المبكر في جامعة كامبريدج". حوليات IEEE لتاريخ الحوسبة . 2 (1): 7-36 . doi : 10.1109/MAHC.1980.10009 .
  44. "جائزة رائد الكمبيوتر لعام 1985 'لبرمجة لغة التجميع' ديفيد ويلر" . 2018-03-27.
  45. ويلكس، موريس فنسنت (1949). "آلة EDSAC - آلة حاسبة إلكترونية". مجلة الأدوات العلمية . 26 (12): 385-391 . Bibcode : 1949JScI...26..385W . doi : 10.1088/0950-7671/26/12/301 .
  46. دا كروز، فرانك (17 مايو 2019). "آلة حاسبة أسطوانية مغناطيسية من طراز IBM 650" . تاريخ الحوسبة - تسلسل زمني للحوسبة. جامعة كولومبيا . مؤرشف من الأصل في 15 فبراير 2020. تم الاطلاع عليه في 17 يناير 2012 .
  47. أبيل، جون سي. "15 أكتوبر 1956: لغة فورتران تُغير مسار الحوسبة إلى الأبد" . مجلة وايرد . الرقم الدولي الموحد للدوريات 1059-1028 . تاريخ الاسترجاع: 2024-03-02 . 
  48. كولين، موريس ف . (مارس-أبريل 1994). "أصول المعلوماتية" . مجلة الجمعية الأمريكية للمعلوماتية الطبية . 1 (2): 96-97 . doi : 10.1136/jamia.1994.95236152 . PMC 116189. PMID 7719803 .  
  49. "تاريخ مبسط لأجهزة ألعاب الفيديو القديمة للمبرمجين" . pikuma.com . تم الاطلاع عليه بتاريخ 16 أبريل 2026 .
  50. بيتوس، سام (10 يناير 2008). "سيجا بيس، المجلد 6 - ساتورن" . مؤرشف من الأصل بتاريخ 13 يوليو 2008. تم الاطلاع عليه بتاريخ 25 يوليو 2008 .
  51. كاولر، باري (997-01-09). لغة التجميع وأنظمة برمجة ويندوز: برمجة منخفضة المستوى 16 و32 بت للحاسوب الشخصي وويندوز . مطبعة سي آر سي . رقم ISBN 978-1-48227572-8تم الاطلاع عليه بتاريخ 24-03-2020 . لطالما كان الجدل محتدماً حول مدى ملاءمة لغة التجميع في عالم البرمجة الحديث.
  52. هسيه، بول (24-03-2020) [2016، 1996]. "تحسين البرمجة" . مؤرشف من الأصل في 24-03-2020 . تم الاسترجاع في 24-03-2020 . ... تميل تغييرات التصميم إلى التأثير على الأداء أكثر من ... لا ينبغي الانتقال مباشرة إلى لغة التجميع حتى ...
  53. "مؤشر TIOBE" . برنامج TIOBE . مؤرشف من الأصل بتاريخ 24-03-2020 . تم الاطلاع عليه بتاريخ 24-03-2020 .
  54. روسلينغ، ديفيد أ. (1999) [1996]. "الفصل الثاني: أساسيات البرمجيات" . نواة لينكس . مؤرشف من الأصل بتاريخ 24-03-2020 . تم الاطلاع عليه بتاريخ 11-03-2012 .
  55. 1 2 ماركوف، جون غريغوري (28 نوفمبر 2005). "كتابة أسرع كود، يدويًا، للمتعة: حاسوب بشري يُسرّع الرقائق الإلكترونية" . صحيفة نيويورك تايمز . سياتل، واشنطن، الولايات المتحدة. مؤرشف من الأصل في 23 مارس 2020. تم الاطلاع عليه في 4 مارس 2010 .
  56. "مشكلة حقول البت" . hardwarebug.org . 30 يناير 2010. مؤرشف من الأصل في 5 فبراير 2010. تم الاطلاع عليه في 4 مارس 2010 .
  57. "GCC يُحدث فوضى" . hardwarebug.org . 13 مايو 2009. مؤرشف من الأصل في 16 مارس 2010. تم الاطلاع عليه في 4 مارس 2010 .
  58. هايد، راندال . "النقاش الكبير" . مؤرشف من الأصل بتاريخ 16-06-2008 . تم الاطلاع عليه بتاريخ 03-07-2008 .
  59. "فشل مصادر الشفرة مجدداً" . hardwarebug.org . 30 يناير 2010. مؤرشف من الأصل في 2 أبريل 2010. تم الاطلاع عليه في 4 مارس 2010 .
  60. كليك، كليف ؛ غوتز، برايان. "دورة مكثفة في الأجهزة الحديثة" . مؤرشف من الأصل بتاريخ 24 مارس 2020. تم الاطلاع عليه بتاريخ 1 مايو 2014 .
  61. "برمجة 68K في Fargo II" . مؤرشف من الأصل بتاريخ 2008-07-02 . تم الاطلاع عليه بتاريخ 2008-07-03 .
  62. "معيار BLAS - أغسطس 2008" . eigen.tuxfamily.org. 1 أغسطس 2008. مؤرشف من الأصل في 24 مارس 2020. تم الاطلاع عليه في 4 مارس 2010 .
  63. "x264.git/common/x86/dct-32.asm" . git.videolan.org. 2010-09-29. مؤرشف من الأصل بتاريخ 2012-03-04 . تم الاطلاع عليه بتاريخ 2010-09-29 .
  64. "rav1e/README.md في الإصدار 0.6.3" . جيت هاب . مؤرشف من الأصل بتاريخ 22-02-2023 . تم الاطلاع عليه بتاريخ 21-02-2023 .
  65. "README.md · 1.1.0 · VideoLAN / dav1d" . 13-02-2023. مؤرشف من الأصل بتاريخ 22-02-2023 . تم الاطلاع عليه بتاريخ 21-02-2023 .
  66. بوسورث، إدوارد (2016). "الفصل 1 - لماذا ندرس لغة التجميع؟" . www.edwardbosworth.com . مؤرشف من الأصل بتاريخ 24 مارس 2020. تم الاطلاع عليه بتاريخ 1 يونيو 2016 .
  67. "تعليمات ماكرو DFSMS لمجموعات البيانات في نظام التشغيل z/OS الإصدار 2 الإصدار 3" (ملف PDF) . شركة IBM. 15 فبراير 2019. مؤرشف (ملف PDF) من الأصل بتاريخ 25 يونيو 2021. تم الاطلاع عليه بتاريخ 14 سبتمبر 2021 .
  68. بول، ماتياس ر. (2001) [1996]، "مواصفات ووثائق مرجعية لبرنامج NECPINW" ، NECPINW.CPI - برنامج تشغيل تبديل صفحة ترميز DOS لطابعات NEC Pinwriters ( الإصدار 2.08)، FILESPEC.TXT، NECPINW.ASM، EUROFONT.INC من NECPI208.ZIP، مؤرشف من الأصل بتاريخ 10-09-2017 ، تم استرجاعه بتاريخ 22-04-2013 
  69. بول، ماتياس ر. (13 مايو 2002). " [ fd-dev ] mkeyb" . freedos-dev . تم الاسترجاع في 10 سبتمبر 2018 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )

للمزيد من القراءة