Разработка устройств на основе цифровых сигнальных процессоров фирмы Analog Devices с использованием Visual DSP++
Шрифт:
Рис. 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.
Ниже приводится полный список команд ALU в соответствии с принятыми ранее условными сокращениями. Назначение команд очевидно из их записи и комментариев для некоторых из команд. Команды сложения и сложения с переносом:
Команды
вычитания и вычитания с займом:Команды логических операций И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ:
Команды смены знака:
Команды логического отрицания HE:
Команды вычисления абсолютного значения:
Команды инкремента:
Команды декремента:
Команды битовых операций:
Здесь n могут принимать значения от 0 до 15
Команды поразрядного деления:
Команды тестирования результата:
Последняя команда выполняет заданную команду АЛУ, устанавливает флаги и сбрасывает значение результата. Она позволяет тестировать значения в регистрах без изменения содержимого AR или AF. Строка <ALU> — это любая безусловная команда АЛУ, кроме DIVS, DIVQ и дополнительных команд АЛУ с константами.
Для всех приведенных выше команд ALU разрешено использовать следующие операнды:
xop: AX0, АХ1, AR, MR0, MR1, MR2, SR0, SR1; yop: AY0, AY1, AF;
constant: 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767, -2, -3, -5, -9, -17, -33, -65, -129, -257, -513, -1025, -2049, -4097, -8193, -16385, -32768.
Команда DIVS не может использовать регистр AY0 как оператор yop. Коды условия IF соответствуют кодам, приведенным ранее в табличном виде.
Примеры записи команд: