dd — определение двойного слова
Часть раздела Основы путешествия по Assembly на Coddy. Урок 26 из 45.
dw создаёт 2 байта данных. Но иногда нужны ещё большие числа. Для этого используется dd: Define Double Word.
double word в ассемблере x86 — это 4 байта (32 бита).
Синтаксис:
label dd valueПримеры:
section .data
myNumber dd 50000 ; 4 байта, значение 50000
bigNum dd 4000000 ; 4 байта, значение 4 миллиона
max32 dd 4294967295 ; Максимальное 32-битное значениеТаблица сравнения:
| Директива | Размер | Диапазон | Используемый регистр |
|---|---|---|---|
db | 1 байт | от 0 до 255 | al |
dw | 2 байта | от 0 до 65,535 | ax |
dd | 4 байта | от 0 до 4,294,967,295 | eax |
Как использовать double word в своём коде:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; Загрузить значение в eax
add eax, 10000 ; eax становится 60000
mov [myNumber], eax ; Сохранить обратноВажное правило:
| Правило | Объяснение |
|---|---|
Используйте eax для загрузки или сохранения | eax — это 32-битный регистр |
Задание
ЛегкоСоздай double word с именем 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-644Определение данных
Секция .datadb — определение байтаdw — определение словаdd — определение двойного словаdq — определение учетверенного словаСтроки с использованием dbСимвол $Итоги: сборка data.asmПотренируйтесь самостоятельно: Песочница Assembly