Menu
Coddy logo textTech

dd — определение двойного слова

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

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

Двойное слово в ассемблере x86 — это 4 байта (32 бита).

Синтаксис:

label dd value

Примеры:

section .data
    myNumber dd 50000        ; 4 байта, значение 50000
    bigNum   dd 4000000      ; 4 байта, значение 4 миллиона
    max32    dd 4294967295   ; Максимальное 32-битное значение

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

ДирективаРазмерДиапазонИспользуемый регистр
db1 байтот 0 до 255al
dw2 байтаот 0 до 65 535ax
dd4 байтаот 0 до 4 294 967 295eax

Как использовать двойное слово в вашем коде:

section .data
    myNumber dd 50000

section .text
    mov eax, [myNumber]    ; Загрузить значение в eax
    add eax, 10000         ; eax становится равным 60000
    mov [myNumber], eax    ; Сохранить обратно

Важное правило:

ПравилоОбъяснение
Используйте eax для загрузки или сохраненияeax — это 32-битный регистр
challenge icon

Задание

Легко

Создайте двойное слово с именем distance и значением 125000 в секции .data.

Попробуйте сами

%include "data.asm"

section .data
    msg db 'distance = '
    msg_len equ $ - msg
    newline db 0xa

section .bss
    buffer resb 32

section .text
    global _start

_start:
    ; Загрузить значение двойного слова в eax
    mov eax, [distance]
    
    ; Преобразовать eax в десятичную строку
    mov rsi, buffer
    add rsi, 31          ; Перейти в конец буфера
    mov byte [rsi], 0    ; Нулевой терминатор
    
    mov ecx, 10          ; Делитель для десятичного преобразования

convert_loop:
    xor edx, edx         ; Очистить edx для деления
    div ecx              ; Разделить eax на 10, eax = частное, edx = остаток
    add dl, '0'          ; Преобразовать остаток в ASCII
    dec rsi
    mov [rsi], dl        ; Сохранить цифру
    cmp eax, 0
    jnz convert_loop

    ; Сохранить указатель на цифру и длину ПЕРЕД тем, как они будут перезаписаны
    mov r8, rsi          ; r8 = указатель на первую цифру
    mov r9, buffer
    add r9, 31
    sub r9, rsi          ; r9 = количество цифр
    
    ; Вывести сообщение
    mov rax, 1
    mov rdi, 1
    mov rdx, msg_len
    mov rsi, msg
    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Проверьте себя

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

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