Разное

Ассемблер db: Данные в ассемблере

Типы данных в ассемблере

 

Данные – числа и закодированные символы, используемые в качестве операндов команд.
Основные типы данных в ассемблере

ТипДирективаКоличество байт
БайтDB1
СловоDW2
Двойное словоDD4
8 байтDQ8
10 байтDT10

Данные, обрабатываемые вычислительной машиной, можно разделить на 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, всегда запи- сываются в сегмент кода, аналогично коду, генерируемому другими операторами встроенного ассемблера. Чтобы сгенерировать инициали- зированные или неинициализированные данные в сегменте данных, вам следует использовать обычные описания Паскаля типа var или const. Приведем некоторые примеры директив DB, DW и DD: asm DB 00FH { 1 байт } DB 0,99 { 2 байта } DB 'A' { Ord('A) } DB 'Пример',0DH,OAH { строка, за которой следуют возврат каретки и перевод строки } B.
Pascal 7 & Objects/LR - 416 - DB 12,"Borland Pascal" { строка Паскаля } DW 0FFFFH { 1 слово } DW 0,9999 { 2 слова } DW 'A' { эквивалентно DB 'A',0 } DW 'BA' { эквивалентно DB 'A','B' } DW MyVar { смещение MyVar } DW MyProc { смещение MyProc } DD 0FFFFFFFH { 1 двойное слово } DD 0,99999999 { 2 двойных слова } DD 'A' { эквивалентно DB 'A',0,0,0 } DD 'DBCA' { эквивалентно DS 'A','B','C','D' } DD MyVar { указатель на MyVar } DD MyProc { указатель на MyProc } end; В Турбо Ассемблере, когда перед идентификатором указывается DB, DW или DD, это приводит к генерации в том месте, где указана директива, переменной размером в байт, слово или двойное слово.
Например, Турбо Ассемблер допускает следующее: 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;

Какой размер переменной использовать (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 (или что-то другое, подходящее для этого ассемблера) укажет ассемблеру собирать последующие объявления данных вместе в раздел данных выходных данных ассемблера и компоновщика.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *