ОБЩИЕ СВЕДЕНИЯ
В данной главе рассматриваются различные форматы » представления двоичных и десятичных, целых и дробных, знаковых и беззнаковых чисел, а также методы, алгоритмы и программы выполнения арифметических операций над множеством этих чисел, обеспечивающие заданную точность и диапазон вычислений при определенных затратах памяти и времени работы микропроцессора.
* Изображение чисел в любой позиционной системе счисления с натуральным основанием R(R> 1) базируется на представлении их в виде произведения целочисленной степени Rm основания R на полином от этого основания [45, 53, 54, 61]:
Если т = const, то формула (1.1) определяет представление числа Ar в форме с фиксированной запятой (наряду с этим термином в вычислительной математике и технике широко используется термин-синоним «фиксированная точка»). Позиция, в которой запятая фиксируется между разрядами числа, отделяя целую часть от
Рис. 1.1. Форматы двоичных чисел с фиксированной запятой:
а — дробные числа; б—смешанные числа; в—целые числа
На рис. 1.1 приведены форматы двоичных (R = 2) чисел с фиксированной запятой для случаев т = 0 (а), т = 1 (б) и т = п (в). Далее ограничимся рассмотрением только целых и дробных чисел, поскольку действия над смешанными числами могут быть сведены к отдельным операциям над их целыми и дробными частями. Дробные числа в отличие от целых будем рассматривать как числа с фиксированной запятой в узком смысле этого термина и для их обозначения в формулах и программах использовать букву «ф».
В микропроцессорах основой представления чисел является двоичная система счисления. Рассмотрим пред-
В формулах (1.2) — (1.5) двоичные числа представлены в виде полинома, коэффициенты которого выражены двоичными цифрами, а основание — десятичным числом, т.
е. цифрой 2. Учитывая, что в любой позиционной систе ме счисления ее основание однозначно представляется с помощью цифр этой системы в виде 10/? (по определению, Я = (/?-1)+1, а такая операция дает нуль в младшем разряде и единицу переноса в старший разряд), формулы (1.2) — (1.5) можно обобщить на случай любой позиционной системы:
где обозначение модуля введено для знаковых чисел, а неравенства справедливы для всех ненулевых значений представляемых чисел. Формула (1.6) определяет свойства дробных, а (1.7) —целых чисел с основанием 10/?. Эти формулы полезны, в частности, при рассмотрении чисел в десятичной и шестнадцатеричной системах счисления, широко используемых в микропроцессорах наряду с двоичной системой.
Для представления в микропроцессорах систем счисления с основанием Я =10 и /? = 16 используются смешанные системы счисления, в которых каждая цифра /?-ичной системы изображается цифрами другой, Q-ичной (Q 1.2. Размещение чисел ограниченной точности на числовой оси:
а—Д-ичные числа; б — двоичные дробные числа; в — двоичные целые числа
социативного закона дает значение 0,2000 + (0,9000 — — 0,8999) = 0,2001, а при вычислении правой части возникает переполнение: (а + Ь) = 0,2000 + 0,9000 > 0,9999. Аналогично при вычислении правой части выражения дистрибутивного закона получаем значение 0,2000 X X 0,9000 — 0,2000 • 0,8999 = 0,1800 — 0,1799 = 0,0001, а при вычислении левой части возникает машинный нуль: а ■ (Ь —с) = 0,2000 • (0,9000 — 0,8999) = 0,2000 • 0,0001 < ограниченной точности может быть менее точной, чем уменьшаемое и вычитаемое. Потеря точности особенно велика в том случае, когда уменьшаемое и вычитаемое близки по абсолютной величине. Такое вычитание приводит к резкому снижению значности результата и, следовательно, к возрастанию граничной относительной ошибки разности. При организации вычислений необходимо либо избегать вычитания близких чисел, либо брать исходные числа с достаточно высокой точностью, обеспечивающей при вычитании необходимую точность результата.
Рис. 1.4. Вычислительная схема операций сложения (вычитания)
УѴ-байтных чисел
пользуется для циклического построения программ. Возможность создания программ на основе приведенной схемы определяется наличием в наборе команд микропроцессора команд сложения (вычитания) с переносом.
Вычислительные схемы дают общее, развернутое в пространстве представление о ходе вычислительного процесса на основе взаимосвязи между структурой данных и операциями (функциями), выполняемыми над этими структурами. В этом заключается основное отличие таких схем от схем алгоритмов, описывающих лишь последовательность операций и умалчивающих о структурах данных. Вычислительные схемы полезны для уяснения и общего описания решаемой задачи.
При сложении двоичных беззнаковых чисел может возникнуть ошибка переполнения. Признаком такой ошибки является значение бита переноса, равное CY = 1 после сложения СТБ слагаемых. При вычитании беззнаковых чисел разность может стать отрицательным числом (говорят, что множество беззнаковых чисел незамкнуто относительно операции вычитания). Признаком этого нарушения также является значение бита переноса CY= 1 после вычитания СТБ вычитаемого из СТБ уменьшаемого (CY= 1 вследствие заема из несуществующего (N -\- 1)-го байта уменьшаемого). Аналогичные ошибки возникают при сложении (вычитании) двоично-десятичных чисел и двоичных чисел со знаком. Приемы фиксации этих ошибок рассматриваются ниже при описании соответствущих программ сложения и вычитания.
2.1.2. ДВОИЧНЫЕ ЧИСЛА
Пусть N-байтные (N < 256) беззнаковые целые двоичные числа размещены в оперативной памяти микропроцессорной системы, причем каждое Л/-байтное число расположено в своей локальной области памяти от МЛБ к СТБ в порядке возрастания адресов. Сложение двух таких чисел реализует программа C8N (название программы содержит аббревиатуры типа операции и формата данных):
В этой программе регистровые пары (В, С) и (Н, L) используются для последовательной адресации байтов соответственно первого и второго слагаемых, а регистр (Е) — в качестве счетчика N байтов.
Процедура сложения, согласно схеме рис. 1.4, реализуется в виде цикла сложения і-х байтов и проверки цикла по содержимому счетчика байтов. Непосредственное сложение двух байтов происходит путем считывания байта первого слагаемого из памяти в аккумулятор микропроцессора и сложения с переносом содержимого аккумулятора с соответствую-щим байтом второго слагаемого, после чего результат сложения из аккумулятора засылается в память на место использованного байта первого слагаемого. Если при сложении возникает ненулевой перенос в следующий байт, этот перенос учитывается при сложении очередных байтов слагаемых. Заметим, что начальный перенос перед сложением первых байтов слагаемых CY=0, а конечный перенос - - после сложения СТБ чисел — определяет признак переполнения. Программа реализована (как и все последующие программы) в виде подпрограммы, что позволяет легко использовать ее в программах более высокого уровня посредством команд вызова подпрограмм типа CALL. Количественная характеристика программы содержит ее длину в байтах и предельное время выполнения в машинных тактах. Расчет времени выполнения программы сделан в соответствии с быстродействием команд микропроцессора, указанным в табл. П. 2.
В дальнейшем не будем подробно останавливаться на действиях, описанных в тексте программ, поскольку все они имеют подробный заголовок (ограничен двумя рядами звездочек), строки-комментарии, определяющие функциональное назначение очередного фрагмента программы, и поля-комментарии, поясняющие роль команд в решении задачи. (В прил. 1 дано развернутое описание набора команд микропроцессора КР580, и читатель, желающий разобраться в детальном описании программы, должен владеть этим набором.) При описании программ будут отмечаться лишь характерные их особенности и связи со структурами обрабатываемых данных.
Вычитание двух УѴ-байтных целых беззнаковых двоичных чисел реализуется программой B8N:
Эта программа отличается от программы C8N тем, что вместо команды ADC М в ней задействована команда вычитания с переносом SBB М.
Заметим, что обе рассмотренные программы применимы для операций и над дробными N-байтными числами. Можно программы упростить и повысить их быстродействие, если исключить команды сохранения и восстановления регистров типа MOV D, Е и MOV Е, D, PUSH В и POP В. Необходимость этих вспомогательных команд определяется условиями использования данных подпрограмм в рамках программ более высокого уровня.Рассмотрим сложение знаковых N-байтных двоичных чисел, представленных в дополнительном коде. Старший бит СТБ числа используется как знаковый. При сложении знаковых чисел в дополнительных кодах, как и при сложении беззнаковых чисел, может возникнуть ошибка переполнения. Очевидно, что эта ошибка возможна лишь при сложении чисел с одинаковыми знаками, т. е. двух положительных или отрицательных чисел. При сложении таких чисел ошибка переполнения имеет место, если возникает единица переноса в знаковый разряд, т. е. значение знакового разряда суммы изменяется на противоположное. Отсюда следует простое правило выявления ошибки переполнения при сложении чисел в дополнительных двоичных кодах: ошибка имеет место, если знаки слагаемых совпадают, а сумма имеет противоположный знак.
Сложение двух целых /Ѵ-байтных двоичных чисел в дополнительном коде реализуется программой СД8Ы:
Программа строится по аналогии с программой C8N и отличается от нее тем, что проверка конца цикла осуществляется до операции записи суммы очередных байтов на место использованного байта первого слагаемого. Такое изменение хода процедуры позволяет при сложении старших байтов сохранить знак первого слагаемого с целью использования его при анализе переполнения, выполняемом в соответствии с вышерассмотренным прави-
лом. Данная программа применима также для сложения дробных чисел.
При необходимости умножения и деления многобайтных двоичных чисел можно воспользоваться программами, приведенными в литературе [44].
2.1.3.
ДЕСЯТИЧНЫЕ ЧИСЛАДесятичные числа в микропроцессорах представляются, как отмечалось выше, в смешанной двоично-десятич- ной системе. При этом байт данных состоит из двух десятичных цифр формата 8 = 2- 4, а N-байтные данные — из 2/Ѵ-разрядного десятичного числа. Сложение двоичнодесятичных чисел отличается от сложения двоичных чисел условиями формирования переноса между двоичными тетрадами [5, 16]. Обозначим десятичную и шестнадцатеричную цифры соответственно как аю и аш- Тогда условие двоично-десятичного переноса имеет вид
Микропроцессор КР580 содержит команду десятичной коррекции DAA, реализующую условие (1.17), которая позволяет использовать для сложения двично-десятичных чисел команды сложения двоичных чисел. Для получения правильной двоично-десятичной суммы необходимо выполнить над результатом двоичного сложения команду десятичной коррекции DAA.
Сложение A-байтных целых беззнаковых двоичнодесятичных чисел реализуется программой C8N10:
Программа аналогична программе C8N, за исключением одной дополнительной команды DAA, вставленной в цикл сложения двух байтов. Ошибка переполнения при десятичном сложении фиксируется, если после сложения СТБ слагаемых и выполнения команды DAA имеет место ненулевой перенос CY= 1. Программа также применима к дробным беззнаковым числам.
Реализация десятичного вычитания N-байтных двоично-десятичных чисел сложнее их суммирования, поскольку микропроцессор КР580 не содержит команды десятичной коррекции при двоичном вычитании двоично-десятичных чисел. Поэтому вычитание необходимо выполнять путем суммирования уменьшаемого с дополнительным десятичным кодом вычитаемого, что позволяет применить команду десятичной коррекции [5, 52]:
т. е. вначале получить 2/Ѵ-разрядное десятичное число вида 99...99, вычесть из него I К| (такое двоично-десятичное вычитание полностью эквивалентно обычному двоичному вычитанию, так как не приводит к переносам между тетрадами), а затем к результату добавить единицу. Десятичное вычитание реализует программа B8N10:
33
[1] 1926
Программа имеет три интересные особенности: 1) преобразование вычитаемого и дополнительный код производится побайтно и совмещается в цикле с операцией десятичного сложения с соответствующим байтом уменьшаемого; 2) для адресации уменьшаемого в процессе работы программы применяется регистровая пара (D, Е), а не (В, С), что позволяет, используя команду обмена регистровых пар XCHG, быстро адресовать в арифметических командах сложения, обращающихся к памяти, как уменьшаемое, так и вычитаемое; 3) применяется псевдослагаемое (С) = 0, которое позволяет использовать в цикле более быстродействующую команду ADC С (4 такта) вместо команды АСІ 0 (7 тактов).
2.2.