dq — определение учетверенного слова
Часть раздела Основы путешествия по Assembly на Coddy. Урок 27 из 45.
dd создаёт 4 байта данных. Но иногда вам нужны ещё большие числа или адреса памяти. Для этого используется dq: Define Quad Word.
quad word в ассемблере x86 — это 8 bytes (64 бита).
Синтаксис:
label dq valueПримеры:
section .data
myNumber dq 10000000000 ; 8 байт, значение 10 миллиардов
bigNum dq 123456789012 ; Очень большое число
address dq msg ; Адрес памяти метки "msg"Сравнительная таблица:
| Директива | Размер | Диапазон | Регистр для использования |
|---|---|---|---|
db | 1 byte | 0 to 255 | al |
dw | 2 bytes | 0 to 65,535 | ax |
dd | 4 bytes | 0 to 4,294,967,295 | eax |
dq | 8 bytes | Very large (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-битный регистр |
Задание
ЛегкоСоздай 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:
; Загрузить значение четверного слова в rax
mov rax, [universe_age]
; Преобразовать rax в десятичную строку
mov rsi, buffer
add rsi, 63 ; Перейти к концу буфера
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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-644Определение данных
Секция .datadb — определение байтаdw — определение словаdd — определение двойного словаdq — определение учетверенного словаСтроки с использованием dbСимвол $Итоги: сборка data.asmПотренируйтесь самостоятельно: Песочница Assembly