מספר הבתים (rdx)
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 38 מתוך 45.
אמרת למערכת ההפעלה היכן להדפיס (rdi) ומה להדפיס (rsi). עכשיו צריך לומר לה כמה בתים להדפיס.
האוגר של מספר הבתים הוא rdx.
למה מערכת ההפעלה צריכה את האורך?
מערכת ההפעלה לא יודעת איפה המחרוזת שלך מסתיימת. בלי אורך, היא תמשיך לקרוא מהזיכרון לנצח. האורך אומר למערכת ההפעלה בדיוק מתי לעצור.
דוגמה:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = מספר הבתים להדפסהמה קורה אם האורך שגוי?
| אם קובעים | תוצאה |
|---|---|
| קצר מדי | רק חלק מהמחרוזת מודפס |
| ארוך מדי | מערכת ההפעלה ממשיכה לקרוא מעבר למחרוזת שלך אל תוך זיכרון זבל: היא עלולה להדפיס תווים אקראיים או לקרוס |
| אפס | לא מודפס דבר |
חישוב אורך אוטומטי:
כבר למדת את התבנית $ - label בפרק 3:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + ירידת שורה)כך מובטח שהאורך תמיד יהיה נכון, גם אם תשנה את המחרוזת.
דוגמה מלאה:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; קריאת מערכת לכתיבה
mov rdi, 1 ; stdout
mov rsi, msg ; כתובת המחרוזת
mov rdx, msgLen ; מספר הבתים
syscallאתגר
נתונה לך מחרוזת בשם color עם הערך 'Red' ואחריה תו שורה חדשה. קבוע בשם colorLen כבר הוגדר באמצעות $ - color.
כתוב את שורת הקוד שמגדירה את rdx לאורך המחרוזת באמצעות הקבוע colorLen.
כתוב רק את הוראת mov עבור rdx.
נסו בעצמכם
section .text
global _start
_start:
; הקוד של התלמיד רץ ראשון (מגדיר את rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; האורך כבר נמצא ב-rdx (מהקוד של התלמיד)
syscall
mov rax, 60
mov rdi, 0
syscallהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
3ההוראה הראשונה – MOV
מהו MOV?MOV מיידיMOV מאוגר לאוגרMOV מזיכרון לאוגרMOV מאוגר לזיכרוןLEA – טעינת כתובתMOV בגדלים שוניםתרגול: החלפת אוגריםסיכום: אתגר MOV6קריאת מערכת לכתיבה
קריאת מערכת לכתיבה (1)מתאר קובץ (rdi)כתובת המאגר (rsi)מספר הבתים (rdx)מחברים הכול יחדהדפסת שתי מחרוזותלשורה חדשה יש חשיבותסיכום: הגדרת writeתרגלו בעצמכם: Assembly אונליין