الدرس 1 من 8

قراءة الأسمبلي

هدف الدرس

تتبّع المسجّلات سطرًا سطرًا

01

الشرح

المعالج لا يقرأ Python ولا C، بل أوامر مرمَّزة بايتات. والأسمبلي (assembly) هو الصورة المقروءة لهذه الأوامر، كل سطر فيه أمر واحد. فحين تحلّل برنامجًا لا تملك شفرته المصدرية تقرؤه بالأسمبلي، وأوّل مهارة تحتاجها أن تقرأ دالة صغيرة وتعرف ما تحسبه.

نكتب الأسمبلي هنا بصيغة Intel، وهي ما تعرضه أدوات التحليل مثل Ghidra وIDA وx64dbg. وفيها يُكتب الأمر هكذا: اسمه، ثم الوجهة، ثم المصدر، والناتج يُحفظ في الوجهة. فالسطر add eax, edi معناه eax = eax + edi. والمسجّلات (registers) خانات صغيرة سريعة داخل المعالج، والدالة تستقبل وسيطها الأوّل في edi وتضع ناتجها في eax قبل أن تعود. والاسمان edi وeax هما النصف الأدنى من المسجّلين الكاملين rdi وrax، أي 32 بتًا من 64.

وهناك صيغة أخرى اسمها AT&T تعرضها أدوات لينكس مثل objdump وgdb افتراضيًّا، وفيها ينعكس الترتيب فيأتي المصدر قبل الوجهة، وتسبق المسجّلَ علامة % والعددَ علامة $. فالأمر نفسه يُكتب فيها هكذا:

Intel   add eax, edi      eax = eax + edi
AT&T    add %edi, %eax    eax = eax + edi

فإن فتحت ملفًّا بـ objdump فأضف -M intel لتراه بالصيغة التي نقرؤها هنا.

  • الأمر mov a, b ينسخ، أي a = b.
  • الأمر add a, b يجمع، أي a = a + b.
  • الأمر sub a, b يطرح، أي a = a - b.
  • الأمر ret يعود من الدالة، وناتجها ما في eax.

وهذه دالة صغيرة كما يُخرجها المترجِم (compiler)، والتعليق بعد الفاصلة المنقوطة يتتبّع قيمة eax:

f:
  mov  eax, edi   ; eax = x
  add  eax, eax   ; eax = x + x
  add  eax, edi   ; eax = (x + x) + x
  ret

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

f:
  lea  eax, [rdi + rdi*2]   ; eax = x + x*2 = 3*x
  ret

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

02

المطلوب

اكتب الدالة f(x) في Python بحيث تُرجع ما تُرجعه دالة الأسمبلي أعلاه لأي عدد صحيح x، سالبًا كان أو موجبًا.

الفحوص

4 فحوص
  1. الدالة f تُرجع 15 للقيمة 5
  2. الدالة f تُرجع صفرًا للصفر
  3. الدالة f تكافئ شفرة الأسمبلي على أعداد كثيرة منها السالبة
  4. الدالة f على قيمة كبيرة
03

تلميحات

0/3
دروس المسارأتممت 0 من 8

اقرأ الأسمبلي واصطلاح الاستدعاء وتدفّق التحكّم، وابنِ لآلة صغيرة مفكّكًا ومحاكيًا، ثم رقّع بايتاتها وتحقّق من سلامتها.

مستواه متوسّط، وفيه 8 دروس مجموع مدّتها ساعتان.

main.py
المخرجاتPython (Pyodide)

نحمّل بيئة Python الآن. يحدث هذا مرّة واحدة فقط، ثم يحفظها متصفّحك.

–/4

يبدأ الفحص حين تجهز البيئة.

تجد 4 فحوص في بطاقة «المطلوب».

دروس المسارأتممت 0 من 8

اقرأ الأسمبلي واصطلاح الاستدعاء وتدفّق التحكّم، وابنِ لآلة صغيرة مفكّكًا ومحاكيًا، ثم رقّع بايتاتها وتحقّق من سلامتها.

مستواه متوسّط، وفيه 8 دروس مجموع مدّتها ساعتان.