הסימן $
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 29 מתוך 45.
כשמדפיסים מחרוזת באמצעות קריאת המערכת write (פרק 5), צריך לומר למעבד כמה בתים להדפיס.
אפשר לספור את התווים באופן ידני:
message db 'Hello', 0x0a ; 6 בתים (H e l l o ירידת שורה)
mov rdx, 6 ; ספירה ידניתאבל ספירה ידנית היא איטית ומועדת לטעויות. אם תשנה את המחרוזת, תצטרך לספור מחדש ולעדכן את המספר.
הפתרון: חישוב אורך אוטומטי באמצעות $
$ הוא מונה המיקום. הוא מייצג את כתובת הזיכרון הנוכחית שבה יוכנס הבייט הבא.
דוגמה 1: מחרוזת פשוטה
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageאיך זה עובד:
messageהיא כתובת ההתחלה (לדוגמה: 1000)- לאחר אחסון של 6 בתים,
$הופך ל־1006 $ - message= 1006 − 1000 = 6 (האורך)
הערה: equ הוא קיצור של להשוות. הוא יוצר קבוע: שם שמייצג ערך.
דוגמה 2: מחרוזות מרובות
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', תו שורה חדשה)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', תו שורה חדשה)לכל מחרוזת יש אורך משלה, שמחושב אוטומטית. $ מתאפס בכל חישוב, כי הוא תמיד מתייחס למיקום הנוכחי מיד אחרי כל מחרוזת.
אתגר
קלצור מחרוזת בשם city עם הערך 'Paris' ואחריו שורה חדשה (0x0a). לאחר מכן צור קבוע בשם cityLen שמחשב אוטומטית את האורך באמצעות $ - city.
נסו בעצמכם
%include "data.asm"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, city
mov rdx, cityLen
syscall
mov rax, 60
mov rdi, 0
syscallהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
תרגלו בעצמכם: Assembly אונליין