dq - تعريف Quad Word
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 27 من 45.
dd ينشئ 4 بايتات من البيانات. ولكن في بعض الأحيان قد تحتاج إلى أرقام أكبر أو عناوين ذاكرة. لهذا الغرض، تستخدم dq — Define Quad Word.
الـ quad word في لغة تجميع x86 هي 8 بايت (64 بت).
الصيغة:
label dq valueأمثلة:
section .data
myNumber dq 10000000000 ; 8 بايت، القيمة 10 مليار
bigNum dq 123456789012 ; رقم كبير جداً
address dq msg ; عنوان الذاكرة للتسمية "msg"جدول مقارنة:
| التوجيه | الحجم | النطاق | المسجل المستخدم |
|---|---|---|---|
db | 1 بايت | 0 إلى 255 | al |
dw | 2 بايت | 0 إلى 65,535 | ax |
dd | 4 بايت | 0 إلى 4,294,967,295 | eax |
dq | 8 بايت | كبير جداً (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 بت |
التحدي
سهلقم بإنشاء 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4تعريف البيانات
قسم .datadb - تعريف Bytedw - تعريف Worddd - تعريف Double Worddq - تعريف Quad Wordالسلاسل النصية باستخدام dbالرمز $ملخص: بناء data.asm2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)