Организация программы на ассемблере типы данных

Типы данных на языке ассемблера и подробные определения данных

Ассемблер распознает набор основных внутренних типов данных (внутренние типы данных) и описывает их типы в соответствии с размером данных (байты, слова, двойные слова и т. Д.), Подписаны ли они, являются ли они целым или действительным числом. Эти типы в значительной степени перекрываются: например, тип DWORD (32-битное целое число без знака) может быть заменен типом SDWORD (32-битное целое число со знаком).

Некоторые люди могут сказать, что программист использует SDWORD, чтобы сообщить читателю, что это значение подписано, но это не обязательно для ассемблера. Ассемблер оценивает только размер операнда. Поэтому, например, программисты могут указывать только 32-разрядные целые числа как типы DWORD, SDWORD или REAL4.

В следующей таблице приведен список всех внутренних типов данных.Символы IEEE в некоторых записях относятся к стандартному формату вещественных чисел, опубликованному IEEE Computer Society.

Ассемблер #1. Типы данных. Системы счисления[LLC]

Типы Применение
BYTE 8-битное целое число без знака, B представляет байт
SBYTE 8-битовое целое число со знаком, S означает знак
WORD 16-битное целое число без знака
SWORD 16-битное целое число со знаком
DWORD 32-битное целое число без знака, D означает двойное (слово)
SDWORD 32-битное целое число со знаком, SD означает двойное со знаком (слово)
FWORD 48-битное целое число (дальний указатель в защищенном режиме)
QWORD 64-битное целое число, Q представляет четыре (слово)
TBYTE 80-битное (10-байтовое) целое число, T представляет 10 байтов
REAL4 32-битное (4 байта) короткое действительное число IEEE
REAL8 64-битное (8-байтовое) длинное действительное число IEEE
REAL10 80 бит (10 байт) Расширенное действительное число IEEE

Заявление об определении данных

Оператор определения данных (оператор определения данных) резервирует место для хранения переменных в памяти и присваивает дополнительное имя. Оператор определения данных определяет переменную в соответствии с внутренним типом данных (таблица выше).

Синтаксис определения данных следующий:

[name] directive initializer [,initializer]…

Ниже приводится пример оператора определения данных:

count DWORD 12345

  • Имя: необязательное имя, присвоенное переменной, должно соответствовать спецификации идентификатора.
  • Псевдо-инструкция: псевдо-инструкция в операторе определения данных может быть BYTE, WORD, DWORD, SBTYE, SWORD или другими типами, перечисленными в приведенной выше таблице. Кроме того, это также может быть традиционная директива определения данных, как показано в следующей таблице.
Псевдо-инструкция Применение Псевдо-инструкция Применение
DB 8-битное целое число DQ 64-битное целое или действительное число
DW 16-битное целое число DT Определяет 80-битное (10-байтовое) целое число
DD 32-битное целое или действительное число

АССЕМБЛЕР в 2023? Что такое «Reverse Engineering» и «Cyber Security». Показываю как ломают софт.

В определении данных должно быть хотя бы одно начальное значение, даже если значение равно 0. Остальные начальные значения, если есть, разделяются запятыми. Для целочисленных типов данных начальное значение (инициализатор) представляет собой целочисленную константу или целочисленное выражение, которое соответствует типу переменной, например BYTE или WORD.

Если программист не хочет инициализировать переменную (присвоить значение случайным образом), символ? Можно использовать в качестве начального значения. Все начальные значения, независимо от их формата, ассемблер преобразует в двоичные данные. Начальные значения 0011, 0010b, 32h и 50d имеют одинаковое двоичное значение.

Добавьте переменную в программу AddTwo

Программа AddTwo была представлена ​​в предыдущем разделе «Сложение и вычитание целых чисел», а теперь создана ее новая версия, которая называется AddTwoSum. Эта версия вводит переменную сумму, которая появляется в полном листинге программы:

;AddTowSum.asm .386 .model flat,stdcall .stack 4096 ExitProcess PROTO, dwExitCode:DWORD .data sum DWORD 0 .code main PROC mov eax,5 add eax,6 mov sum,eax INVOKE ExitProcess,0 main ENDP END main

Вы можете установить точку останова в строке 13, выполнять по одной строке за раз и пошагово выполнять программу в отладчике. После выполнения строки 15 наведите указатель мыши на сумму переменной, чтобы просмотреть ее значение.

Или откройте окно Watch.Процесс открытия выглядит следующим образом: выберите Windows в меню Debug (в сеансе отладки), выберите Watch и выберите один из четырех доступных вариантов (Watch1, Watch2, Watch3 или Watch4). Затем с помощью мыши выделите переменную суммы и перетащите ее в окно Watch. На следующем рисунке показан пример, где большая стрелка указывает текущее значение суммы после выполнения строки 15.

Определите данные BYTE и SBYTE

BYTE (определенный байт) и SBYTE (определенный байт со знаком) выделяют пространство для хранения для одного или нескольких значений без знака или со знаком. При сохранении каждого начального значения оно должно быть 8-битным. Например:

value1 BYTE’A ‘; значение символьной константы 2 BYTE 0; минимальное значение байта без знака 3 BYTE 255; максимальное значение байта без знака 4 SBYTE -128; минимальное значение байта со знаком 5 SBYTE +127; максимальное значение байта со знаком

Начальное значение вопросительного знака (?) Делает переменную неинициализированной, что означает присвоение значения переменной во время выполнения:

Необязательное имя — это метка, которая определяет смещение от начала переменной, содержащей раздел, до переменной. Например, если value1 находится по смещению 0000 сегмента данных и занимает один байт в памяти, то value2 автоматически находится по смещению 0001:

value1 BYTE 10h
value2 BYTE 20h

Директивы DB также могут определять 8-битные переменные со знаком или без знака:

val1 DB 255; беззнаковый байт
val2 DB -128; Байт со знаком

1) Несколько начальных значений

Если в одном определении данных используется несколько начальных значений, его метка указывает только смещение первого начального значения. В следующем примере предположим, что смещение списка равно 0000. Тогда смещение 10 равно 0000, смещение 20 равно 0001, смещение 30 равно 0002, а смещение 40 равно 0003:

list BYTE 10,20,30,40

На следующем рисунке показан список последовательности байтов, показывающий каждый байт и его смещение.

Не все определения данных должны использовать метки. Например, если вы продолжите добавлять массивы байтов после списка, вы можете определить их в следующей строке:

list BYTE 10,20,30,40 BYTE 50,60,70,80 BYTE 81,82,83,84

В одном определении данных для его начального значения могут использоваться разные базы. Также можно произвольно комбинировать символы и строковые константы. В следующем примере list1 и list2 имеют одинаковое содержимое:

list1 BYTE 10, 32, 41h, 00100010b list2 BYTE 0Ah, 20h, ‘A’, 22h

2) Определить строку

Чтобы определить строку, заключите ее в одинарные или двойные кавычки. Наиболее распространенный тип строки — использование нулевого байта (значение 0) в качестве конечного тега, который называется строкой с завершающим нулем. Этот тип строки используется во многих языках программирования:

greeting1 BYTE «Good afternoon»,0 greeting2 BYTE ‘Good night’,0

Читайте также:
Программа в которой работают салоны красоты

Каждый символ занимает один байт памяти. Строки являются исключением из правила, согласно которому значения байтов должны разделяться запятыми. Если бы таких исключений не было, приветствие1 было бы определено как:

greeting1 BYTE ‘G’, ‘o’, ‘o’, ‘d’….etc.

Это очень долго. Строку можно разделить на несколько строк, и нет необходимости добавлять метку к каждой строке:

greeting1 BYTE «Welcome to the Encryption Demo program » BYTE «created by Kip Irvine.»,0dh, 0ah BYTE «If you wish to modify this program, please » BYTE «send me a copy.»,0dh,0ah,0

Шестнадцатеричные коды 0Dh и 0Ah также называются CR / LF (возврат каретки и перевод строки) или символы конца строки. При записи стандартного вывода они перемещают курсор в левую часть строки рядом с текущей строкой.

Символ продолжения строки () соединяет две строки исходного кода в оператор, и он должен быть последним символом строки. Следующие утверждения эквивалентны:

greeting1 BYTE «Welcome to the Encryption Demo program »
и
greeting1
BYTE «Welcome to the Encryption Demo program «

Оператор DUP использует целочисленное выражение в качестве счетчика для выделения пространства хранения для нескольких элементов данных. Этот оператор очень полезен при выделении места для хранения строк или массивов. Он может использовать инициализированные или неинициализированные данные:

BYTE 20 DUP (0); 20 байтов, все значения: 0 BYTE 20 DUP (?); 20 байтов, неинициализированный BYTE 4 DUP («СТЕК»); 20 байтов:

Определите данные WORD и SWORD

Директивы WORD (слово определения) и SWORD (слово со знаком определения) выделяют место для хранения одного или нескольких 16-битных целых чисел:

word1 WORD 65535; максимальное число без знака word2 SWORD -32768; минимальное число со знаком word3 WORD ?; неинициализированное, беззнаковое

Вы также можете использовать традиционную псевдо-инструкцию DW:

val1 DW 65535; беззнаковый val2 DW -32768; подписанный

Массив 16-битных слов создается путем перечисления элементов или с помощью оператора DUP. Следующий массив содержит набор значений:

myList WORD 1,2,3,4,5

На рисунке ниже представлена ​​схематическая диаграмма массива в памяти при условии, что смещение начальной позиции myList равно 0000. Поскольку каждое значение занимает два байта, приращение его адреса равно 2.

Оператор DUP предоставляет удобный способ объявления массивов:

массив WORD 5 DUP (?); 5 значений, не инициализировано

Определите данные DWORD и SDWORD

Псевдоинструкции DWORD (определение двойного слова) и SDWORD (определение двойного слова со знаком) выделяют место для хранения одного или нескольких 32-битных целых чисел:

val1 DWORD 12345678h; unsigned val2 SDWORD -2147483648; подписанный val3 DWORD 20 DUP (?); массив без знака

Традиционная псевдо-инструкция DD также может использоваться для определения данных двойного слова:

val1 DD 12345678h; беззнаковый val2 DD -2147483648; подписанный

DWORD также можно использовать для объявления переменной, содержащей 32-битное смещение другой переменной. Как показано ниже, pVal содержит смещение val3:

pVal DWORD val3

32-битный массив двойных слов

Теперь определите массив двойных слов и явно инициализируйте каждое его значение:

myList DWORD 1,2,3,4,5

На следующем рисунке показана схематическая диаграмма этого массива в памяти.Предположим, что смещение начальной позиции myList равно 0000, а приращение смещения равно 4.

Определить данные QWORD

Псевдо-инструкция QWORD (определить четыре слова) выделяет место для хранения 64-битных (8 байтов) значений:

quad1 QWORD 1234567812345678h

Традиционная псевдо-инструкция DQ также может использоваться для определения данных из четырех слов:

quad1 DQ 1234567812345678h

Определить сжатые данные BCD (TBYTE)

Intel хранит сжатое двоично-десятичное (BCD, двоично-десятичное) целое число в 10-байтовом пакете. Каждый байт (кроме самого старшего) содержит две десятичные цифры. В младших 9 байтах памяти каждый полубайт хранит десятичное число. В старшем байте самый старший бит представляет бит знака числа.

Если старший байт равен 80h, число отрицательное; если старший байт равен 00h, число положительное. Диапазон целых чисел: от -999 999 999 999 999 999 до +999 999 999 999 999 999.

Пример В следующей таблице перечислены шестнадцатеричные байты хранения положительных и отрицательных десятичных чисел 1234, в порядке от младшего до самого старшего байта:

Десятичное значение Байты памяти
+1234 34 12 00 00 00 00 00 00 00 00
-1234 34 12 00 00 00 00 00 00 00 80

MASM использует псевдо-инструкцию TBYTE для определения сжатых переменных BCD. Начальное значение константы должно быть в шестнадцатеричном формате, поскольку ассемблер не будет автоматически преобразовывать начальное десятичное значение в код BCD. В следующих двух примерах показаны допустимые и недопустимые выражения десятичного числа -1234:

intVal TBYTE 800000000000001234h; допустимый intVal TBYTE -1234; недопустимый

Второй пример недействителен, поскольку MASM кодирует константы как двоичные целые числа вместо сжатия целых чисел BCD.

Если вы хотите закодировать действительное число в сжатый код BCD, вы можете использовать инструкцию FLD для загрузки действительного числа в стек регистров с плавающей запятой, а затем использовать инструкцию FBSTP для преобразования его в сжатый код BCD. Эта инструкция округляет значение до ближайшего Целое число:

.data posVal REAL8 1,5 bcdVal TBYTE? .code fid posVal; загружается в стек с плавающей запятой fbstp bcdVal; округляется до 2, значение сжатого кода BCD

Если posVal равно 1,5, результирующее значение BCD равно 2.

Определить тип с плавающей запятой

REAL4 определяет 4-байтовую переменную с плавающей запятой одинарной точности. REAL8 определяет 8-байтовое значение с двойной точностью, а REAL10 определяет 10-байтовое значение с расширенной точностью. Каждая псевдо-инструкция требует одного или нескольких реальных постоянных начальных значений:

rVal1 REAL4 -1.2 rVal2 REAL8 3.2E-260 rVal3 REAL10 4.6E+4096 ShortArray REAL4 20 DUP(0.0)

В следующей таблице описано минимальное количество значащих цифр и приблизительные диапазоны стандартных вещественных типов:

тип данных эффективное число Приблизительный диапазон
Короткий реальный номер 6 1.18x 10-38 to 3.40 x 1038
Длинное действительное число 15 2.23 x 10-308 to 1.79 x 10308
Действительное число повышенной точности 19 3.37 x 10-4932 to 1.18 x 104932

Псевдо-инструкции DD, DQ и DT также могут определять действительные числа:

rVal1 DD -1.2; короткое действительное число rVal2 DQ 3.2E-260; длинное действительное число rVal3 DT 4.6E + 4096; действительное число повышенной точности

Ассемблер MASM включает такие типы данных, как wal4 и real8, которые указывают на то, что значение является действительным числом. Чтобы быть более точным, эти значения представляют собой числа с плавающей запятой с ограниченной точностью и диапазоном. С математической точки зрения точность и размер действительных чисел неограниченны.

Программа сложения переменных

До сих пор в примерах программ в этом разделе реализовано целочисленное сложение, хранящееся в регистрах. Теперь, когда у вас есть некоторое представление о том, как определять данные, вы можете изменить ту же программу, чтобы добавить три целочисленные переменные и сохранить сумму в четвертой переменной.

;AddTowSum.asm .386 .model flat,stdcall .stack 4096 ExitProcess PROTO, dwExitCode:DWORD .data firstval DWORD 20002000h secondval DWORD 11111111h thirdval DWORD 22222222h sum DWORD 0 .code main PROC mov eax,firstval add eax,secondval add eax,thirdval mov sum,eax INVOKE ExitProcess,0 main ENDP END main

Читайте также:
Как установить цифровую подпись на программу

Обратите внимание, что три переменные инициализированы ненулевыми значениями (строки с 9 по 11). Добавьте переменные в строки 16-18. Набор инструкций x86 не позволяет напрямую добавлять одну переменную к другой переменной, но позволяет добавлять одну переменную в регистр. Вот почему EAX используется как аккумулятор в строках 16-17:

mov eax,firstval
add eax,secondval

После строки 17 EAX содержит сумму firstval и secondval. Затем в строке 18 добавьте третье значение к сумме в EAX:

Наконец, в строке 19 сумма копируется в переменную с именем sum:

В качестве упражнения всем рекомендуется запускать эту программу в сеансе отладки и проверять каждый регистр после выполнения каждой инструкции. Окончательная сумма должна быть 53335333 в шестнадцатеричной системе.

Если во время сеанса отладки вы хотите, чтобы переменная отображалась в шестнадцатеричном формате, выполните следующие действия: наведите указатель мыши на переменную или зарегистрируйтесь в течение 1 секунды, пока под курсором мыши не появится серый прямоугольник. Щелкните прямоугольник правой кнопкой мыши и выберите во всплывающем меню «Шестнадцатеричный формат».

Little endian

Процессор x86 хранит и извлекает данные в памяти в обратном порядке (от младшего к большему). Младший байт сохраняется в первом адресе памяти, присвоенном данным, а остальные байты сохраняются в последующих последовательных ячейках памяти. Рассмотрим двойное слово 12345678h. Если он сохраняется по смещению 0000, 78h сохраняется в первом байте, 56h сохраняется во втором байте, а оставшиеся байты сохраняются по смещениям адресов 0002 и 0003, как показано на следующем рисунке. .

Некоторые другие компьютерные системы используют прямой порядок байтов (от старшего к младшему). На следующем рисунке показано, что 12345678h хранится в обратном порядке, начиная со смещения 0000.

Объявить неинициализированные данные

.DATA? Директива объявляет неинициализированные данные. При определении большого количества неинициализированных данных директива .DATA? Уменьшает размер компилятора. Например, следующий код является допустимым утверждением:

.data smallArray DWORD 10 DUP (0); 40 байт .data? bigArray DWORD 5000 DUP (?); 20000 байт, неинициализировано

С другой стороны, скомпилированная программа, сгенерированная следующим кодом, будет иметь дополнительные 20 000 байтов:

.data smallArray DWORD 10 DUP (0); 40 байт bigArray DWORD 5000 DUP (?); 20000 байт

Гибридный ассемблер кода и данных позволяет переключать код и данные в программе туда и обратно. Например, вы хотите объявить переменную, чтобы ее можно было использовать только в локальной области программы. В следующем примере между двумя операторами кода вставляется переменная с именем temp:

.code mov eax,ebx .data temp DWORD ? .code mov temp,eax

Хотя присутствие оператора temp прерывает поток исполняемых инструкций, MASM поместит temp в раздел данных и отделит его от раздела кода, который остается скомпилированным. Однако в то же время смешивание директив .code и .data может затруднить чтение программы.

Настоятельно рекомендую прочитать статьи

Источник: russianblogs.com

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

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

Основными типами данных процессора с архитектурой IA-32 являются байт, слово, двойное слово, четырехбайтное слово и восьмибайтное слово.

Кол-во байт

Способ представления

Данные, обрабатываемые вычислительной машиной, можно разделить на 4 группы:

  • целочисленные;
  • вещественные.
  • символьные;
  • логические;

Целочисленные данные могут представляться в знаковой и беззнаковой форме.

Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2 n , где n-количество занимаемых битов.

Знаковые целые числа представляются в диапазоне -2 n -1 … + 2 n -1 . При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).

unsigned long int

Тип DT может быть только вещественным.

Вещественные данные обрабатываются сопроцессором и будут рассмотрены ниже.

Логические данные представляют собой бит информации и могут записываться в виде последовательности битов. Каждый бит может принимать значение 0 или 1 (ЛОЖЬ или ИСТИНА). Логические данные могут начинаться с любой позиции в байте.

Символьные данные задаются в кодах. Кодировка символов (часто называемая также кодовой страницей) – это набор числовых значений, которые ставятся в соответствие группе алфавитно-цифровых символов, знаков пунктуации и специальных символов. В Windows первые 128 символов всех кодовых страниц состоят из базовой таблицы символов ASCII (American Standard Code for Interchange of Information). Первые 32 кода базовой таблицы, начиная с нулевого, размещают управляющие коды. Символы с номерами от 128 до 255 представляют дополнительные символы и варьируются в зависимости от набора скриптов, представленных кодировкой символов. Основные таблицы кодировки представлены в приложении 1.

Для того чтобы полноценно поддерживать помимо английского и другие языки, фирма IBM ввела в употребление несколько кодовых таблиц, ориентированных на конкретные страны. Так для скандинавских стран была предложена таблица 865 (Nordic), для арабских стран — таблица 864 (Arabic), для Израиля — таблица 862 (Israel) и так далее. В этих таблицах часть кодов из второй половины кодовой таблицы использовалась для представления символов национальных а лфавитов (за счет исключения некоторых символов псевдографики).

С русским языком ситуация развивалась особым образом. Очевидно, что замену символов во второй половине кодовой таблицы можно произвести разными способами. Вот и появились для русского языка несколько разных таблиц кодировки символов кириллицы: KOI8-R, IBM-866, CP-1251, ISO-8551-5. Все они одинаково изображают символы первой половины таблицы (от 0 до 127) и различаются представлением символов русского алфавита и псевдографики.

Для таких же языков, как китайский или японский, вообще 256 символов недостаточно. Кроме того, всегда существует проблема вывода или сохранения в одном файле одновременно текстов на разных языках (например, при цитировании).

Поэтому была разработана универсальная кодовая таблица UNICODE, содержащая символы, применяемые в языках всех народов мира, а также различные служебные и вспомогательные символы (знаки препинания, математические и технические символы, стрелки, диакритические знаки и т.д.). Очевидно, что одного байта недостаточно для кодирования такого большого множества символов. Поэтому в UNICODE используются 16-битовые (2-байтовые) коды, что позволяет представить 65536 символов. К настоящему времени задействовано около 49000 кодов (последнее значительное изменение — введение символа валюты EURO в сентябре 1998 г.).

Для совместимости с предыдущими кодировками первые 256 кодов совпадают со стандартом ASCII.

Для перекодировки символов и русскоязычного вывода в окно консоли можно использовать функцию Windows API

BOOL CharToOem(LPCTSTR lpszSrc, LPSTR lpszDst);

lpszSrc – указатель на строку-источник

lpszDst – указатель на строку-приемник.

Числа в двоично-десятичном формате

В двоично-десятичном коде представляются беззнаковые целые числа, кодирующие цифры от 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.

Десятичное 12, шестнадцатеричное 0Сh, восьмеричное 14q и двоичное 1100b генерируют один и тот же код. Отрицательные числа ассемблер сам представляет в виде дополнительного кода.

_bb DB 00001100b ; _bb указывает на байт памяти

;с двоичным значением 00001100

_ww_ DW 1234o ; _ww указывает на слово памяти

; с восьмеричным значением 1234

_dd_ DD 12345678h ;_dd указывает на двойное слово

; памяти со значением 12345678h

Вещественные числа задаются с помощью директив DD, DQ и DT.

_dt_ DT 168.987E-21

Для инициализации массивов (цепочек) можно использовать следующие строки

My_array DW 0,1,2,3,4,5,6,7,8,9

My_array DW 0,1,2,3

Данная строка выделяет десять последовательных слов памяти и записывает в них значения 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Метка My_array определяет смещение начала этой области в сегменте .DATA.

Для инициализации блоков памяти одними и теми же значениями можно использовать оператор DUP. Например,

Block_array DW 100 DUP (12h)

В тех случаях, когда необходимо выделить память, но не инициализировать ее, используется знак ?. Например,

massiv DW 20 DUP (?)

Символьные строки представляют собой набор символов для вывода на экран. Содержимое строки отмечается одиночными кавычками, например, ‘pc’ или двойными кавычками (“pc”). Ассемблер переводит символьные строки в объектный код в обычном формате текущей кодовой страницы.

Символьная строка определяется только директивой DB, в которой указывается более двух символов в нормальной последовательности слева направо. Символьная строка должна заканчиваться символом ‘’ (для системы MS-DOS строка заканчивается символом ‘$’). Для перевода строки могут использоваться символы 13 (возврат каретки 0Dh) и 10 (перевод строки 0Ah).

Stroka DB ‘Привет’,13,10,0

При записи символьных констант следует помнить, что символьная константа, определенная как DB ‘12’, представляет собой символы ASCII и генерирует шестнадцатеричный код 3132h, а числовая константа, определенная как DB 12, представляет двоичное число и генерирует шестнадцатеричный код 0Сh.

В кодовой странице ASCII (UNICODE) символы цифр ‘0’… ‘9’ соответствуют значениям кодов 30h…39h соответственно. Используя это, можно легко переводить числа, вводимые с клавиатуры, в эквивалент их целочисленного значения.

Источник: studfile.net

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

Данные, обрабатываемые вычислительной машиной, можно разделить на 4 группы:

  • целочисленные;
  • вещественные.
  • символьные;
  • логические;
Целочисленные данные

Целые числа в ассемблере могут быть представлены в 1-байтной, 2-байтной, 4-байтной или 8-байтной форме. Целочисленные данные могут представляться в знаковой и беззнаковой форме.

Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2 n -1, где n- количество занимаемых битов.

Беззнаковые целые числа
Знаковые целые числа представляются в диапазоне -2 n-1 … +2 n-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).

a DB 00001100b

Восьмеричный формат – допускает использование цифр от 0 до 7 и обозначается последней буквой q или o, например, 253q.

Массивы и цепочки

Массивом называется последовательный набор однотипных данных, именованный одним идентификатором.

Цепочка — массив, имеющий фиксированный набор начальных значений.

Примеры инициализации цепочек

M1 DD 0,1,2,3,4,5,6,7,8,9
M2 DD 0,1,2,3

Каждая из записей выделяет десять последовательных 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.

Str DB ‘Привет всем!’ , 0

Для перевода строки могут использоваться символы

  • возврат каретки с кодом 13 (0Dh)
  • перевод строки с кодом 10 (0Ah).

Источник: prog-cpp.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru