Menu
Coddy logo textTech

הסימן $

חלק מהיחידה יסודות במסלול ה-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', תו שורה חדשה)

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

challenge icon

אתגר

קל

צור מחרוזת בשם 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
quiz iconבחנו את עצמכם

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

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

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