عدد البايتات (rdx)
جزء من قسم الأساسيات في رحلة Assembly على Coddy. الدرس 38 من 45.
لقد أخبرت نظام التشغيل بمكان الطباعة (rdi) وما الذي ستطبعه (rsi). والآن تحتاج إلى إخباره بعدد البايتات التي يجب طباعتها.
السجل الخاص بعدد البايتات هو rdx.
لماذا يحتاج نظام التشغيل إلى الطول؟
لا يعرف نظام التشغيل أين تنتهي سلسلتك النصية. ومن دون طول، سيستمر في قراءة الذاكرة إلى الأبد. يخبر الطول نظام التشغيل بالضبط بموعد التوقف.
مثال:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = عدد البايتات المراد طباعتهاماذا يحدث إذا كان length غير صحيح؟
| إذا ضبطت | النتيجة |
|---|---|
| قصير جدًا | تتم طباعة جزء فقط من string |
| طويل جدًا | يواصل نظام التشغيل القراءة بعد string إلى ذاكرة غير صالحة: قد يطبع أحرفًا عشوائية أو يتعطل |
| Zero | لا تتم طباعة أي شيء |
حساب الطول تلقائيًا:
لقد تعلمت already نمط $ - label في الفصل 3:
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 ; استدعاء نظام الكتابة
mov rdi, 1 ; الخرج القياسي
mov rsi, msg ; عنوان السلسلة
mov rdx, msgLen ; عدد البايتات
syscallالتحدي
لديك string تُسمى color وتحتوي على القيمة 'Red' متبوعة بـ newline. تم تعريف ثابت يُسمى colorLen باستخدام $ - color بالفعل.
اكتب سطر التعليمات البرمجية الذي يضبط rdx على طول string باستخدام الثابت 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تدرّب بنفسك: Playground لـ Assembly