כתובת המאגר (rsi)
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 37 מתוך 45.
בקריאת המערכת write, אחרי שאומרים למערכת ההפעלה לאן לשלוח את הפלט (מתאר הקובץ ב־rdi), צריך לומר לה מה להדפיס. עושים זאת על ידי העברת הכתובת של המחרוזת בזיכרון.
האוגר עבור כתובת המאגר הוא rsi.
מהו מאגר?
מאגר הוא פשוט בלוק זיכרון שמכיל נתונים. במקרה שלנו, המאגר הוא המחרוזת שאנחנו רוצים להדפיס.
למה הכתובת ולא הערך עצמו?
קריאת המערכת write צריכה לדעת היכן המחרוזת מתחילה בזיכרון. היא תקרא בתים מהכתובת הזאת עד שתגיע לאורך שציינת ב־rdx. לא שולחים את התווים עצמם לקריאת המערכת. שולחים את המיקום שלהם.
דוגמה:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi מכיל את הכתובת של msgמה msg באמת:
msg היא תווית. האסמבלר מחליף אותה במספר: כתובת הזיכרון שבה מאוחסנת המחרוזת 'Hello'. כשכותבים mov rsi, msg, מכניסים את מספר הכתובת הזה לתוך rsi.
מה קורה אם שוכחים את הכתובת?
אם לא מגדירים את rsi, האוגר מכיל כל ערך אקראי שהיה בו קודם. מערכת ההפעלה מנסה לקרוא את המחרוזת מהכתובת הזאת. אם הכתובת אינה תקינה, קריאת המערכת לכתיבה לא מדפיסה דבר, שמה קוד שגיאה ב־rax והתוכנית ממשיכה להוראה הבאה. אם במקרה הערך שנותר הוא הכתובת של זיכרון שניתן לקריאה, קריאת המערכת מדפיסה את כל הבתים ששמורים שם.
דוגמה מלאה עם קריאת המערכת write:
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; קריאת מערכת לכתיבה
mov rdi, 1 ; stdout
mov rsi, msg ; כתובת המחרוזת
mov rdx, len ; מספר הבתים
syscallאתגר
ניתנה לך מחרוזת בשם 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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
3ההוראה הראשונה – MOV
מהו MOV?MOV מיידיMOV מאוגר לאוגרMOV מזיכרון לאוגרMOV מאוגר לזיכרוןLEA – טעינת כתובתMOV בגדלים שוניםתרגול: החלפת אוגריםסיכום: אתגר MOV6קריאת מערכת לכתיבה
קריאת מערכת לכתיבה (1)מתאר קובץ (rdi)כתובת המאגר (rsi)מספר הבתים (rdx)מחברים הכול יחדהדפסת שתי מחרוזותלשורה חדשה יש חשיבותסיכום: הגדרת writeתרגלו בעצמכם: Assembly אונליין