Menu
Coddy logo textTech

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"

Сравнительная таблица:

ДирективаРазмерДиапазонРегистр для использования
db1 byte0 to 255al
dw2 bytes0 to 65,535ax
dd4 bytes0 to 4,294,967,295eax
dq8 bytesVery 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-битный регистр
challenge icon

Задание

Легко

Создай 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Песочница Assembly