قسم .data
جزء من قسم الأساسيات في رحلة Assembly على Coddy. الدرس 23 من 45.
في الفصل 2، حمّلتَ قيماً من الذاكرة وخزّنتَ قيماً في الذاكرة. لكن من أين جاءت تلك الذاكرة؟ من أنشأ num1 وnum2 وresult؟
الإجابة هي قسم .data. هنا تنشئ بياناتك الخاصة في الذاكرة.
ما هو قسم .data؟
قسم .data هو جزء من برنامج التجميع الذي تعرّف فيه البيانات التي ستُخزَّن في الذاكرة قبل تشغيل برنامجك.
الصياغة:
section .data
; ضع تعريفات البيانات الخاصة بك هنالماذا تحتاج إليه:
| بدون قسم .data | مع قسم .data |
|---|---|
| ليس لديك بيانات للعمل عليها | يمكنك إنشاء أرقام وسلاسل نصية ومتغيرات |
| عناوين الذاكرة غير معروفة | يمكنك استخدام تسميات مثل myNumber أو message |
| لا يمكنك اختبار التعليمات البرمجية | يمكنك تحميل البيانات التي أنشأتها وتخزينها |
مثال بسيط:
section .data
age db 25 ; أنشئ بايت باسم "age" بقيمة 25
price dw 1000 ; أنشئ كلمة باسم "price" بقيمة 1000
name db 'Bob' ; أنشئ سلسلة نصية باسم "name" تتكون من الأحرف B، o، bموضعه في ملفاتك:
تذكّر نمط الملفين من الفصل 0:
| الملف | المحتوى |
|---|---|
data.asm | section .data مع تعريفات بياناتك |
main.asm | %include "data.asm" متبوعًا بـ section .text مع تعليماتك البرمجية |
ما يحدث عند تشغيل برنامجك:
- يحمّل نظام التشغيل برنامجك إلى الذاكرة
- يقرأ قسم
.dataويضع بياناتك في عناوين ذاكرة محددة
- تصبح تسمياتك (
age،price،name) عناوين - يمكن لشفرتك الآن الوصول إلى هذه العناوين باستخدام
[age]،[price]،[name]
قواعد مهمة:
| القاعدة | الشرح |
|---|---|
| احتفظ ببياناتك مجتمعة | يمكنك فتح section .data أكثر من مرة (فالمُجمِّع يضم الأجزاء معًا)، لكن وجود قسم واحد في data.asm أسهل في القراءة |
| يجب أن تكون التسميات فريدة | لا يمكنك استخدام تسميتين باسم age |
| تُنشأ البيانات قبل تشغيل التعليمات البرمجية | تكون جاهزة للاستخدام عند بدء _start |
في الدروس التالية، ستتعلم كيفية تعريف أنواع مختلفة من البيانات باستخدام db وdw وdd وdq
التحدي
اكتب التعليمات البرمجية في الملف data.asm من أجل:
- إنشاء القسم
.data - إنشاء بايت باسم
countوقيمته 5
جرّب بنفسك
%include "data.asm"
section .text
global _start
_start:
; حمّل القيمة من count إلى al
mov al, [count]
; احفظها لطباعتها
mov r12, rax
; حوّلها إلى ASCII واطبعها (0-9 فقط)
add al, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; إنهاء البرنامج
mov rax, 60
mov rdi, 0
syscall
section .bss
digit resb 1يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)تدرّب بنفسك: Playground لـ Assembly