استدعاء النظام 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>:
- ينتقل المعالج (CPU) إلى نواة لينكس (Linux kernel)
- ترى النواة: "exit syscall with code 0"
- تقوم النواة بإنهاء برنامجك
- تعيد النواة التحكم إلى الغلاف (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.
التحدي
أضف 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)