عدد البايتات (rdx)
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 38 من 45.
لقد أخبرت نظام التشغيل بمكان الطباعة (rdi) وماذا يطبع (rsi). الآن عليك إخباره بعدد البايتات التي سيطبعها.
المسجل الخاص بعدد البايتات هو rdx.
لماذا يحتاج نظام التشغيل إلى الطول؟
لا يعرف نظام التشغيل أين تنتهي السلسلة النصية الخاصة بك. بدون تحديد الطول، سيستمر في قراءة الذاكرة إلى الأبد. يخبر الطول نظام التشغيل متى يتوقف بالضبط.
مثال:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = عدد البايتات المطلوب طباعتهاماذا يحدث إذا كان الطول خاطئاً؟
| إذا قمت بتعيين | النتيجة |
|---|---|
| قصير جداً | تتم طباعة جزء فقط من السلسلة النصية |
| طويل جداً | يستمر نظام التشغيل في القراءة بعد السلسلة النصية الخاصة بك إلى ذاكرة عشوائية (garbage memory) — قد يطبع أحرفاً عشوائية أو يتسبب في تعطل البرنامج |
| صفر | لا يتم طباعة شيء |
حساب الطول تلقائياً:
لقد تعلمت بالفعل نمط $ - label في الفصل الثالث:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + سطر جديد)يضمن ذلك أن يكون الطول صحيحًا دائمًا، حتى لو قمت بتغيير السلسلة النصية.
مثال كامل:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; استدعاء النظام للكتابة (write syscall)
mov rdi, 1 ; المخرج القياسي (stdout)
mov rsi, msg ; عنوان السلسلة النصية
mov rdx, msgLen ; عدد البايتات
syscallالتحدي
لقد تم إعطاؤك سلسلة نصية تسمى color بالقيمة 'Red' متبوعة بسطر جديد. تم تعريف ثابت يسمى colorLen بالفعل باستخدام $ - color.
اكتب سطر الكود الذي يضبط rdx على طول السلسلة النصية باستخدام الثابت colorLen.
اكتب فقط تعليمة mov لـ rdx.
جرّب بنفسك
section .text
global _start
_start:
; كود الطالب يعمل أولاً (يضبط rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx يحتوي بالفعل على الطول (من كود الطالب)
syscall
mov rax, 60
mov rdi, 0
syscallيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)3التعليمة الأولى - MOV
ما هي MOV؟MOV المباشرةMOV من سجل إلى سجلMOV من الذاكرة إلى السجلMOV من السجل إلى الذاكرةLEA - تحميل العنوانMOV بأحجام مختلفةتدريب: تبديل السجلاتملخص: تحدي MOV6نداء النظام Write
نداء النظام Write (1)واصف الملف (rdi)عنوان الـ Buffer (rsi)عدد البايتات (rdx)تجميع الأجزاء معاًطباعة سلسلتين نصيتينأهمية السطر الجديدمراجعة: إعداد Write