الرمز $
جزء من قسم الأساسيات في رحلة 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', سطر جديد)
لكل سلسلة نصية طولها الخاص الذي يتم حسابه تلقائياً. تتم إعادة تعيين $ لكل عملية حسابية لأنه يشير دائماً إلى الموضع الحالي مباشرة بعد كل سلسلة نصية.
التحدي
سهلقم بإنشاء سلسلة نصية تسمى 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)