/Into the Low Level: Assembling (0x05)

Into the Low Level: Assembling (0x05)

فى المقاله السابقة شرحنا كيفيه تعامل نظام التشغيل والماكينه مع الكود او الملفات الثنائية، وأنواع طريقة كتابة لغات التجميع.
فى هذا المقال سأبدأ بشرح كيفيه كتابة كود لغة التجميع تحت نظام الـ جنو/لينوكس.
ماسنحتاج اليه فى هذه المقاله هو اي نوع من توزيعات الـ جنو/لينوكس. و nasm. افتح التيرمنال واكتب “sudo apt-get install nasm”.
هذا النوع من كتابه لغة التجميع يعتبر من اكثر الانواع استخداما واشهرها وحديث وقابل للتشكل حسب نوع نظام التشغيل.
افتح ملف نصي جديد بأي محرر نصي وانا شخصياً افضل ال vim ولكن لك حرية الاختيار. واكتب الكود الخاص باستدعاء النظام exit.

بعد كتابه الكود يجب تجميع او ترجمة الكود الى ملف (اوبجكت) عن طريق ال nasm. ولكن ماهو المجمع؟؟
اي كود لغه برمجه ذات مستوي اعلي من لغة التجميع ( السي علي سبيل المثال) تمر بثلاث مراحل. فأي كومبيلر يمر بتلك الثلاث مراحل لانتاج ملف تنفيذي.
اولا مرحله الترجمة او الكومبيل : وخلالها يتم ترجمه كود البرنامج من كود لغه البرمجه الى كود لغه تجميع.  على سبيل المثال اذا ترجمت كود سي مع اضافه الأختيار S الى ال جنو كومبيلر ( gcc -S file.c).
ثانيا مرحله التجميع: وخلالها يتم تجميع وترجمه ملف لغه التجميع الناتج عن مرحله الكومبيل. لينتج ملف يسمي ملف كائن او ملف الاوبجكت. وهو مرحله ماقبل تحويل الملف الى ملف تنفيذي. وإحدي فوائده والتي تهمنا عند هذه النقطه. هو انك تستطيع كتابه اكثر من ملف للكود وترجمتهم الى ملفات كائنه. ومن ثم ربطهم سويا بما يسمي الرابط او اللينكر.
ثالثا مرحله الربط: وفيها يتم ربط الملفات الكائنة سويا لتكوين الملف التنفيذي.

ولكن بما اننا نكتب بلغة التجميع فسوف نتخطي مرحله الكومبيل.
لنرجع الى هدف هذه المقاله، تنفيذ الكود الذي كتبناه مسبقاً.
بعد ان كتبنا الكود نفتح التيرمنال ونذهب الى المجلد الذي يحتوي الكود ونكتب كما فى الصوره.

كما توضح الصوره فإنه بعد كتابة nasm -f elf exit.asm -o exit.o يظهر ملف ذو امتداد .o وذلك مايسمي بالملف الكائن.
ولكن ماهو ال Elf؟
ال Elf هو نوع من انواع الملفات التنفيذيه. وهو يعتبر النوع المقياسي والاشهر للانظمه *nix. ويمكن ان يوجد على شكلين، علي شكل ملف تنفيذي او ملف كائن.
هنالك انواع اخري متعدده غير ال ELF كما ستري فى الصوره التاليه.اما الاختيار -o فهو لاختيار اسم الملف الكائن بعد ان يتم تجميعه، وكما تري بعد تنفيذ objdump -h exit.o. يعلمنا ان نوع الملف هو elf32.

بعد ان اتممنا عملية التجميع جاء وقت عمليه الربط لتكوين الملف التنفيذي. وهذه العمليه تنفذ بما يسمي الرابط او ال Linker. وتحت نظام التشغيل جنو/لينوكس يوجد برنامج يسمي ب the GNU Linker(ld). وذلك ماسنستخدمه فى ربط الملفات الكائنه.

كما نري بالصوره فإننا نختار اسم الملف التنفيذي من الاختيار -o، وعند تنفيذ الكود مايتم هو عملية خروج او exit فقط، لذلك لايعتبر ذلك الملف التنفيذي له اي وظيفه.
وعند تحديد نوع الملف التنفيذي ايضا نجده من نوع ELF.
فى النهايه حتي لايختلط الامر عليكم. يوجد فرق بين تنفيذ كود لغه التجميع على الانظمه المختلفه. لان ليست جميع النظم تتعامل مع الذاكره بنفس الطريقه، ولا تتعامل مع استدعاءات النظام ايضا بنفس الطريقة. وايضا هنالك فرق بين تنفيذ كود لغه تجميع من خلال نظام تشغيل وتنفيذه على الماكينه مباشرة. لذا الطريقه التى وضحتها بالاعلي تصلح للنظام جنو/لينوكس فقط.
لمن لم يستطع ان يتابع السلسله منذ البدايه.
Into the Low Level: Memory Addressing (0x01)
Into the Low Level: VM86 and Real-Mode support(0x02)
Into the Low Level: Registers(0x03)
Into the Low Level: Assembling (0x04)