عنوان الـ Buffer (rsi)
جزء من قسم الأساسيات في رحلة Assembly على Coddy. الدرس 37 من 45.
في استدعاء النظام write، بعد إخبار نظام التشغيل بالمكان الذي يرسل إليه الناتج (واصف الملف في rdi)، تحتاج إلى إخباره بما يجب طباعته. تفعل ذلك بتمرير address السلسلة النصية في الذاكرة.
السجل الخاص بعنوان المخزن المؤقت هو rsi.
ما هو المخزن المؤقت؟
المخزن المؤقت هو ببساطة كتلة من الذاكرة تحتفظ بـ data. في حالتنا، المخزن المؤقت هو string الذي نريد طباعته.
لماذا address، وليس القيمة نفسها؟
يحتاج write syscall إلى معرفة المكان الذي تبدأ فيه string في الذاكرة. سيقرأ bytes من ذلك address حتى يصل إلى الطول الذي تحدده في rdx. لا ترسل الأحرف الفعلية إلى syscall. بل ترسل موقعها.
مثال:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi يحمل عنوان msgما هو <strong>msg</strong> حقًا:
msg هو تسمية. يستبدلها المُجمِّع بـ number: عنوان الذاكرة address حيث يتم تخزين السلسلة 'Hello'. عند كتابة mov rsi, msg، فإنك تضع number عنوان address هذا في rsi.
ماذا يحدث إذا نسيت العنوان؟
إذا لم تُعيّن rsi، فسيحتوي السجل على أي بيانات عشوائية كانت موجودة فيه من قبل. سيحاول نظام التشغيل القراءة من عنوان ذاكرة عشوائي، ما سيؤدي على الأرجح إلى خطأ في التجزئة (تعطّل).
مثال كامل مع استدعاء النظام write:
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; استدعاء النظام write
mov rdi, 1 ; الخرج القياسي
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تدرّب بنفسك: Playground لـ Assembly