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

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Ассемблер 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

С помощью этих директив можно определить новые команды, которые будут выводить определенный код.

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

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