Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استدعاء النظام Exit Syscall (60)

جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 32 من 45.

أهم نداء نظام (syscall) لأي برنامج هو exit. وبدونه، سيستمر برنامجك في العمل إلى الأبد أو سيتعطل عندما يصل إلى نهاية الذاكرة.

رقم نداء النظام exit هو 60.

الصيغة:

mov rax, 60    ; رقم استدعاء النظام للخروج
mov rdi, 0     ; رمز الخروج (0 = نجاح)
syscall        ; اطلب من نظام التشغيل الخروج

ماذا يحدث عندما تقوم بتنفيذ <strong>syscall</strong> بـ <strong>rax = 60</strong>:

  1. ينتقل المعالج (CPU) إلى نواة لينكس (Linux kernel)
  2. ترى النواة: "exit syscall with code 0"
  1. تقوم النواة بإنهاء برنامجك
  2. تعيد النواة التحكم إلى الغلاف (shell) أو نظام التشغيل

رمز الخروج 0 يعني النجاح — اكتمل البرنامج بدون أخطاء. تشير رموز الخروج من 1 إلى 255 إلى أخطاء مختلفة. يمكنك اختيار أي رقم للإشارة إلى الخطأ الذي حدث.

أهمية رموز الخروج:

بعد خروج برنامجك، يقوم الغلاف (الطرفية) بتخزين رمز الخروج. يمكنك التحقق منه باستخدام:

./myprogram
echo $?    ; يطبع رمز الخروج

هذا مفيد لـ:

  • البرامج النصية التي تتحقق مما إذا كان البرنامج قد نجح
  • تصحيح الأخطاء (أكواد مختلفة لأخطاء مختلفة)
  • ربط البرامج معاً

برنامج كامل وبسيط:

section .text
    global _start

_start:
    mov rax, 60    ; syscall الخروج
    mov rdi, 0     ; رمز الخروج 0 (نجاح)
    syscall

هذا البرنامج لا يفعل شيئاً مرئياً — فهو ينتهي بنجاح فقط. ولكنه برنامج صالح وكامل.

دعونا نذكر ما هي global _start و _start:.

الكودما هولماذا تحتاجه
global _startيخبر الرابط (linker) بمكان بدء برنامجكبدونه، لن يعرف الرابط أي تسمية هي نقطة الدخول
_start:تسمية تحدد بداية الكود الخاص بكيبدأ المعالج (CPU) التنفيذ من هنا

لا تحتاج إلى حفظ التفاصيل. فقط اعلم أن كل main.asm يجب أن يحتوي على هذين السطرين قبل الكود الخاص بك. ستستخدمهما في كل برنامج.

ماذا يحدث إذا نسيت استدعاء النظام exit (exit syscall)؟

إذا لم تقم بتضمين استدعاء النظام exit (exit syscall)، فسيستمر المعالج (CPU) في تنفيذ أي بيانات عشوائية (garbage data) تصادف وجودها في الذاكرة بعد الكود الخاص بك. يؤدي هذا عادةً إلى حدوث خطأ في التجزئة (segmentation fault) (انهيار) أو سلوك غير متوقع تماماً. لن ينتهي برنامجك بشكل نظيف.

قم دائماً بإنهاء برنامجك باستخدام exit syscall.

challenge icon

التحدي

أضف syscall الخروج مع رمز الخروج 5.

الكود الخاص بطباعة الرسالة "Exiting with code 5" مقدم لك بالفعل. لا تحتاج لفهمه بعد — سيتم تغطيته في الفصل 5.

مهمتك هي فقط إضافة syscall الخروج في النهاية.

جرّب بنفسك

section .data
    msg db 'Exiting with code 5', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msgLen
    syscall

; TODO: أضف نداء نظام الخروج (exit syscall) مع رمز الخروج 5
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات