Типы данных в ассемблере
Данные – числа и закодированные символы, используемые в качестве операндов команд.
Основные типы данных в ассемблере
Тип | Директива | Количество байт |
Байт | 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 генерирует последовательность байт. Каждый опе- ранд может представлять собой выражение-константу со значением от -128 до 255, или строку символов любой длины. Выражение-константа генерирует 1 байт кода, а строки генерируют последовательность байт со значениями, соответствующим коду ASCII каждого символа. Директива DW генерирует последовательность слов. Каждый опе- ранд может представлять собой выражение-константу со значением от -32768 до 65535, или адресное выражение. Для адресного выражения встроенный ассемблер генерирует указатель ближнего типа, что есть слово, содержащие смещения адреса. Директива DD генерирует последовательность двойных слов. Каждый операнд может представлять собой выражение-константу со значением от -2147483648 до 4294967295 или адресное выражение. |
Какой размер переменной использовать (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
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Ассемблер Z80 — Директивы ассемблера
Ассемблер Z80 — Директивы ассемблерадб, дефб, дм или дефм
db означает «определить байт», dm — «определить сообщение». Он позволяет определить
из одного или нескольких литеральных байтов, а также строк байтов. Все определения
должны быть разделены запятыми. Строки байтов должны быть между двойными
кавычки. Пример кода:
метка: equ 20
defb "Это текст", метка / 2, "Это еще текст", 10, 0
дв или дефв
dw означает «определить слово». Это удобная директива для определения
младший значащий байт первые два байтовых слова, как их использует Z80. Несколько
выражения, разделенные запятыми, могут быть указаны. Пример:
org 0x8000
pointertable: defw sub1, sub2
sub1: sub b
ret nz
sub2: ld h,0
ret
дс или деф
ds означает «определить пространство». Он принимает один или два аргумента: , число и вал . Он резервирует num байт пространства и инициализирует их для вал . Если val опущен, по умолчанию используется 0. Пример:
буфер: defs 20
семерки: defs 10, 7
конец
В конце программы разрешено использовать директиву end. Там нет необходимости делать это. Все после этой директивы игнорируется. Это может можно использовать для добавления комментариев в конце.
орг
Устанавливает представление ассемблера о текущем адресе. Требуется один аргумент, который должен оцениваться как значение при первом проходе (он не может использовать метки, которые будут определены позже).
При запуске текущий адрес устанавливается равным 0. Обычно первый директива в программе org, чтобы установить начальный адрес.
Использование этой директивы более одного раза может быть полезно для создания кода, выполняться по тому же адресу, например, при отображении памяти. В начало каждой страницы, код может установить начальный адрес для сопоставления адрес. Ранее определенные страницы не перезаписываются.
Обратите внимание, что эта директива не генерирует никакого кода, поэтому, если байты заполнения
требуется, они должны быть вставлены с помощью defs. Org изменяет только ассемблер
представление о том, «где» оно находится. В следующем примере выходные данные содержат 4 байта:
23, 12, 00, 00. первая_метка: defw вторая_метка
орг 0x1234
вторая_метка: defw первая_метка
искать
Пользователи запросили возможность перезаписать сгенерированный вывод. Это для чего нужен поиск. Он будет искать в выходном файле и начнет перезаписывать предыдущий вывод. Это в основном полезно в сочетании с incbin. Это позволяет включенный двоичный файл должен быть «исправлен».
Если аргумент поиска больше, чем текущий размер вывода, файл расширен нулями.
включает
Как и в C (но без #), включает другой исходный файл. Нет
подстановка вообще делается в имени файла, что означает, что ~ не может быть
используется для ссылки на домашний каталог. Почти любой
имя возможно без escape-символов из-за правил кавычек.
первый непробельный символ после директивы include считается
начальная цитата. Затем имя файла считывается до конечной кавычки, которая
то же, что и начальная цитата. Пример:
включить 'math.asm'
включить -file'с "кавычками".asm-
включить zletter в виде кавычек и пробелов в name.asmz
ящик
Incbin означает «включить двоичный файл». Он позволяет использовать любые двоичные данные. дословно включены в вывод. Аргумент приводится так же, как для включения.
если, иначе, конец
При использовании этих условных операторов части кода могут быть опущены.
остальное можно повторять сколько угодно раз. Код, который не собран,
проверил правильность команды. В противном случае его не трогают, а это значит, что
если вы используете эти директивы, успешное выполнение ассемблера не подразумевает
что весь код правильный. Пример:
org 0x8000
включить "math.asm"
если $ < 0x9000 ; Делайте следующее, только если math.asm достаточно мал
ld a,3
else
ld a,6
else
; это также собирается только в том случае, если math.asm достаточно мал
ld h,8
endif
; это всегда собран
вызов math_init
макрос, endm
С помощью этих директив можно определить новые команды, которые будут выводить определенный код.