Menu
Coddy logo textTech

dq — определение учетверенного слова

Часть раздела Основы путешествия по Assembly на Coddy — урок 27 из 45.

dd создает 4 байта данных. Но иногда вам нужны еще большие числа или адреса памяти. Для этого вы используете dqDefine Quad Word.

Четверное слово (quad word) в ассемблере x86 — это 8 байт (64 бита).

Синтаксис:

label dq value

Примеры:

section .data
    myNumber dq 10000000000     ; 8 байт, значение 10 миллиардов
    bigNum   dq 123456789012    ; Очень большое число
    address  dq msg             ; Адрес памяти метки "msg"

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

ДирективаРазмерДиапазонИспользуемый регистр
db1 байтот 0 до 255al
dw2 байтаот 0 до 65 535ax
dd4 байтаот 0 до 4 294 967 295eax
dq8 байтОчень большой (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-битный регистр
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Проверьте себя

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

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