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-битное значениеСравнительная таблица:
| Директива | Размер | Диапазон | Используемый регистр |
|---|---|---|---|
db | 1 байт | от 0 до 255 | al |
dw | 2 байта | от 0 до 65 535 | ax |
dd | 4 байта | от 0 до 4 294 967 295 | eax |
Как использовать двойное слово в вашем коде:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; Загрузить значение в eax
add eax, 10000 ; eax становится равным 60000
mov [myNumber], eax ; Сохранить обратноВажное правило:
| Правило | Объяснение |
|---|---|
Используйте eax для загрузки или сохранения | eax — это 32-битный регистр |
Задание
ЛегкоСоздайте двойное слово с именем 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