نداء النظام Write (1)
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 35 من 45.
أنت تعرف بالفعل كيفية الخروج من البرنامج. لكن الخروج بصمت ليس مفيداً جداً. أنت تريد من برنامجك أن يطبع مخرجات حتى يتمكن المستخدم من رؤية شيء ما.
لذلك، أنت بحاجة إلى استدعاء النظام write.
ما هو استدعاء النظام write؟
يخبر استدعاء النظام write نظام التشغيل بطباعة نص على الشاشة (أو الكتابة إلى ملف). هذه هي الطريقة التي ينتج بها برنامجك المخرجات.
رقم syscall لـ write هو 1.
كيفية عمل write:
على عكس استدعاء النظام exit (الذي يحتاج إلى وسيط واحد فقط)، يحتاج write إلى ثلاثة وسائط:
| الوسيط | المسجل (Register) | ماذا يفعل | مثال |
|---|---|---|---|
| واصف الملف (File descriptor) | rdi | مكان الكتابة (1 = الشاشة) | mov rdi, 1 |
| عنوان المخزن المؤقت (Buffer address) | rsi | مكان وجود النص في الذاكرة | mov rsi, message |
| عدد البايتات | rdx | عدد البايتات المراد طباعتها | mov rdx, 13 |
استدعاء النظام write قيد التنفيذ:
mov rax, 1 ; رقم استدعاء النظام لـ write
mov rdi, 1 ; واصف الملف 1 = stdout (الشاشة)
mov rsi, msg ; عنوان السلسلة النصية المراد طباعتها
mov rdx, 13 ; عدد البايتات المراد طباعتها
syscall ; اطلب من نظام التشغيل الطباعةلطباعة رسالة على الشاشة، نحتاج إلى 5 أسطر. أولاً، نضع رقم syscall وهو 1 في rax للكتابة. ثم نضع 1 في rdi لإخبار نظام التشغيل بالطباعة على الشاشة.
بعد ذلك، نضع عنوان السلسلة النصية (msg) في rsi. بعد ذلك، نضع عدد البايتات (13) في rdx. وأخيرًا، نقوم بتنفيذ syscall لطلب الطباعة من نظام التشغيل.
ماذا يحدث عند تنفيذ write:
- تقفز وحدة المعالجة المركزية (CPU) إلى نواة لينكس (Linux kernel)
- ترى النواة: "write syscall"
- تقرأ
rdi(مكان الكتابة)، وrsi(مكان النص)، وrdx(عدد البايتات)
- يقوم بطباعة النص على الشاشة
- يعيد التحكم إلى برنامجك
تجميع كل ذلك مع سلسلة نصية:
section .data
msg db 'Hello', 0x0a ; سلسلة نصية مع سطر جديد
section .text
global _start
_start:
mov rax, 1 ; استدعاء النظام للكتابة (write syscall)
mov rdi, 1 ; المخرج القياسي (stdout)
mov rsi, msg ; عنوان السلسلة النصية
mov rdx, 6 ; الطول (Hello + سطر جديد = 6 بايت)
syscall
mov rax, 60 ; استدعاء النظام للخروج (exit syscall)
mov rdi, 0
syscallيطبع هذا البرنامج Hello ثم يخرج.
التحدي
اكتب برنامجًا يطبع الرسالة "Hi" متبوعة بسطر جديد. استخدم syscall الخاص بـ write.
السلسلة النصية معرفة بالفعل لك في بيئة الاختبار. تحتاج فقط إلى كتابة إعداد syscall.
جرّب بنفسك
section .data
msg db 'Hi', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; مهام: إعداد واستدعاء نظام الكتابة (write syscall) لطباعة الرسالة
; استخدم rax=1, rdi=1, rsi=msg, rdx=msgLen
; الخروج من البرنامج
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