22. Деление прямых кодов (лекция 22)

Будем считать, что делимое и делитель - целые двоичные числа, причем делимое имеет двойную длину и перед началом операции находится в аккумуляторе А, делитель находится в регистре В, а для частного имеется отдельный сдвиговый регистр С.

При делении прямых кодов, как и при их умножении, в основной операции участвуют только модули чисел. Знак частного определяется отдельной логической операцией .

Деление представляет ряд последовательно выполняемых циклов вычитания и сдвига, но иногда приходится делать и сложение. Разумеется вычитание тоже делается как сложение с дополнительным кодом модуля делителя, взятого со знаком "минус". Полученные в каждом цикле разности называются очередными остатками. В каждом цикле определяется одна цифра частного: если очередной остаток положителен, то соответствующая цифра частного есть единица, в противном случае - нуль.

Первый цикл выполняется только для контроля переполнения. Из АН вычитается модуль делителя B. Если остаток получается положительным (AH[n-1] = 0), то это является признаком переполнения. Если же в знаковом разряде получается единица, то переполнения нет. В этом случае делимое должно быть восстановлено. Для этого к находящемуся в АН числу прибавляется модуль В. После этого в регистрах А и С делается сдвиг на один разряд влево, из счетчика вычитается единица и цикл окончен.

Второй цикл начинается аналогично. Из числа в регистре АН вычитается модуль делителя и получается второй остаток. От его знака зависит не только очередная цифра частного, но и дальнейшие действия в данном цикле. При положительном остатке числа в регистрах А и С сдвигаются влево, из счетчика вычитается единица и цикл окончен. Если же остаток отрицателен, то к нему прибавляется модуль делителя, вследствие чего он опять становится положительным. Только после этого происходит сдвиг. Таким образом, сдвигается только положительный остаток; из разрядной сетки при сдвиге выходит нуль.

Последующие циклы происходят аналогично. Последний, n -ый цикл выполняется не полностью, без сдвига. Последний остаток должен получиться со знаком "плюс", так как при делении модулей отрицательный остаток не имеет смысла. Следовательно, при получении отрицательного остатка в последнем цикле тоже выполняется микрооперация "восстановления", хотя и без последующего сдвига.

После этого остатку в регистре АН присваивается верный знак, т.е. знак делимого. а частному в регистре С присваивается знак, определяемый логическим путем, как было сказано раньше. Чтобы иметь возможность выполнить эти микроопераций, необходимо до конца сохранять первоначальный знак делимого, временно записав его знаковую цифру, например в триггер SF. Пример основной части процесса деления чисел А = - 43 и В = 6 показан в таблице 22.1.

Таблица 22.1

Схема микропрограммы деления с восстановлением остатка показана на рис. 22.1. Предполагается, что к началу операции делимое и делитель уже находятся в соответствующих регистрах, а чтобы не путать временно сохраняемый знак делимого со знаком результата, ячейка временного хранения обозначена TS (trigger of sign).

Рис. 22.1

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

.

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

.

Нетрудно заметить, что эти две формулы равносильны. Таким образом, второй алгоритм позволяет уменьшить общее число операций сложения-вычитания и тем самым ускорить выполнение макрооперации деления. Отметим, что это достигается без существенного усложнения аппаратуры. Цена, которую приходится заплатить за отказ от операции восстановления остатка, - добавление в схему управления одного триггера, который должен хранить до следующего рабочего цикла требование замены вычитания на сложение. Введем для этого триггера условное обозначение Т.

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

Числовой пример деления без восстановления остатка приведен в таблице 22.2. Показан только процесс обработки модулей. |A| = 33; |В| = 5.

Таблица 22.2

Схема микропрограммы деления без восстановления остатка показана на рис. 22.2.

Рис. 22.2

Из сравнения микропрограмм на рисунках 22.1 и 22.2 еще не видно преимуществ второго варианта. Напротив, схема на рис. 22.2 сложнее, а что касается числа последовательно выполняемых в каждом цикле операций, то оно в обоих вариантах одинаково и равно трем. Однако можно слегка изменить схему второго алгоритма, совместив во времени запись в младший бит частного и установку триггера Т со сдвигом А и С и с декрементом счетчика. В качестве триггера Т при этом целесообразно использовать младший разряд частного (только теперь нулевое значение С [0] нужно интерпретировать, как единичное состояние триггера Т ).

С учетом сказанного скорость выполнения деления во втором варианте получается выше примерно на 30%. Это настолько чувствительный выигрыш, что на практике применяется только вариант без восстановления остатка.

Необходимо сделать оговорку относительно используемых нами понятий и обозначений вроде “триггер Т”, “флаг переноса CF” и т.п. Они нужны здесь для того, чтобы сделать изложение микропрограмм понятным. В действительности признаки результата операции, т.е. собственно “флаги” могут принимать требуемое состояние только в конце микропрограммы, или вообще оставаться в произвольном состоянии. Это зависит от назначения и вида процессора, формата числа и требований ассемблера. В то же время логические переменные, определяющие то или иное продолжение процесса, могут задаваться как арифметическим блоком процессора, так и блоком микропрограммного управления.

Содержание

Hosted by uCoz