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 עד 255 | al |
dw | 2 בתים | 0 עד 65,535 | ax |
dd | 4 בתים | 0 עד 4,294,967,295 | eax |
dq | 8 בתים | גדול מאוד (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 סיביות |
אתגר
קלצרו מילה בת ארבעה בתים בשם 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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
4הגדרת נתונים
מקטע .datadb - הגדרת ביתdw - הגדרת מילהdd - הגדרת מילה כפולהdq - הגדרת מילה מרובעתמחרוזות עם dbהסימן $סיכום: בניית data.asmתרגלו בעצמכם: Assembly אונליין