IBM PC

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

Для того чтобы скачать эту работу.
1. Подтвердите что Вы не робот:
2. И нажмите на эту кнопку.
закрыть



>

точно редко, не рассматривается. Что касается вещественных чисел, то в

ПК нет команд вещественной арифметики (операции над этими числами реа-

лизуются программным путем или выполняются сопроцессором) и потому нет

стандартного представления вещественных чисел. Кроме того, рассматри-

ваются некоторые особенности выполнения арифметических операций.

Шестнадцатиричные числа записываются с буквой h на конце, двоичные

числа - с буквой b (так принято в MASM).

1.2.1 Представление целых чисел.

В общем случае под целое число можно отвести любое число байтов,

однако система команд ПК поддерживает только числа размером в байт и

слово и частично поддерживает числа размером в двойное слово. Именно

эти форматы и будут рассмотрены.

В ПК делается различие между целыми числами без знака (неотрица-

тельными) и со знаком. Это объясняется тем, что в ячейках одного и то-

го же размера можно представить больший диапазон беззнаковых чисел,

чем неотрицательных знаковых чисел, и если известно заранее, что неко-

торая числовая величина является неотрицательной, то выгоднее рассмат-

ривать ее как беззнаковую, чем как знаковую.

Целые числа без знака.

Эти числа могут быть представлены в виде байта, слова или двойного

слова - в зависимости от их размера. В виде байта представляются целые

от 0 до 255 (=2^8-1), в виде слова - целые от 0 до 65535 (=2^16-1), в

виде двойного слова - целые от 0 до 4 294 967 295 (=2^32-1). Числа за-

писываются в двоичной системе счисления, занимая все разряды ячейки.

Например, число 130 записывается в виде байта 10000010b (82h).

Числа размером в слово хранятся в памяти в "перевернутом" виде:

младщие (правые) 8 битов числа размещаются в первом байте слова, а

старшие 8 битов - во втором байте (в 16-ричной системе: две правые

цифры - в первом байте, две левые цифры - во втором байте). Например,

число 130 (=0082h) в виде слова хранится в памяти так:

-----------

| 82 | 00 |

-----------

(Отметим, однако, что в регистрах числа хранятся в нормальном виде:

-----------

AX | 00 | 82 |

-----------

AH AL )

"Перевернутое" представление используется и при хранении в памяти

целых чисел размером в двойное слово: в первом его байте размещаются

младшие 8 битов числа, во втором байте - предыдущие 8 битов и т.д. На-

пример, число 12345678h хранится в памяти так:

---------------------

| 78 | 56 | 34 | 12 |

---------------------

Другими словами, в первом слове двойного слова размещаются младшие

(правые) 16 битов числа, а во втором слове - старшие 16 битов, причем

в каждом из этих двух слов в свою очередь используется "перевернутое"

представление.

Такое необычное представление чисел объясняется тем, что в первых

моделях ПК за раз можно было считать из памяти только один байт и что

все арифметические операции над многозначными числами начинаются с

действий над младшими цифрами, поэтому из памяти в первую очередь надо

считывать младшие цифры, если сразу нельзя считать все цифры. Учитывая

это, в первых ПК и стали размещать младшие цифры числа перед старшими

цифрамми, а ради преемственности такое представление чисел сохранили в

последующих моделях ПК.

Конечно, "перевернутое" представление неудобно для людей, однако

при использовании языка ассемблера это неудобство не чувствуется: в

MASM все числа записываются в нормальном, неперевернутом виде (см. ни-

же).

Целые числа со знаком.

Эти числа также представляются в виде байта, слова и двойного сло-

ва. В виде байта записываются числа от -128 до 127, в виде слова -

числа от -32768 до 32767, а в виде двойного слова - числа от

-2147483648 до 2147483647. При этом числа записываются в дополнитель-

ном коде: неотрицательное число записывается так же, как и беззнаковое

число (т.е. в прямом коде), а отрицательное число -x (x>0) представля-

ется беззнаковым числом 2^8-x (для байтов), 2^16-x (для слов) или

2^32-x (для двойных слов). Например, дополнительным кодом числа -6 яв-

ляется байт FAh (=256-6), слово FFFAh или двойное слово FFFFFFFAh. При

этом байт 10000000b (=80h) трактуется как -128, а не как +128 (слово

8000h понимается как -32678), поэтому левый бит дополнительного кода

всегда играет роль знакового: для неотрицательных чисел он равен 0,

для отрицательных - 1.

Знаковые числа размером в слово и двойное слово записываются в па-

мяти в "перевернутом" виде (при этом знаковый бит оказывается в пос-

леднем байте ячейки). Но в MASM эти числа, как и беззнаковые, записы-

ваются в нормальной форме.

Иногда число-байт необходимо расширить до слова, т.е. нужно полу-

чить такое же по величине число, но размером в слово. Существует два

способа такого расширения - без знака и со знаком. В любом случае ис-

ходное число-байт попадает во второй (до "переворачивания") байт сло-

ва, а вот первый байт заполняется по-разному: при расширении без знака

в него записываются нулевые биты (12h -> 0012h), а при расширении со

знаком в первый байт записываются нули, если число-байт было неотрица-

тельным, и записывается восемь двоичных единиц в противном случае (81h

-> FF81h). Другими словами, при расширении со знаком в первом байте

слова копируется знаковый разряд числа-байта.

Аналогично происходит расширение числа-слова до двойного слова.

1.2.2 Особенности выполнения арифметических опреаций

В ПК имеются команды сложения и вычитания целых чисел размером в

слово и байт. Специальных команд для сложения и вычитания двойных слов

нет, эти операции реализуются через команды сложения и вычитания слов.

Сложение и вычитание беззнаковаых чисел производится по модулю 2^8

для байтов и 2^16 для слов. Это означает, что если в результате сложе-

ния появилась единица переноса, не вмещающаяся в разрядную сетку, то

она отбрасывается. Например, при сложении байтов 128 и 130 получается

число 258 = 100000010b, поэтому левая двоичная единица отбрасывается и

остается число 2 = 10b, которое и объявляется результатом сложения.

Ошибка здесь не фиксируется, но в флаг переноса CF записывается 1 (ес-

ли переноса не было, в CF заносится 0). "Поймать" такое искажение сум-

мы можно только последующим анализом флага CF.

Искажение результата происходит и при вычитание из меньшего числа

большего. И здесь не фиксируется ошибка, однако первому числу дается

"заем единицы" (в случае байтов это число увеличивается на 256, для

слов - на 2^16), после чего и производится вычитание. Например, вычи-

тание байтов 2 и 3 сводится к вычитанию чисел 256+2=258 и 3, в резуль-

тате чего получается неправильная разность 255 (а не -1). Для того

чтобы можно было обнаружить такую ситуацию, в флаг переноса CF зано-

сится 1 (если заема не было, в CF записывается 0).

Сложение и вычитание знаковых целых чисел производится по тем же

алгоритмам, что и для беззнаковых чисел (в этом одно из достоинств до-

полнительного кода): знаковые числа рассматриваются как соответствую-

щие беззнаковые числа, произодится операция над этими беззнаковыми чи-

слами и полученный результат интерпретируется как знаковое число. Нап-

ример, сложение байтовых чисел 1 и -2 происходит так: берутся их до-

полнительные коды 1 и (256-2)=254, вычисляется сумма этих величин

1+254=255 и она трактуется как знаковое число -1 (255=256-1). Если при

таком сложении возникла единица переноса, то она, как обычно, отбрасы-

вается, а флаг CF получает значение 1. Однако в данном случае это от-

сечение не представляет интерес - результат операции будет правильным,

например: 3+(-2) => 3+254(mod 256) = 257(mod 256) = 1. Зато здесь воз-

можна иная неприятность: модуль суммы (ее мантисса) может превзойти

допустимую границу и "залезть" в знаковый разряд, испортив его. Напри-

мер, при сложении байтовых чисел 127 и 2 получается величина 129 =

= 100001001b, представляющая дополнительный код числа -127 (=256-129).

Хотя результат здесь получился и неправильным, процессор не фиксирует

ошибку, но зато заносит 1 в флаг переполнения OF (если "переполнения

мантиссы" не было, в OF записывается 0). Анализируя затем этот флаг,

можно "поймать" такую ошибку.

Таким образом, сложение (вычитание) знаковых и беззнаковых чисел

производится по одному и тому же алгоритму. При этом ПК не "знает",

какие числа (со знаком или без) он складывает; в любом случае он скла-

дывает их как беззнаковые числа и в любом случае формирует флаги CF и

OF. А вот как интерпретировать слагаемые и сумму, на какой из этих

флагов обращать внимание - это личное дело автора программы.

Что кас