קריאת מערכת ליציאה (60)
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 32 מתוך 45.
קריאת המערכת החשובה ביותר עבור כל תוכנית היא exit. בלעדיה, התוכנית שלך תמשיך לפעול לנצח או תקרוס כשתגיע לסוף הזיכרון.
מספר קריאת המערכת exit הוא 60.
תחביר:
mov rax, 60 ; מספר syscall עבור exit
mov rdi, 0 ; קוד יציאה (0 = הצלחה)
syscall ; בקשה ממערכת ההפעלה לסיים את התהליךמה קורה כשמבצעים syscall עם rax = 60:
- ה-CPU קופץ אל ליבת Linux
- הליבה רואה: "exit syscall with code 0"
- הליבה מסיימת את התוכנית שלך
- הליבה מחזירה את השליטה למעטפת או למערכת ההפעלה
קוד יציאה 0 מציין הצלחה: התוכנית הסתיימה ללא שגיאות. קודי יציאה 1 עד 255 מציינים שגיאות שונות. אפשר לבחור כל מספר כדי לסמן מה השתבש.
למה קודי יציאה חשובים:
לאחר שהתוכנית שלך מסתיימת, המעטפת (המסוף) שומרת את קוד היציאה. אפשר לבדוק אותו באמצעות:
./myprogram
echo $? ; Prints the exit codeהדבר שימושי עבור:
- סקריפטים שבודקים אם תוכנית הצליחה
- ניפוי שגיאות (קודים שונים לשגיאות שונות)
- שרשור תוכניות זו לזו
תוכנית מינימלית מלאה:
section .text
global _start
_start:
mov rax, 60 ; קריאת מערכת לסיום התוכנית
mov rdi, 0 ; קוד יציאה 0 (הצלחה)
syscallהתוכנית הזאת לא עושה שום דבר שנראה לעין. היא פשוט מסתיימת בהצלחה. אבל זו תוכנית תקינה ושלמה.
בואו נציין מה הם global _start ו-_start:.
| קוד | מה זה | למה צריך את זה |
|---|---|---|
global _start | מציין למקשר היכן התוכנית שלך מתחילה | בלעדיו, המקשר לא יודע איזו תווית היא נקודת הכניסה |
_start: | תווית שמסמנת את תחילת הקוד שלך | ה-CPU מתחיל לבצע את הקוד כאן |
אין צורך לשנן את הפרטים. רק צריך לדעת שבכל main.asm חייבות להופיע שתי השורות האלה לפני הקוד שלך. תשתמש בהן בכל תוכנית.
מה קורה אם שוכחים את קריאת המערכת ליציאה?
אם לא כוללים את קריאת המערכת ליציאה, ה-CPU ימשיך לבצע כל נתון זבל שנמצא במקרה בזיכרון אחרי הקוד שלך. בדרך כלל הדבר גורם לשגיאת פילוח (קריסה) או להתנהגות בלתי צפויה לחלוטין. התוכנית שלך לא תסתיים בצורה מסודרת.
תמיד סיים את התוכנית שלך בקריאת מערכת ליציאה.
אתגר
הוסף את קריאת המערכת ליציאה עם קוד יציאה 5.
הקוד להדפסת ההודעה "Exiting with code 5" כבר מסופק לך. אינך צריך להבין אותו עדיין. הוא יילמד בפרק 5.
עליך רק להוסיף את קריאת המערכת ליציאה בסוף.
נסו בעצמכם
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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
תרגלו בעצמכם: Assembly אונליין