קריאת מערכת ליציאה (60)
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 32 מתוך 45.
קריאת המערכת החשובה ביותר עבור כל תוכנית היא exit. בלעדיה, התוכנית שלך תמשיך לפעול לנצח או תקרוס כשתגיע לסוף הזיכרון.
מספר קריאת המערכת exit הוא 60.
תחביר:
mov rax, 60 ; מספר syscall עבור exit
mov rdi, 0 ; קוד יציאה (0 = הצלחה)
syscall ; בקשה ממערכת ההפעלה לסיים את התוכניתמה קורה כשמריצים <strong>syscall</strong> עם <strong>rax = 60</strong>:
- ה-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 חייבות להופיע שתי השורות האלה לפני הקוד שלך. תשתמש בהן בכל תוכנית.
מה קורה אם שוכחים את קריאת המערכת exit?
אם לא כוללים את קריאת המערכת exit, ה-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 אונליין