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"جدول المقارنة:
| التوجيه | الحجم | النطاق | السجل المستخدم |
|---|---|---|---|
db | 1 بايت | 0 إلى 255 | al |
dw | 2 بايت | 0 إلى 65,535 | ax |
dd | 4 بايت | 0 إلى 4,294,967,295 | eax |
dq | 8 بايت | كبير جدًا (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 بت |
التحدي
سهلأنشئ كلمة رباعية باسم 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4تعريف البيانات
قسم .datadb - تعريف Bytedw - تعريف Worddd - تعريف Double Worddq - تعريف Quad Wordالسلاسل النصية باستخدام dbالرمز $ملخص: بناء data.asm2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)تدرّب بنفسك: Playground لـ Assembly