Menu
Coddy logo textTech

קריאת מערכת לכתיבה (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:

  1. המעבד קופץ לתוך ליבת Linux
  2. הליבה רואה: "write syscall"
  3. היא קוראת את rdi (לאן לכתוב), את rsi (היכן נמצא הטקסט) ואת rdx (כמה בתים)
  1. הוא מדפיס את הטקסט למסך
  2. הוא מחזיר את השליטה לתוכנית שלך

שילוב הכול עם מחרוזת:

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 ואז מסתיימת.

challenge icon

אתגר

כתבו תוכנית שמדפיסה את ההודעה "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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: Assembly אונליין