الرمز $
جزء من قسم الأساسيات في رحلة 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', سطر جديد)لكل سلسلة طولها الخاص الذي يُحسَب تلقائيًا. يُعاد ضبط $ لكل عملية حساب، لأنه يشير دائمًا إلى الموضع الحالي مباشرةً بعد كل سلسلة.
التحدي
سهلأنشئ سلسلة نصية تُسمى 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)تدرّب بنفسك: Playground لـ Assembly