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

Язык ассемблера / Типы данных в ассемблере

 

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

Тип Директива Количество байт
Байт 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

Назад


Назад: Язык ассемблера

Комментариев к записи: 33

  • hello db "D.o.l.g.e.n.k.o A.l.i.n.a$" Получается по такой логике у меня массив из 26 элементов занимает 26 байт,но длина самой строки 25 символов и 25 байт.Но если я говорю о том,что сколько памяти занимает эта переменная,то правильный ответ 26 байт.

  • Унес себе на сайт, со ссылкой, конечно же. Ну я бы сделал пост на 200 страниц, с лирическими отступлениями, ссылками на историю информатики, и т.д. А дети ныне читать большие посты обычно не могут. Спасибо!

    • с ссылкой, это во-первых, а во-вторых, когда ты сидишь на экзе и ищешь нужный ответ на вопрос, то большие посты с ведрами воды никому не сдались. Не знаю, чем вы там гордитесь своими огромными постами, если аудиторию будет привлекать короткое и понятное объяснение.

      • Маргарита
        Егор, во-первых, СО ссылкой, учим правила по русскому, а не пишем бред. Во -вторых, то, что вы не готовитесь к экзамену и сидите ответы ищите, это ваши проблемы. Аудиторию привлекает полнота информации в статье, а не краткие ответы для неучей, не готовящихся к экзаменам. Не для поиска ответа на экзамене эти статьи создаются.Так что не надо приписывать свое ошибочное мнение всем.

  • Алексей
    Подскажите, пожалуйста, когда смещение в сегменте будет равно смещению в массиве? Спасибо.

    • Когда начало массива совпадает т с началом сегмента. Странный вопрос, не понимаю, как он возник и где это может использоваться

  • Алексей
    Здравствуйте, помогите с ответом на вопрос. Как программисты при программировании на языке Ассемблера отличают знаковые и без знаковые целые числа? Спасибо.

    • Ассемблер даёт возможность выделить только требуемое количество байт для переменной. Есть также отдельные команды для работы со знаковыми и беззнаковыми переменными. Например, MUL - умножение беззнаковых чисел, IMUL - умножение чисел со знаком.

  • Владимир
    Здравствуйте! Объясните, если возможно, следующую ситуацию. В Интернете попадается подобная информация: String db "ASM" Тоже самое: String db 'A' Db "S" Db "M" Нечто подобное я проделал с директивой dw (и dd) Message dw 'H','e','l','l','o',',',' ','w','o','r','l','d','!','$' Строка "Hello, world!" – выводится (с промежутками между символами), оно понятно – второй байт возле каждого символа, отображен нулями. Но, при попытке оформить следующий вариант (якобы "тоже самое"):- вся строка заключена в апострофы: Message dw "Hello, world!$" – появляется сообщение об ошибке "error A2084: constant value too large". Почему для директивы "db", проходит вариант написания как всей строки заключенной в апострофы, так и вариант заключения в апострофы каждого символа в отдельности? А для директивы "dw", вариант, когда вся строка заключена в апострофы, не проходит? Какое влияние в данном случае оказывают апострофы?

    • Елена Вставская
      Строка - это последовательность байтов. Заключённую в апострофы строку транслятор автоматически преобразует в последовательность байтов и присваивает начало строки переменной слева от db. В случае с 2-байтным типом транслятор не может однозначно преобразовать строку в последовательность байтов. Возможно, это зависит от используемого транслятора.

  • Мистер-Твистер
    @Для инициализации всех элементов массива одинаковыми значениями используется оператор DUP" - пропущена "С" между словами массива и одинаковыми? или я ошибаюсь?


    • Елена Вставская
      Варианты задания начального значения 12 для переменной a длиной 1 байт

  • А можно ли создать массив из меток? Или из адресов, на которые эти метки указывают?

  • Владимир
    А объясните пожалуйста, в чем разница между символами "0" и "$" в конце строки. Если я правильно понимаю (про символ $), выводится будет все, пока не встретится символ $. Вы же говорите, по сути, тоже самое про символ ноль (0). Вот выдержка из вашего комментария (30.03.2017 в 22:45):
    value1 DB "Утро",0 Кроме того, строку принято заканчивать нуль-символом - символом с кодом, равным 0. Если этого не сделать, то при выводе после содержимого строки будет выведено всё содержимое памяти, пока не встретится завершающий нуль-символ.
    Возьмем для сравнения объявление переменных (строки):
    Message db 'Hello, Wold!$'
    и
    File_name db 'C:\myfile.txt',0
    или строку из вашего примера
    value1 DB "Утро",0

    • Елена Вставская
      Доллар используется в качестве конца строки в ассемблере MS-DOS.
      В 32-разрядной системе строки заканчиваются нулем (или нуль-символом, что одно и то же).

      • Владимир
        Сдается мне, что, что-то здесь не так! Не совсем верное объяснение, или наоборот - совсем НЕВЕРНОЕ! В своем примере, я выложил строку, обозначающую путь к файлу (File_name db 'C:\myfile.txt',0)и все это происходит в DOS-ассемблере, при открытии файла. Не пробовал, но, уверен, что эффект от ввода строки типа (File_name db 'C:\myfile.txt $') будет вывод сообщения об ошибке! Разница, видна, символ ноль (0) стоит за закрывающим апострофом, а символ $ - стоит перед закрывающим апострофом. Сообщения не было, но отладчик поднял флаг CF, что означает нет такого файла (по пути)- C:\myfile.txt При записи же File_name db 'C:myfile.txt',0 - флаг CF равен нулю, что означает, есть такой файл (я его открывал, и он открыт). Так в чем разница между символами ноль (0) и $ в конце строки????

        • Елена Вставская
          У Вас отладчик работает в 32-разрядной системе, поэтому строку с долларом на конце воспринимает некорректно. Если хотите разобраться - напишите простенькую программу для DOS, поставьте для нее ассемблер, откомпилируйте и запустите.
          Доллар является символом, поэтому записывается в конце строки в кавычках или апострофах. Символ с кодом 0 в апострофы включить невозможно, иначе это будет соответствовать символу с цифрой 0 на клавиатуре. Поэтому он записывается в конце строки после кавычек через запятую и занимает следующую ячейку памяти после строки.

  • Анатолий
    Бредятина... не тот ассемблер. Описан Intel, который нафик не нужен. Далее типы данных ограничены 10-ти байтными числами... Уже давно используются 16-ти байтные.... Лет 10 а может больше. Устарело! И главное в ассемблере... нет ничего хуже описания языка который давно устарел. А ассемблер всегда новый. Должен быть. Потому что когда у нас не хватает возможностей языка мы прибегаем к ассемблеру. В том числе по самым передовым возможностям. нам же предлагают откатиться на десятилетия назад... Тогда всё это не стоит и выеденного яйца!

    • Владимир
      Не совсем понятно что вы имеете ввиду под intel ассемблером. Есть ассемблер для x86, AMD64 аналог у intel EM64T архитектур, есть для RISC процессоров ARM. Это самые популярные. Тут описан для x86 архитектуры, совместимый с AMD64. Есть разные синтаксисы тут intel синтаксис. Для ARM архитектуры более популярен AT&T синтаксис. Хотя сути синтаксис не меняет. P.S. Под тут я имею ввиду этот сайт

  • Для типа данных байт числа +128 и -128 имеют один и тот же код 80h внутримашинного представления, а как система их различает?

    • Елена Вставская
      Число +128 в типе данных байт не представляется. Диапазон представления чисел -128...+127

  • елена вставская вы супер спасибо вам больлошое за все ваши помощи всем людям на земле на этом сайте вы вторя моя мама с(мать тереза)(ммамочка)

  • Антонина
    Помогите, я понять не могу. 1 буква = 1 байт, тогда получается в переменной типа byte может храниться только одна буква, в переменной word - две и так далее? Почему же пишут переменные с любым количеством букв и типом byte? Ведь зарезервированого под byte места хватит лишь на 1 букву.

    • Елена Вставская
      Действительно, 1 байт может хранить только 1 символ или числовое значение в пределах -128...127 (со знаком) или 0...255 (без знака). Если нам необходимо хранить последовательность символов (строку), то это реализуется с помощью массива. Каждый элемент массива представляет собой один символ, а последовательность таких элементов представляет собой строку. Например, Stroka DB "Привет", 13, 10, 0 это массив, состоящий из 9 элементов, каждый из которых содержит 1 байт. Также массивы можно объявлять с использованием ключевого слова DUP

      • Антонина
        Спасибо, Елена. Только начинаю изучать ассемблер, много пока неизвестного  Насколько я поняла с других сайтов, если написать, скажем value1 DWORD "Утро" то при обращении к переменной выдаст "ортУ" вместо "Утро". Поэтому, наверно, в учебнике Ирвина используется только тип BYTE и задание строки именно через массив. Скажите, я все правильно поняла?

        • Елена Вставская
          С точки зрения ассемблера память, конечно, представляет собой набор байтов, и ему без разницы, какие данные там будут храниться. Но всё-таки, лучше хранить строку в виде массива байтов, поскольку таким способом "Вечер" уже не написать :) . Корректно сделать это через массив байтов: value1 DB "Утро",0 Кроме того, строку принято заканчивать нуль-символом - символом с кодом, равным 0. Если этого не сделать, то при выводе после содержимого строки будет выведено всё содержимое памяти, пока не встретится завершающий нуль-символ.

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

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