Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الرمز $

جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 29 من 45.

عندما تقوم بطباعة سلسلة نصية باستخدام استدعاء النظام write (الفصل 5)، يجب عليك إخبار المعالج (CPU) بعدد البايتات التي سيتم طباعتها.

يمكنك عد الأحرف يدويًا:

message db 'Hello', 0x0a    ; 6 بايت (H e l l o سطر جديد)
mov rdx, 6                  ; عد يدوي

لكن العد اليدوي بطيء وعرضة للخطأ. إذا قمت بتغيير السلسلة النصية، يجب عليك إعادة العد وتحديث الرقم.

الحل: حساب الطول التلقائي باستخدام <strong>$lt;/strong>

$ هو عداد الموقع — وهو يمثل عنوان الذاكرة الحالي حيث سيتم وضع البايت التالي.

المثال 1: سلسلة نصية بسيطة

section .data
    message db 'Hello', 0x0a
    msgLen equ $ - message

كيف يعمل:

  • message هو عنوان البداية (مثال: 1000)
  • بعد تخزين 6 بايت، يصبح $ 1006
  • $ - message = 1006 − 1000 = 6 (الطول)

ملاحظة: equ ترمز لـ equate. إنها تنشئ ثابتاً — اسماً يمثل قيمة.

المثال 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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات