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

dq - تعريف Quad Word

جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 27 من 45.

dd ينشئ 4 بايتات من البيانات. ولكن في بعض الأحيان قد تحتاج إلى أرقام أكبر أو عناوين ذاكرة. لهذا الغرض، تستخدم dqDefine Quad Word.

الـ quad word في لغة تجميع x86 هي 8 بايت (64 بت).

الصيغة:

label dq value

أمثلة:

section .data
    myNumber dq 10000000000     ; 8 بايت، القيمة 10 مليار
    bigNum   dq 123456789012    ; رقم كبير جداً
    address  dq msg             ; عنوان الذاكرة للتسمية "msg"

جدول مقارنة:

التوجيهالحجمالنطاقالمسجل المستخدم
db1 بايت0 إلى 255al
dw2 بايت0 إلى 65,535ax
dd4 بايت0 إلى 4,294,967,295eax
dq8 بايتكبير جداً (2⁶⁴-1)rax

كيفية استخدام الكلمة الرباعية (quad word) في التعليمات البرمجية الخاصة بك:

section .data
    myNumber dq 5000000000

section .text
    mov rax, [myNumber]    ; تحميل القيمة في rax
    add rax, 1000000000    ; يصبح rax 6 مليارات
    mov [myNumber], rax    ; التخزين مرة أخرى

استخدام خاص: تخزين العناوين

dq يُستخدم أيضًا لتخزين عناوين الذاكرة (المؤشرات):

section .data
    message db 'Hello', 0
    pointer dq message      ; يخزن عنوان الرسالة

قاعدة هامة:

القاعدةالشرح
استخدم rax للتحميل أو التخزينrax هو سجل 64 بت
challenge icon

التحدي

سهل

قم بإنشاء quad word يسمى universe_age بالقيمة 13800000000 في قسم .data.

جرّب بنفسك

%include "data.asm"

section .data
    msg db 'universe_age = '
    msg_len equ $ - msg
    newline db 0xa

section .bss
    buffer resb 64

section .text
    global _start

_start:
    ; تحميل قيمة الكلمة الرباعية (quad word) في rax
    mov rax, [universe_age]
    
    ; تحويل rax إلى سلسلة نصية عشرية
    mov rsi, buffer
    add rsi, 63          ; الانتقال إلى نهاية المخزن المؤقت (buffer)
    mov byte [rsi], 0    ; المنهي الصفري (Null terminator)
    
    mov rcx, 10          ; القاسم للتحويل العشري

convert_loop:
    xor rdx, rdx         ; مسح rdx لعملية القسمة
    div rcx              ; قسمة rax على 10، rax = ناتج القسمة، rdx = الباقي
    add dl, '0'          ; تحويل الباقي إلى ASCII
    dec rsi
    mov [rsi], dl        ; تخزين الرقم
    cmp rax, 0
    jnz convert_loop

    ; حفظ مؤشر الرقم وطوله قبل أن يتم تعديلهما
    mov r8, rsi          ; r8 = مؤشر لأول رقم
    mov r9, buffer
    add r9, 63
    sub r9, rsi          ; r9 = عدد الأرقام
    
    ; طباعة الرسالة
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; طباعة الرقم
    mov rax, 1
    mov rdi, 1
    mov rsi, r8
    mov rdx, r9
    syscall
    
    ; طباعة سطر جديد
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; الخروج
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconاختبر نفسك

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

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