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” и т.п. Они нужны здесь для того, чтобы сделать изложение микропрограмм понятным. В действительности признаки результата операции, т.е. собственно “флаги” могут принимать требуемое состояние только в конце микропрограммы, или вообще оставаться в произвольном состоянии. Это зависит от назначения и вида процессора, формата числа и требований ассемблера. В то же время логические переменные, определяющие то или иное продолжение процесса, могут задаваться как арифметическим блоком процессора, так и блоком микропрограммного управления.