Menu
Coddy logo textTech

כתובת המאגר (rsi)

חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 37 מתוך 45.

בקריאת המערכת write, אחרי שאומרים למערכת ההפעלה לאן לשלוח את הפלט (מתאר הקובץ ב־rdi), צריך לומר לה מה להדפיס. עושים זאת על ידי העברת הכתובת של המחרוזת בזיכרון.

אוגר הכתובת של המאגר הוא rsi.

מהו מאגר?

מאגר הוא פשוט אזור בזיכרון שמכיל נתונים. במקרה שלנו, המאגר הוא המחרוזת שאנחנו רוצים להדפיס.

למה כתובת ולא הערך עצמו?

קריאת המערכת write צריכה לדעת היכן המחרוזת מתחילה בזיכרון. היא תקרא בתים מהכתובת הזאת עד שתגיע לאורך שציינת ב-rdx. אינך שולח את התווים עצמם לקריאת המערכת. אתה שולח את המיקום שלהם.

דוגמה:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi מכיל את הכתובת של msg

מה <strong>msg</strong> באמת:

msg היא תווית. האסמבלר מחליף אותה במספר: כתובת הזיכרון שבה מאוחסנת המחרוזת 'Hello'. כשכותבים mov rsi, msg, מכניסים את מספר הכתובת הזה לתוך rsi.

מה קורה אם שוכחים את הכתובת?

אם לא מגדירים את rsi, האוגר מכיל את הערך האקראי שהיה בו קודם. מערכת ההפעלה תנסה לקרוא מכתובת זיכרון אקראית, וסביר להניח שהדבר יגרום לשגיאת פילוח (קריסה).

דוגמה מלאה עם קריאת מערכת write:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; קריאת המערכת write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; כתובת המחרוזת
    mov rdx, len        ; מספר הבתים
    syscall
challenge icon

אתגר

ניתנה לך מחרוזת בשם greeting עם הערך 'Hi' ואחריו שורה חדשה. כתוב את שורת הקוד שטוענת את הכתובת של greeting לתוך rsi.

כתוב רק את הוראת mov עבור rsi.

נסו בעצמכם

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; ב־rsi כבר נמצאת הכתובת (מהקוד של התלמיד)
    mov rdx, greetingLen
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
quiz iconבחנו את עצמכם

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

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

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