קריאת מערכת לכתיבה (1)
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 35 מתוך 45.
אתה כבר יודע איך לצאת מתוכנית. אבל יציאה בשקט אינה מועילה במיוחד. אתה רוצה שהתוכנית שלך תדפיס פלט כדי שהמשתמש יוכל לראות משהו.
לשם כך, תצטרך את קריאת המערכת write.
מהי קריאת המערכת write?
קריאת המערכת write אומרת למערכת ההפעלה להציג טקסט על המסך (או לכתוב אותו לקובץ). כך התוכנית שלך מפיקה פלט.
מספר קריאת המערכת עבור write הוא 1.
איך write פועלת:
בניגוד לקריאת המערכת exit (שצריכה ארגומנט אחד בלבד), write צריכה שלושה ארגומנטים:
| ארגומנט | אוגר | מה הוא עושה | דוגמה |
|---|---|---|---|
| מתאר קובץ | rdi | לאן לכתוב (1 = מסך) | mov rdi, 1 |
| כתובת המאגר | rsi | היכן הטקסט נמצא בזיכרון | mov rsi, message |
| מספר הבתים | rdx | כמה בתים להדפיס | mov rdx, 13 |
קריאת המערכת write בפעולה:
mov rax, 1 ; מספר קריאת המערכת עבור write
mov rdi, 1 ; מתאר קובץ 1 = stdout (מסך)
mov rsi, msg ; כתובת המחרוזת להדפסה
mov rdx, 13 ; מספר הבתים להדפסה
syscall ; בקש ממערכת ההפעלה להדפיסכדי להדפיס הודעה על המסך, אנחנו צריכים 5 שורות. ראשית, נשים את מספר קריאת המערכת 1 בתוך rax עבור כתיבה. לאחר מכן נשים 1 בתוך rdi כדי לומר למערכת ההפעלה להדפיס על המסך.
לאחר מכן, נשים את הכתובת של המחרוזת (msg) בתוך rsi. אחרי זה, נשים את מספר הבתים (13) בתוך rdx. לבסוף, נבצע את syscall כדי לבקש ממערכת ההפעלה להדפיס.
מה קורה כשמבצעים את write:
- המעבד קופץ לתוך ליבת Linux
- הליבה רואה: "write syscall"
- היא קוראת את
rdi(לאן לכתוב), אתrsi(היכן נמצא הטקסט) ואתrdx(כמה בתים)
- הוא מדפיס את הטקסט למסך
- הוא מחזיר את השליטה לתוכנית שלך
שילוב הכול עם מחרוזת:
section .data
msg db 'Hello', 0x0a ; מחרוזת עם ירידת שורה
section .text
global _start
_start:
mov rax, 1 ; קריאת מערכת לכתיבה
mov rdi, 1 ; stdout
mov rsi, msg ; כתובת המחרוזת
mov rdx, 6 ; אורך (Hello + ירידת שורה = 6 בתים)
syscall
mov rax, 60 ; קריאת מערכת ליציאה
mov rdi, 0
syscallהתוכנית הזאת מדפיסה Hello ואז מסתיימת.
אתגר
כתבו תוכנית שמדפיסה את ההודעה "Hi" ואחריה תו שורה חדשה. השתמשו בקריאת המערכת write.
המחרוזת כבר מוגדרת עבורכם ברתמת הבדיקות. עליכם לכתוב רק את הגדרת קריאת המערכת.
נסו בעצמכם
section .data
msg db 'Hi', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: להכין ולקרוא לקריאת המערכת write כדי להדפיס את msg
; יש להשתמש ב־rax=1, rdi=1, rsi=msg, rdx=msgLen
; לצאת מהתוכנית
mov rax, 60
mov rdi, 0
syscallהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
3ההוראה הראשונה – MOV
מהו MOV?MOV מיידיMOV מאוגר לאוגרMOV מזיכרון לאוגרMOV מאוגר לזיכרוןLEA – טעינת כתובתMOV בגדלים שוניםתרגול: החלפת אוגריםסיכום: אתגר MOV6קריאת מערכת לכתיבה
קריאת מערכת לכתיבה (1)מתאר קובץ (rdi)כתובת המאגר (rsi)מספר הבתים (rdx)מחברים הכול יחדהדפסת שתי מחרוזותלשורה חדשה יש חשיבותסיכום: הגדרת writeתרגלו בעצמכם: Assembly אונליין