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

الرمز $

جزء من قسم الأساسيات في رحلة 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 إلى 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اختبر نفسك

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

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

تدرّب بنفسك: Playground لـ Assembly