Представление данных
В языке ассемблера имеются средства записи
целых и вещественных чисел, а также
символьных строк и отдельных символов.
Целые числа могут быть со знаком и без знака,
а также записанными в двоично-десятичном
формате. Для целых чисел и символов в
составе команд микропроцессора и,
соответственно, в языке ассемблера, есть
средства обработки - анализа, сравнения,
поиска и проч. Для вещественных чисел таких
средств в самом микропроцессоре нет, они
содержатся в арифметическом сопроцессоре.
Поскольку программирование сопроцессора в
настоящей книге не рассматривается, то и
вещественными числами мы заниматься не
будем.
Рассмотрим сначала целые числа без знака и
со знаком. Числа без знака получили свое
название потому, что среди этих чисел нет
отрицательных. Это самый простой вид чисел:
они представляют собой весь диапазон
двоичных чисел, которые можно записать в
байте, слове или двойном слове. Для байта
числа без знака могут принимать значения от
00h (0) до FFh (255); для слова - от 0000h (0) до FFFFh (65535);
для двойного слова - от 00000000h (0) до FFFFFFFFh
(4294967295).
В огромном количестве приложений
вычислительной техники для чисел нет
понятия знака. Это справедливо, например,
для адресов ячеек памяти, кодов ASCII символов,
результатов измерений многих физических
величин, кодов управления устройствами,
подключаемыми к компьютеру. Для таких чисел
естественно использовать весь диапазон
чисел, записываемых в ячейку того или иного
размера. Если, однако, мы хотим работать как
с положительными, так и с отрицательными
числами, нам придется половину чисел из их
полного диапазона считать положительными,
а другую половину - отрицательными. В
результате диапазон изменения числа
уменьшается в два раза. Кроме того,
необходимо предусмотреть систему
кодирования, чтобы положительные и
отрицательные числа не перекрывались.
В вычислительной технике принято
записывать отрицательные числа в так
называемом дополнительном коде, который
образуется из прямого путем замены всех
двоичных нулей единицами и наоборот (обратный
код) и прибавления к полученному числу
единицы. Это справедливо как для байтовых (8-битовых)
чисел, так и для чисел размером в слово или в
двойное слово (рис. 2.8)
Рис. 2.8. Образование отрицательных чисел различного размера.
Такой способ образования отрицательных
чисел удобен тем, что позволяет выполнять
над ними арифметические операции по общим
правилам с получением правильного
результата. Так, сложение чисел +5 и -5 дает 0;
в результате вычитания 3 из 5 получается 2;
вычитание -3 из -5 дает -2 и т.д.
Анализируя алгоритм образования
отрицательного числа, можно заметить, что
для всех отрицательных чисел характерно
наличие двоичной единицы в старшем бите.
Положительные числа, наоборот, имеют в
старшем бите 0. Это справедливо для чисел
любого размера. Кроме того, из рис. 2.8 видно,
что для преобразования отрицательного 8-битового
числа в слово достаточно дополнить его
слева восемью двоичными единицами. Легко
сообразить, что для преобразования
положительного 8-битового числа в слово его
надо дополнить восемью двоичными нулями. То
же справедливо и для преобразования слова
со знаком в двойное слово со знаком, только
добавить придется уже не 8, а 16 единиц или
нулей. В системе команд МП 86 и,
соответственно, в языке ассемблера, для
этих операций предусмотрены специальные
команды cbw и cwd.
Следует подчеркнуть, что знак числа условен.
Одно и то же число, например, изображенное
на рис. 2.8 8-битовое число FBh можно в одном
контексте рассматривать, как отрицательное
(-5), а в другом - как положительное, или,
правильнее, число без знака (FBh=251). Знак
числа является характеристикой не самого
числа, а нашего представления о его смысле.
На рис. 2.9 представлена выборочная таблица
16-битовых чисел с указанием их машинного
представления, а также значений без знака и
со знаком. Из таблицы видно, что для чисел со
знаком размером в слово диапазон
положительных значений простирается от 0 до
32767, а диапазон отрицательных значений - от -1
до -32768.
Рис. 2.9. Представление 16-битовых чисел без знака и со знаком.
На рис. 2.10 представлена аналогичная таблица для 8-битовых чисел. Из таблицы видно, что для чисел со знаком размером в байт диапазон положительных значений простирается от 0 до 127, а диапазон отрицательных значений - от -1 до -128.
Рис. 2.10. Представление 8-битовых чисел без знака и со знаком.
Среди команд процессора, выполняющих ту
или иную обработку чисел, можно выделить
команды, безразличные к знаку числа (например,
inc, add, test), команды, предназначенные для
обработки чисел без знака (mul, div, ja, jb и др.), а
также команды, специально рассчитанные на
обработку чисел со знаком (imul, idiv, jg, jl и т.д.).
Особенности использования этих команд
будут описаны в следующей главе.
Рассмотрим теперь другой вид представления
чисел - двоично-десятичный формат (binary-coded
decimal , BCD), используемый в ряде прикладных
областей. В таком формате выдают данные
некоторые измерительные приборы; он же
используется КМОП-часами реального времени
компьютеров IBM PC для хранения информации о
текущем времени. В МП 86 предусмотрен ряд
команд для обработки таких чисел.
Двоично-десятичный формат существует в
двух разновидностях: упакованный и
распакованный. В первом случае в байте
записывается двухразрядное десятичное
число от 00 до 99. Каждая цифра числа занимает
половину байта и хранится в двоичной форме.
Из рис. 2.11 можно заметить, что для записи в
байт десятичного числа в двоично-десятичном
формате достаточно сопроводить
записываемое десятичное число символом h.
Рис. 2.11. Упакованный двоично-десятичный формат.
В машинном слове или в 16-разрядном регистре можно хранить в двоично-десятичном формате четырехразрядные десятичные числа от 0000 до 9999 (рис.2.12).
Рис. 2.12. Запись десятичного числа 9604 в слове.
Распакованный формат отличается от упакованного тем, что в каждом байте записывается лишь одна десятичная цифра (по-прежнему в двоичной форме). В этом случае в слове можно записать десятичные числа от 00 до 99 (см. рис. 2.13)
Рис. 2.13. Запись десятичного числа 98 в распакованном виде.
При хранении десятичных чисел в аппаратуре обычно используется более экономный упакованный формат; умножение и деление выполняются только с распакованными числами, операции же сложения и вычитания применимы и к тем, и к другим. Примеры операций с двоично-десятичными числами будут рассмотрены в следующей главе.