Menu
Coddy logo textTech

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

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

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

Слово в ассемблере x86 составляет 2 байта (16 бит).

Синтаксис:

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 до 65 535dw 32000
Смещение памяти (16-битное)от 0 до 65 535dw 0x7FFF

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

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

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

Так как слово занимает 2 байта, вы используете 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 байтот 0 до 255al
dw2 байтаот 0 до 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:
    ; Загрузить значение word в 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Проверьте себя

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

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