Типы данных в ассемблере
Данные – числа и закодированные символы, используемые в качестве операндов команд.
Основные типы данных в ассемблере
| Тип | Директива | Количество байт |
| Байт | DB | 1 |
| Слово | DW | 2 |
| Двойное слово | DD | 4 |
| 8 байт | DQ | 8 |
| 10 байт | DT | 10 |
Данные, обрабатываемые вычислительной машиной, можно разделить на 4 группы:
- целочисленные;
- вещественные.
- символьные;
- логические;
Целочисленные данные
Целые числа в ассемблере могут быть представлены в 1-байтной, 2-байтной, 4-байтной или 8-байтной форме. Целочисленные данные могут представляться в знаковой и беззнаковой форме.
Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2n-1, где n- количество занимаемых битов.
Знаковые целые числа представляются в диапазоне -2n-1 … +2n-1-1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).
Вещественные данные
Вещественные данные могут быть 4, 8 или 10-байтными и обрабатываются математическим сопроцессором.
Логические данные
Логические данные представляют собой бит информации и могут записываться в виде последовательности битов. Каждый бит может принимать значение 0 (ЛОЖЬ) или 1 (ИСТИНА). Логические данные могут начинаться с любой позиции в байте.
Символьные данные
Символьные данные задаются в кодах и имеют длину, как правило, 1 байт (для кодировки ASCII) или 2 байта (для кодировки Unicode) .
Числа в двоично-десятичном формате
В двоично-десятичном коде представляются беззнаковые целые числа, кодирующие цифры от 0 до 9. Числа в двоично-десятичном формате могут использоваться в одном из двух видов:
- упакованном;
- неупакованном.

В неупакованном виде в каждом байте хранится одна цифра, размещенная в младшей половине байта (биты 3…0).
Упакованный вид допускает хранение двух десятичных цифр в одном байте, причем старшая половина байта отводится под старший разряд.
Числовые константы
Числовые константы используются для обозначения арифметических операндов и адресов памяти. Для числовых констант в Ассемблере могут использоваться следующие числовые форматы.
Десятичный формат – допускает использование десятичных цифр от 0 до 9 и обозначается последней буквой d, которую можно не указывать, например, 125 или 125d. Ассемблер сам преобразует значения в десятичном формате в объектный шестнадцатеричный код и записывает байты в обратной последовательности для реализации прямой адресации.
a DB 12
Шестнадцатеричный формат – допускает использование шестнадцатеричных цифр от 0 до F и обозначается последней буквой h, например 7Dh. Так как ассемблер полагает, что с буквы начинаются идентификаторы, то первым символом шестнадцатеричной константы должна быть цифра от 0 до 9.
Например, 0Eh.
a DB 0Ch
Двоичный формат – допускает использование цифр 0 и 1 и обозначается последней буквой b. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах (AND, OR, XOR).
a DB 00001100b
Восьмеричный формат – допускает использование цифр от 0 до 7 и обозначается последней буквой q или o, например, 253q.
a DB 14q
Массивы и цепочки
Массивом называется последовательный набор однотипных данных, именованный одним идентификатором.
Цепочка — массив, имеющий фиксированный набор начальных значений.
Примеры инициализации цепочек
M1 DD 0,1,2,3,4,5,6,7,8,9
M2 DD 0,1,2,3
DD 4,5,6,7
DD 8,9
Каждая из записей выделяет десять последовательных 4-байтных ячеек памяти и записывает в них значения 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Идентификатор M1 определяет смещение начала этой области в сегменте данных .DATA.
Для инициализации всех элементов массива одинаковыми значениями используется оператор DUP:
Идентификатор Тип Размер DUP (Значение)
Идентификатор — имя массива;
Тип — определяет количество байт, занимаемое одним элементом;
Размер — константа, характеризующая количество элементов в массиве
Значение — начальное значение элементов.
Например
a DD 20 DUP (0)
описывает массив a из 20 элементов, начальные значения которых равны 0.
Если необходимо выделить память, но не инициализировать ее, в качестве поля Значение используется знак ?. Например,
b DD 20 DUP(?)
Символьные строки
Символьные строки представляют собой набор символов для вывода на экран. Содержимое строки отмечается
- одиночными кавычками », например, ‘строка’
- двойными кавычками «», например «строка»
Символьная строка определяется только директивой DB, в которой указывается более одного символа в последовательности слева направо.
Символьная строка, предназначенная для корректного вывода, должна заканчиваться нуль-символом ‘\0’ с кодом, равным 0.
Str DB ‘Привет всем!’, 0
Для перевода строки могут использоваться символы
- возврат каретки с кодом 13 (0Dh)
- перевод строки с кодом 10 (0Ah).
Stroka DB «Привет», 13, 10, 0
Назад
Назад: Язык ассемблера
|
Новости
Программы Turbo Pascal Игры Документация Странности FAQ Ссылки Форум Гостевая книга Рассылка Благодарности Об авторе
|
Встроенный ассемблер Borland Pascal поддерживает три дирек-
тивы ассемблера: DB (определить байт), DW (определить слово) и DD
(определить двойное слово). |
Какой размер переменной использовать (db, dw, dd) для сборки x86?
Я не знаю, что означают все эти db, dw, dd.
Я попытался написать этот небольшой скрипт, который делает 1+1, сохраняет его в переменной и затем отображает результат. Вот мой код:
.386 .модель плоская, stdcall карта вариантов: нет включить \masm32\include\windows.inc включить \masm32\include\kernel32.inc включить \masm32\include\masm32.inc includelib\masm32\lib\kernel32.lib includelib\masm32\lib\masm32.lib .данные число дБ? ; установить переменную. Вот где я не знаю, какой тип данных использовать. .код Начало: mov eax, 1 ; добавить 1 в регистр eax мов ebx, 1 ; добавить 1 в регистр ebx добавить eax, ebx ; добавить регистры eax и ebx нажать eax ; поместить eax в стек поп номер ; вставьте eax в переменную num (когда я попробовал, это дало мне ошибку, я думаю, это из-за типа данных) вызвать StdOut, номер адреса ; вывести число на консоль. вызвать ExitProcess ; выход конец начало
Мне нужно понять, что означают db, dw, dd и как они влияют на установку и комбинирование переменных и тому подобное.
- переменные
- сборка
- x86
4
Быстрый просмотр,
- БД — Определить байт.
8 бит - DW — определение слова. Обычно 2 байта в типичной 32-битной системе x86
- DD — Определить двойное слово. Обычно 4 байта в типичной 32-разрядной системе x86
Из учебника по сборке x86,
Команда pop удаляет 4-байтовый элемент данных из начала аппаратно-поддерживаемый стек в указанный операнд (т.е. регистр или место в памяти). Сначала он перемещает 4 байта, расположенные в памяти location [SP] в указанный регистр или ячейку памяти, а затем увеличивает SP на 4.
Ваше число равно 1 байту. Попробуйте объявить его с помощью DD , чтобы он стал 4 байта и соответствовал поп семантика.
1
Полный список:
DB, DW, DD, DQ, DT, DDQ и DO (используется для объявления инициализированных данных в выходном файле.)
См.: http://www.tortall.
net/projects /yasm/manual/html/nasm-pseudop.html
Их можно вызывать разными способами: (Примечание: для Visual-Studio — используйте синтаксис «h» вместо «0x», например: не 0x55, а 55h вместо):
дб 0x55 ; просто байт 0x55
БД 0x55,0x56,0x57 ; три байта подряд
дб 'а',0x55 ; символьные константы в порядке
дб 'привет',13,10,'$' ; так же как и строковые константы
дв 0x1234 ; 0x34 0x12
дв 'А' ; 0x41 0x00 (это просто число)
дв 'АВ' ; 0x41 0x42 (символьная константа)
дв 'Азбука'; 0x41 0x42 0x43 0x00 (строка)
дд 0x12345678 ; 0x78 0x56 0x34 0x12
дк 0x1122334455667788 ; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11
ддк 0x112233445566778899aabbccddeeff00
; 0x00 0xff 0xee 0xdd 0xcc 0xbb 0xaa 0x99
; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11
сделать 0x112233445566778899aabbccddeeff00 ; такой же, как предыдущий
дд 1.234567e20 ; константа с плавающей запятой
dq 1.234567e20 ; поплавок двойной точности
дт 1.234567e20 ; поплавок повышенной точности
DT не принимает числовые константы в качестве операндов, а DDQ не принимает в качестве операндов константы с плавающей запятой.
Любой размер больше DD не принимает строки в качестве операндов.
0
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Сборка— Как работает БД? Разве не байты кода вывода ассемблера?
спросил
Изменено 1 год, 11 месяцев назад
Просмотрено 726 раз
До сих пор я изучал, что мы пишем программу на языке ассемблера.
..передаем эту программу на ассемблер, который генерирует машинный код…передают машинный код в устройство записи ПЗУ, которое записывает его в ПЗУ микроконтроллера
Теперь мой вопрос связан с такими директивами, как DB , используется для определения байтов данных.
Как эта директива не будет генерировать машинный код? Чтобы поместить байт в память, должен быть какой-то код … это не может произойти волшебным образом
Эта директива должна сгенерировать что-то, что позже сообщит программе записи ПЗУ, что этот байт данных должен быть помещен по этому адресу.
Помогите пожалуйста я совсем запутался
- сборка
- встроенная
- директива
- машинный код
- 8051
3
Вы правы, псевдоинструкция БД принципиально ничем не отличается от других инструкций. Оба просто выдают несколько байтов на выходе в текущей позиции.
DB — это удобный способ вывода байтов, которые ваша программа не выполняет в виде кода.
Мы называем это «данными». Вы делаете это, помещая данные по адресу, который выполнение никогда не достигнет (например, потому что вы не прыгаете и не проваливаетесь туда).
Вы можете использовать DB для ручного кодирования байтов инструкций, если хотите.
В архитектуре фон Неймана (машина с хранимой программой, где байты инструкций извлекаются из той же памяти, к которой обращаются инструкции загрузки/хранения данных) нет принципиальной разницы между кодом и данными. Разница только в том, где вы его поместите, в отличие от чистой гарвардской архитектуры, где код находится в другом адресном пространстве, чем данные.
(В реальной жизни гарвардские машины, такие как микроконтроллеры AVR, обычно копируют часть программной памяти (ПЗУ) в ОЗУ при запуске, чтобы инициализировать переменные статических данных для чтения и записи, и даже имеют инструкцию «загрузить программную память», чтобы вы могли постоянно искать таблиц в ПЗУ.Так что у вас все равно будет db данные рядом с кодом.
)
Связанные вопросы и ответы, в которых упоминаются инструкции по кодированию вручную с помощью DB (для x86, но концепция одинакова для любой ISA):
- x86 ASM: DD используется в качестве «инструкции»?
- Какая польза от директивы ассемблера .byte в ассемблере gnu?
Все программы требуют данных:
- небольшие константы, такие как 1, обычно могут быть встроены в инструкции машинного кода, которые их используют
- большие константы иногда не соответствуют форме машинного кода, поэтому заходят в данные и ссылаются на код Программы
- часто используют строковые литералы для имен файлов и путей, подсказок и т. д.
- буферы хранения как пространство для чтения пользовательского ввода или из файла
- глобальные переменные, инициализированные нулем или другим значением
- констант с плавающей запятой помещаются в память, поскольку они обычно слишком велики, чтобы поместиться в качестве непосредственной инструкции машинного кода.

Как упоминалось выше, в некоторых случаях данные могут быть встроены в инструкции машинного кода, как так называемые немедленные, краткосрочные для режима немедленной адресации. Но во многих других случаях константы выполняются как данные, на которые ссылается машинный код, а не встроенные в машинный код — адрес данных встроен в машинный код (с использованием определенного режима адресации).
Короче говоря, нам нужно иметь возможность объявлять данные на языке ассемблера точно так же, как мы должны иметь возможность объявлять данные на всех других языках. Кроме того, для программных файлов должен быть способ захватить этот код и его данные.
Если вы маркируете данные, вы можете использовать (сделать ссылку) эту метку в своем коде и данных.
Большинство ассемблеров также имеют понятие отдельных разделов кода и данных. Директива .data (или что-то другое, подходящее для этого ассемблера) укажет ассемблеру собирать последующие объявления данных вместе в раздел данных выходных данных ассемблера и компоновщика.

Каждая из них генерирует данные, со-
ответствующие разделенным запятым операндам, которые следуют за
директивой.
Директива DB генерирует последовательность байт. Каждый опе-
ранд может представлять собой выражение-константу со значением от
-128 до 255, или строку символов любой длины. Выражение-константа
генерирует 1 байт кода, а строки генерируют последовательность
байт со значениями, соответствующим коду ASCII каждого символа.
Директива DW генерирует последовательность слов. Каждый опе-
ранд может представлять собой выражение-константу со значением от
-32768 до 65535, или адресное выражение. Для адресного выражения
встроенный ассемблер генерирует указатель ближнего типа, что есть
слово, содержащие смещения адреса.
Директива DD генерирует последовательность двойных слов.
Каждый операнд может представлять собой выражение-константу со
значением от -2147483648 до 4294967295 или адресное выражение.

Например, Турбо Ассемблер допускает следующее:
ByteVar DB ?
WordVar DW ?
.
.
.
mov al,ByteVar
mov bx,WordVar
Встроенный ассемблер не поддерживает такие описания перемен-
ных. В Borland Pascal единственным видом идентификатора, который
можно определить в операторе встроенного ассемблера, является
метка. Все переменные должны описываться с помощью синтаксиса
Паскаля, и предыдущая конструкция соответствует следующему:
var
ByteVar: Byte;
WordWat: Word;
.
.
.
asm
mov al,ByteVar
mov bx,WordVar
end;
8 бит