Рис. 14.4. Операция DIVQ
Пусть NL — число разрядов влево и NR — число разрядов вправо от двоичной точки делимого, DL и DR — соответственно то же самое, только для делителя. Тогда частное состоит из NL-DL+1 битов слева от двоичной точки и содержит NR-DR-1 битов справа. Ниже показан пример формата чисел при выполнении операции деления.
Делимое: XXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXX
NL=5 бит NR=27 бит
Делитель: XX.XXXXXXXXXXXXXX
DL=2 бит DR=14 бит
Частное: XXXX.XXXXXXXXXXXX
(NL-DL+1)=4 бит (NR-DR-1)=12 бит
Иногда необходимо некоторое изменение формата делимого и делителя. Например, если оба операнда знаковые и дробные (делимое в формате 1.31, а делитель в формате 1.15), то результат запишется в формате 1.15. Таким образом, для получения правильного результата операции деления необходимо, чтобы делимое было меньше делителя.
Чтобы разделить два целых числа (делимое в формате 32, а делитель в формате 16), необходимо перед делением привести делимое к формату 31, т.е. сдвинуть его влево на один разряд. Если результат не может быть представлен в формате частного, как сказано выше, или когда делитель равен нулю или меньше делимого по абсолютному значению, происходит переполнение.
При реализации алгоритма деления для знаковых операндов делитель должен храниться в AX0 и AX1 или в любом регистре с шины R. Старшее слово делимого может быть загружено в AY1 или AF, и младшее слово делимого загружается в AY0. Чтобы вычислить частное, сначала выполняется команда DIVS, которая вычисляет знак частного, за которой следуют 15 команд DIVQ, для вычисления 15 бит частного. Пример подпрограммы знакового деления с фиксированной точкой показан ниже. Эта подпрограмма берет делитель из регистра AX0, старшее слово делимого из AF и младшее слово делимого из AY0. Частное возвращается в AY0.
.MODULE Sig_Div_FP; {
Входные данные:
AF = старшее слово делимого
AY0 = младшее слово делимого
AX0 = 16-битный делитель
Выходные данные:
AY0 = 16-битный результат
Изменяемые регистры:
AY0, AF
Время вычисления=17 циклов
}
.ENTRY sdivfp;
sdivfp: DIVS AF, AX0; {Вычисление знакового бита}
DIVQ AX0; DIVQ AX0; DIVQ AX0; {Вычисление 15 бит частного}
DIVQ AX0; DIVQ AX0; DIVQ AX0;
DIVQ AX0; DIVQ AX0; DIVQ AX0;
DIVQ AX0; DIVQ AX0; DIVQ AX0;
DIVQ AX0; DIVQ AX0; DIVQ AX0;
RTS;