Menu
Coddy logo textTech

dw — определение слова

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

db создаёт один байт данных. Но иногда необходимо хранить числа большего размера, которые не помещаются в один байт (0-255). Для этого используется dw: Define Word.

word в ассемблере x86 — это 2 bytes (16 bits).

Синтаксис:

label dw value
  • label: имя, которое вы даёте этому адресу памяти
  • dw: директива Define Word
  • value: число для сохранения (от 0 до 65,535)

Примеры:

section .data
    smallNum dw 1000       ; 2 байта, значение 1000
    bigNum   dw 65535      ; 2 байта, максимальное значение (все биты 1)
    price    dw 499        ; 2 байта, значение 499

Что можно хранить в одном слове (2 байта):

ТипДиапазонПример
Небольшое или среднее число0 to 65,535dw 32000
Смещение памяти (16-битное)0 to 65,535dw 0x7FFF

Несколько слов в одной строке:

section .data
    values dw 100, 200, 300, 400    ; Создаёт 4 слова (всего 8 байт)

Как использовать word в своём коде:

Поскольку word занимает 2 bytes, используется 16-битный регистр ax (а не al):

section .data
    myWord dw 1000

section .text
    mov ax, [myWord]    ; Загрузить значение 1000 в ax
    add ax, 500         ; ax становится 1500
    mov [myWord], ax    ; Сохранить 1500 обратно в myWord

Сравнение: db и dw

ДирективаРазмерДиапазонИспользуемый регистр
db1 byte0 до 255al
dw2 bytes0 до 65,535ax
challenge icon

Задание

Легко

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

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

%include "data.asm"

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

section .bss
    buffer resb 16

section .text
    global _start

_start:
    ; Загрузить значение слова в ax
    mov ax, [population]
    
    ; Преобразовать ax в десятичную строку
    mov rsi, buffer
    add rsi, 15          ; Перейти в конец буфера
    mov byte [rsi], 0    ; Нулевой терминатор
    
    mov cx, 10           ; Делитель для десятичного преобразования
    
convert_loop:
    xor dx, dx           ; Очистить dx для деления
    div cx               ; Разделить ax на 10, ax = частное, dx = остаток
    add dl, '0'          ; Преобразовать остаток в ASCII
    dec rsi
    mov [rsi], dl        ; Сохранить цифру
    cmp ax, 0
    jnz convert_loop

    ; Сохранить указатель на цифру и длину ДО того, как они будут перезаписаны
    mov r8, rsi          ; r8 = указатель на первую цифру
    mov r9, buffer
    add r9, 15
    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Проверьте себя

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

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

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