عنوان الـ Buffer (rsi)
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 37 من 45.
في استدعاء النظام write، بعد إخبار نظام التشغيل بمكان إرسال المخرجات (واصف الملف في rdi)، تحتاج إلى إخباره بماذا سيطبع. تقوم بذلك عن طريق تمرير عنوان السلسلة النصية في الذاكرة.
السجل الخاص بعنوان المخزن المؤقت هو rsi.
ما هو المخزن المؤقت (buffer)؟
المخزن المؤقت (buffer) هو ببساطة كتلة من الذاكرة التي تحتفظ بالبيانات. في حالتنا، المخزن المؤقت هو السلسلة النصية التي نريد طباعتها.
لماذا العنوان، وليس القيمة نفسها؟
يحتاج استدعاء النظام write إلى معرفة مكان بدء السلسلة النصية في الذاكرة. سيقوم بقراءة البايتات من ذلك العنوان حتى يصل إلى الطول الذي حددته في rdx. أنت لا ترسل الأحرف الفعلية إلى استدعاء النظام — بل ترسل موقعها.
مثال:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi يحمل عنوان msgما هو <strong>msg</strong> في الحقيقة:
msg هو عبارة عن تسمية (label). يقوم المجمّع (assembler) باستبداله برقم — وهو عنوان الذاكرة حيث يتم تخزين السلسلة النصية 'Hello'. عندما تكتب mov rsi, msg، فإنك تضع رقم العنوان هذا في rsi.
ماذا يحدث إذا نسيت العنوان؟
إذا لم تقم بتعيين rsi، فسيحتوي السجل (register) على أي بيانات عشوائية كانت موجودة مسبقاً. سيحاول نظام التشغيل القراءة من عنوان ذاكرة عشوائي، مما سيؤدي على الأرجح إلى حدوث خطأ في التجزئة (segmentation fault) (انهيار).
مثال كامل مع استدعاء النظام write:
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; استدعاء النظام write
mov rdi, 1 ; stdout
mov rsi, msg ; عنوان السلسلة النصية
mov rdx, len ; عدد البايتات
syscallالتحدي
لقد تم إعطاؤك سلسلة نصية تسمى greeting بقيمة 'Hi' متبوعة بسطر جديد. اكتب سطر الكود الذي يقوم بتحميل عنوان greeting في rsi.
اكتب فقط تعليمة mov لـ rsi.
جرّب بنفسك
section .text
global _start
_start:
%include "solution.asm"
mov rax, 1
mov rdi, 1
; rsi يحتوي بالفعل على العنوان (من كود الطالب)
mov rdx, greetingLen
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