Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نداء النظام 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:

  1. تقفز وحدة المعالجة المركزية (CPU) إلى نواة لينكس (Linux kernel)
  2. ترى النواة: "write syscall"
  3. تقرأ rdi (مكان الكتابة)، و rsi (مكان النص)، و rdx (عدد البايتات)
  1. يقوم بطباعة النص على الشاشة
  2. يعيد التحكم إلى برنامجك

تجميع كل ذلك مع سلسلة نصية:

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 ثم يخرج.

challenge icon

التحدي

اكتب برنامجًا يطبع الرسالة "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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات