Данные – числа и закодированные символы, используемые в качестве операндов команд.
Основные типы данных в ассемблере
Тип | Директива | Количество байт |
Байт | 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. Ассемблер сам преобразует значения в десятичном формате в объектный шестнадцатеричный код и записывает байты в обратной последовательности для реализации прямой адресации.
Шестнадцатеричный формат – допускает использование шестнадцатеричных цифр от 0 до F и обозначается последней буквой h, например 7Dh. Так как ассемблер полагает, что с буквы начинаются идентификаторы, то первым символом шестнадцатеричной константы должна быть цифра от 0 до 9. Например, 0Eh.
Двоичный формат – допускает использование цифр 0 и 1 и обозначается последней буквой b. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах (AND, OR, XOR).
Восьмеричный формат – допускает использование цифр от 0 до 7 и обозначается последней буквой q или o, например, 253q.
Массивы и цепочки
Массивом называется последовательный набор однотипных данных, именованный одним идентификатором.
Цепочка - массив, имеющий фиксированный набор начальных значений.
Примеры инициализации цепочек
M2 DD 0,1,2,3
Каждая из записей выделяет десять последовательных 4-байтных ячеек памяти и записывает в них значения 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Идентификатор M1 определяет смещение начала этой области в сегменте данных .DATA.
Для инициализации всех элементов массива одинаковыми значениями используется оператор DUP:
Идентификатор Тип Размер DUP (Значение)
Идентификатор - имя массива;
Тип - определяет количество байт, занимаемое одним элементом;
Размер - константа, характеризующая количество элементов в массиве
Значение - начальное значение элементов.
Например
описывает массив a из 20 элементов, начальные значения которых равны 0.
Если необходимо выделить память, но не инициализировать ее, в качестве поля Значение используется знак ?. Например,
Символьные строки
Символьные строки представляют собой набор символов для вывода на экран. Содержимое строки отмечается
- одиночными кавычками '', например, 'строка'
- двойными кавычками "", например "строка"
Символьная строка определяется только директивой DB, в которой указывается более одного символа в последовательности слева направо.
Символьная строка, предназначенная для корректного вывода, должна заканчиваться нуль-символом '\0' с кодом, равным 0.
Для перевода строки могут использоваться символы
- возврат каретки с кодом 13 (0Dh)
- перевод строки с кодом 10 (0Ah).
Унес себе на сайт, со ссылкой, конечно же. Ну я бы сделал пост на 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" — пропущена "С" между словами массива и одинаковыми? или я ошибаюсь?
Инициализация значениями. Ничего не пропущено
Не пойму, к чему это и что это:
a DB 12, a DB 0Ch, a DB 00001100b, a DB 14q
Варианты задания начального значения 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. Если этого не сделать, то при выводе после содержимого строки будет выведено всё содержимое памяти, пока не встретится завершающий нуль-символ.