Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование и основы алгоритмизации.doc
Скачиваний:
34
Добавлен:
21.08.2019
Размер:
4.84 Mб
Скачать

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

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

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

Тип данных

Директива

Кол-во байт

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

Байт

DB

1

Слово

DW

2

Двойное

слово

DD

4

4 слова

DQ

8

10 байт

DT

10

80 бит

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

  • целочисленные;

  • вещественные.

  • символьные;

  • логические;

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

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

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

Тип

Диапазон

изменения

Форма представления

Тип в

Си

беззнаковое

целое (байт)

0…255

unsigned

char

беззнаковое

целое (слово)

0…65535

unsigned int

беззнаковое

целое (4-байт)

0…

4294967295

unsigned long int

беззнаковое

целое (8-байт)

0…

1,84467e+19

знаковое

целое (байт)

-128…127

char

знаковое

целое (слово)

-32768…

32767

int

знаковое

целое (4-байт)

-2147483648

..2147483647

long int

знаковое

целое (8-байт)

-9,22e+18…

9,22e+18

Тип 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.

Примеры:

_dd_ DD 5.65

_dq_ DQ -122.87

_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

DW 4,5,6,7

DW 8,9

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

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

Block_array DW 100 DUP (12h)

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

no_init DD ?

massiv DW 20 DUP (?)

Символьные строки представляют собой набор символов для вывода на экран. Содержимое строки отмечается одиночными кавычками, например, ‘pc’ или двойными кавычками (“pc”). Ассемблер переводит символьные строки в объектный код в обычном формате текущей кодовой страницы. Символьная строка определяется только директивой DB, в которой указывается более двух символов в нормальной последовательности слева направо. Символьная строка должна заканчиваться символом ‘\0’ (для системы 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 соответственно. Используя это, можно легко переводить числа, вводимые с клавиатуры, в эквивалент их целочисленного значения.