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