dw — определение слова
Часть раздела Основы путешествия по Assembly на Coddy — урок 25 из 45.
db создает один байт данных. Но иногда вам нужно хранить более крупные числа, которые не помещаются в один байт (0-255). Для этого вы используете dw — Define Word.
Слово в ассемблере x86 составляет 2 байта (16 бит).
Синтаксис:
label dw valuelabel— имя, которое вы даете этому адресу памятиdw— директива Define Wordvalue— число для хранения (от 0 до 65 535)
Примеры:
section .data
smallNum dw 1000 ; 2 байта, значение 1000
bigNum dw 65535 ; 2 байта, максимальное значение (все биты 1)
price dw 499 ; 2 байта, значение 499Что можно сохранить в одном слове (2 байта):
| Тип | Диапазон | Пример |
|---|---|---|
| Малое или среднее число | от 0 до 65 535 | dw 32000 |
| Смещение памяти (16-битное) | от 0 до 65 535 | dw 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
| Директива | Размер | Диапазон | Используемый регистр |
|---|---|---|---|
db | 1 байт | от 0 до 255 | al |
dw | 2 байта | от 0 до 65 535 | ax |
Задание
ЛегкоСоздайте слово с именем 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-644Определение данных
Секция .datadb — определение байтаdw — определение словаdd — определение двойного словаdq — определение учетверенного словаСтроки с использованием dbСимвол $Итоги: сборка data.asm