دليل أمر GNU as في أوبونتو: أساسيات التجميع والتطبيق العملي

نظرة عامة

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

1. تجهيز حزمة binutils والتحقق من جاهزية بيئة المجمّع as

لبدء التعامل مع شيفرات التجميع وتوفير أدوات التطوير الأساسية في بيئة أوبونتو، نحتاج أولًا إلى جلب حزمتي binutils و gcc:

تثبيت حزمتي binutils وgcc عبر apt-get

تُشير أداة as إلى مجمّع جنو القياسي (GAS)، ومهمتها الجوهرية هي تحويل تعليمات لغة التجميع النصية إلى بايتات آلة مخزنة ضمن ملف كائني (Object File).
يمكن فحص رقم الإصدار وبنية المعالج المستهدفة المدعومة محليًا باستخدام الخيار --version:

⚙️ [أبرز الخيارات التشغيلية للمجمّع]

-o : تعيين اسم ومسار ملف الكائن الناتج بدقة.
-g : تضمين بيانات ورموز التنقيح لتسهيل فحص البرنامج عبر GDB.
-a : توليد قائمة تفصيلية تدمج سطور الشيفرة المصدرية بمقابلها من بايتات الآلة.
--32 : فرض إنتاج شيفرة متوافقة مع معمارية 32-بت.
--64 : فرض إنتاج شيفرة مخصصة لمعمارية 64-بت القياسية.
-v أو --version : عرض تفاصيل الإصدار ومعلومات الترخيص للمجمّع.

التحقق من إصدار أداة as المثبتة

2. صياغة نموذج تجميع بسيط وبناء الملف الكائني الأولي

كنموذج تطبيقي عملي، سنقوم بإنشاء ملف تجميعي مخصص لمعمارية x86-64 يحمل الاسم exit_code.s ويهدف فقط إلى استدعاء النظام لإيقاف العملية وتمرير رمز الخروج الرقمي 42:

إنشاء ملف التجميع exit_code.s

بعد حفظ الملف المصدري، نوجّه المجمّع as لإنتاج الملف الكائني exit_code.o بالاعتماد على الخيار -o:
عند خلو الصياغة من أخطاء القواعد، تكتمل المعالجة بصمت تام دون طباعة رسائل تحذيرية على الطرفية.

تجميع الملف المصدري إلى ملف كائني

للتأكد من توليد الملف الكائني ومعاينة خصائصه وحجمه في المجلد الحالي، نستعرض بياناته عبر أمر القائمة المفصلة ls -l exit_code.o:

استعراض خصائص الملف الكائني الناتج

3. إدراج رموز التنقيح (-g) واستخراج ملف القوائم التفصيلية (-a)

لتسهيل تتبع تدفق التعليمات وفحص السجلات البرمجية لاحقًا بواسطة أدوات مثل GDB، نقوم بتفعيل معامل التنقيح -g لإنتاج الملف exit_code_debug.o:
سيكتمل التنفيذ بسلاسة ما دامت التعليمات البرمجية متوافقة ومطابقة للمعايير.

توليد ملف كائني مزود ببيانات التنقيح

يتيح المجمّع إمكانية تحليل مخرجات التحويل بعمق عبر الخيار -a=exit_code.lst، والذي يقوم بتسجيل تقرير مقارنة شامل يتضمن السطور المصدرية وما يقابلها مباشرة من ترميز ثنائي:
يؤدي هذا الإجراء إلى توليد الملف الكائني exit_code.o بمحاذاة ملف السرد exit_code.lst.

إنشاء ملف السرد التحليلي أثناء عملية التجميع

لقراءة الأسطر الأولى من هذا الملف الاستعراضي، نستخدم أمر العرض head -n 20 exit_code.lst:
يكشف الناتج بوضوح أرقام الأسطر، والإزاحات النسبية (Offsets)، والتمثيل الست عشري الفعلي للبايتات التي سيفهمها المعالج مباشرة.

فحص محتويات ملف السرد التحليلي عبر head

4. مرحلة الربط بواسطة ld وإنشاء وتشغيل الملف التنفيذي النهائي

الملفات الكائنية بمفردها غير مهيأة للإقلاع المباشر؛ لذا نستعين برابط النظام ld لربط exit_code.o واستخراج البرنامج التنفيذي المستقل exit_program عبر الأمر ld -o exit_program exit_code.o:
إذا تم حل جميع الرموز بنجاح، يُنشأ الملف التنفيذي دون إخراج أي أخطاء.

ربط الملف الكائني وتوليد البرنامج التنفيذي عبر ld

نقوم الآن بتشغيل البرنامج المولد مباشرة في سطر الأوامر عبر المسار النسبي ./exit_program:
نظرًا لأن البرنامج يقتصر على إنهاء العملية دون الكتابة إلى مجرى الإخراج القياسي، فلن تظهر نصوص مرئية.

تشغيل البرنامج التنفيذي في الطرفية

للتحقق من استجابة النظام لنداء الإنهاء والقيمة المسجلة، نستعلم عن حالة الخروج الأخيرة باستخدام الأمر echo "종료 코드: $?":
يُعرض رمز الإرجاع بنجاح في مخرجات الطرفية، مما يؤكد سلامة تدفق التعليمات المنخفضة المستوى التي تم تجميعها وربطها.

التحقق من رمز الخروج للبرنامج المنفذ

قدم هذا الدليل استعراضًا شاملاً لخطوات استخدام مجمّع GNU as داخل بيئة أوبونتو لبناء واختبار برامج لغة التجميع من البداية.
تتيح ممارسة هذه الخطوات ترسيخ فهم آليات المعالجة والتعامل المباشر مع عتاد النظام على أدنى المستويات البرمجية في لينكس.