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

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

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

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

Назад

30 комментариев к “Типы данных в ассемблере”

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

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

      1. Маргарита

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

  2. Алексей

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

    1. Елена

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

  3. Алексей

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

    1. Елена

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

  4. Владимир

    Здравствуйте!
    Объясните, если возможно, следующую ситуацию.
    В Интернете попадается подобная информация:
    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", вариант, когда вся строка заключена в апострофы, не проходит?
    Какое влияние в данном случае оказывают апострофы?

    1. Елена Вставская

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

  5. Мистер-Твистер

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

    1. Елена Вставская

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

  6. Сергей

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

  7. Владимир

    А объясните пожалуйста, в чем разница между символами "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

    1. Елена Вставская

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

      1. Владимир

        Сдается мне, что, что-то здесь не так! Не совсем верное объяснение, или наоборот — совсем НЕВЕРНОЕ! В своем примере, я выложил строку, обозначающую путь к файлу (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) и $ в конце строки????

        1. Елена Вставская

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

  8. Анатолий

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

    1. Владимир

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

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

    1. Елена Вставская

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

  10. richard void

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

  11. Антонина

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

    1. Елена Вставская

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

      1. Антонина

        Спасибо, Елена.

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

        Скажите, я все правильно поняла?

        1. Елена Вставская

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

Оставьте комментарий

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

Прокрутить вверх