dq — определение учетверенного слова
Часть раздела Основы путешествия по 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 ; Хранит адрес 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