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

dq - تعريف Quad Word

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

ينشئ dd 4 بايتات من البيانات. لكنك تحتاج أحيانًا إلى أعداد أكبر أو عناوين ذاكرة. ولهذا تستخدم dq: تعريف كلمة رباعية.

الكلمة الرباعية 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

كيفية استخدام كلمة رباعية في شفرتك:

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      ; يخزن عنوان message

قاعدة مهمة:

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

التحدي

سهل

أنشئ كلمة رباعية باسم 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:
    ; حمّل قيمة الكلمة الرباعية في rax
    mov rax, [universe_age]
    
    ; حوّل rax إلى سلسلة عشرية
    mov rsi, buffer
    add rsi, 63          ; انتقل إلى نهاية buffer
    mov byte [rsi], 0    ; مُنهي فارغ
    
    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اختبر نفسك

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

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

تدرّب بنفسك: Playground لـ Assembly