Menu
Coddy logo textTech

dq - הגדרת מילה מרובעת

חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 27 מתוך 45.

dd יוצר 4 בתים של נתונים. אבל לפעמים צריך מספרים גדולים עוד יותר או כתובות זיכרון. לשם כך משתמשים ב־dq: הגדרת מילה מרובעת.

מילה בת ארבעה בתים ב-‎x86 assembly‎ היא בגודל 8 בתים (64 סיביות).

תחביר:

label dq value

דוגמאות:

section .data
    myNumber dq 10000000000     ; 8 בתים, ערך של 10 מיליארד
    bigNum   dq 123456789012    ; מספר גדול מאוד
    address  dq msg             ; כתובת הזיכרון של התווית "msg"

טבלת השוואה:

הנחיהגודלטווחאוגר לשימוש
dbבית אחד0 עד 255al
dw2 בתים0 עד 65,535ax
dd4 בתים0 עד 4,294,967,295eax
dq8 בתיםגדול מאוד (2⁶⁴-1)rax

איך להשתמש במילה בת 4 בתים בקוד שלך:

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:
    ; טען את ערך ה־quad word לתוך rax
    mov rax, [universe_age]
    
    ; המר את rax למחרוזת עשרונית
    mov rsi, buffer
    add rsi, 63          ; עבור לסוף החוצץ
    mov byte [rsi], 0    ; תו סיום null
    
    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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: Assembly אונליין