استدعاء النظام Exit Syscall (60)
جزء من قسم الأساسيات في رحلة Assembly على Coddy. الدرس 32 من 45.
أهم استدعاء نظام لأي برنامج هو exit. بدونه، سيستمر برنامجك في العمل إلى الأبد أو سيتعطل عندما يصل إلى نهاية الذاكرة.
رقم استدعاء النظام exit هو 60.
البنية:
mov rax, 60 ; رقم استدعاء النظام للخروج
mov rdi, 0 ; رمز الخروج (0 = نجاح)
syscall ; اطلب من نظام التشغيل الخروجما الذي يحدث عند تنفيذ <strong>syscall</strong> مع <strong>rax = 60</strong>:
- تقفز وحدة المعالجة المركزية إلى نواة Linux
- ترى النواة: "exit syscall with code 0"
- تنهي النواة برنامجك
- تعيد النواة التحكم إلى الصدفة أو نظام التشغيل
رمز الخروج 0 يعني النجاح: اكتمل البرنامج دون أخطاء. تشير رموز الخروج من 1 إلى 255 إلى أخطاء مختلفة. يمكنك اختيار أي رقم للإشارة إلى ما حدث من خطأ.
لماذا تُعدّ رموز الخروج مهمة:
بعد انتهاء برنامجك، تخزّن الصدفة (الطرفية) رمز الخروج. يمكنك التحقّق منه باستخدام:
./myprogram
echo $? ; يطبع رمز الخروجهذا مفيد من أجل:
- البرامج النصية التي تتحقق مما إذا كان البرنامج قد نجح
- تصحيح الأخطاء (رموز مختلفة للأخطاء المختلفة)
- ربط البرامج معًا
برنامج كامل ومصغّر:
section .text
global _start
_start:
mov rax, 60 ; استدعاء نظام الخروج
mov rdi, 0 ; رمز الخروج 0 (نجاح)
syscallلا يفعل هذا البرنامج أي شيء مرئي. إنه يخرج بنجاح فحسب. لكنه برنامج صالح ومكتمل.
لنذكر ما هو global _start وما هو _start:.
| الشفرة | ماهيته | سبب حاجتك إليه |
|---|---|---|
global _start | يخبر الرابط بمكان بدء برنامجك | من دونه، لا يعرف الرابط أي تسمية هي نقطة الدخول |
_start: | تسمية تشير إلى بداية شفرتك | يبدأ CPU التنفيذ من هنا |
لا تحتاج إلى حفظ التفاصيل. يكفي أن تعرف أن كل ملف main.asm يجب أن يحتوي على هذين السطرين قبل التعليمات البرمجية الخاصة بك. ستستخدمهما في كل برنامج.
ماذا يحدث إذا نسيت استدعاء syscall الخاص بـ exit؟
إذا لم تُضمّن syscall الخاص بـ exit، فسيستمر CPU في تنفيذ أي بيانات عشوائية تصادف وجودها في الذاكرة بعد التعليمة البرمجية الخاصة بك. وعادةً ما يتسبب ذلك في حدوث خطأ في تقسيم الذاكرة (تعطّل) أو سلوك غير متوقع تمامًا. ولن ينتهي برنامجك بشكل سليم.
أنهِي برنامجك دائمًا باستدعاء نظام للخروج.
التحدي
أضف استدعاء النظام exit مع رمز الخروج 5.
تم توفير التعليمة البرمجية لطباعة الرسالة "Exiting with code 5" لك بالفعل. لا تحتاج إلى فهمها بعد. سيتم تناولها في الفصل 5.
مهمتك الوحيدة هي إضافة استدعاء النظام exit في النهاية.
جرّب بنفسك
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: أضف استدعاء النظام للخروج برمز الخروج 5
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)تدرّب بنفسك: Playground لـ Assembly