х
- Исходное
значение х размещается в вершине стека сопроцессора в регистре
и должно
лежать в диапазоне
х 1.
у
х в регистре
Эта команда
может быть
для вычисления различных показательных функций
(например, далее
как она используется для возведения числа в степень).
Единица вычитается для того, чтобы получить точный результат, когда значе-
ние х близко к
Вспомните, что нормализованное число всегда содержит
в качестве первой
цифры единицу. Поэтому, если в результате вычисле-
ния функции Т
число
то команда F2XM1, вычитая 1
из этого числа и
нормализуя результат, формирует больше значащих цифр,
то есть делает его
точным. Неявное вычитание единицы командой
ком-
пенсируется
FADD с единичным операндом.
492 Глава
Архитектура и программирование сопроцессора
Команда
— команда вычисления значения функции 2 у
Исход-
ное значение х размещается в вершине стека сопроцессора, а исходное значение
у — в регистре
Значение х должно лежать в диапазоне 0 х
а значение
у — в диапазоне
Перед тем как осуществить запись результата z в вер-
шину стека, команда
выталкивает значения х и у из стека и только после
этого производит запись z в регистр
Команды сопроцессора F2XM1 и
очень полезны, в частности, для реализа-
ции операции возведения в степень любого числа по любому основанию. Спе-
циальной команды в сопроцессоре для возведения в степень нет. Поэтому про-
граммисту нужно искать подходящую формулу приведения, которая позволит
реализовать отсутствующую операцию имеющимися программно-аппаратными
средствами сопроцессора. Возведение в произвольную степень числа с любым ос-
нованием производится по формуле:
Вычисление значения выражения у •
для любого у и х О производится
специальной командой сопроцессора
рассмотренной ранее. Вычисление 1
х
производится командой
(лишнее вычитание единицы пока не замечаем, так
как его всегда можно компенсировать сложением с единицей). Но в последнем
действии есть тонкий момент, который связан с тем, что величина аргумента х долж-
на лежать в диапазоне: -1
1. А как быть в случае, если х превышает это значе-
ние (например,
При вычислении выражения 3 •
командой
вы
получите в стеке значение 12. Попытка вычислить значение
командой F2XM1 ни
к чему не приведет — результат окажется неопределенным (по моим наблюдени-
ям, значение
попросту не изменяется). В этой ситуации логично вспомнить
о другой команде сопроцессора, FSCALE, которая также вычисляет значение выра-
жения Т, но для целых значений х со знаком. Применив формулу
= •
по-
лучаем решение проблемы. Разделяем дробный показатель степени, больший |1|,
на две части — целую и дробную. После этого вычисляем отдельно командами
FSCALE и F2XM1 степени двойки и перемножаем результаты (не забываем компен-
сировать вычитание единицы в команде
последующим сложением резуль-
тата с единицей).
Далее представлен обобщенный алгоритм вычисления степени произвольного
числа х по произвольному показателю у (он не претендует на оптимальность ре-
шения; его основное назначение — раскрытие принципов реализации этой опера-
ции).
Загрузить в стек основание степени х.
2. Загрузить в стек показатель степени у и проверить его знак. Если у < О, то за-
помнить этот факт (для шага 8) и заменить в стеке значение у его модулем (это
следует из формулы
=
3. Командой FYL2X вычислить значение выражения z = у
4. Проверить z:
П если значение
то обозначить z как
п если значение \z\ > 1, то представить z в виде двух слагаемых г\ +
где —
целое значение, a z2 — значение меньше единицы (например, число 16,84
Система команд сопроцессора 493
следует
в виде суммы 16 + 0,84); в программе это можно выпол-
нить путем
вычитания единицы из начального значения г до
тех пор, пока оно не станет меньше единицы (количество вычитаний нужно
запомнить,
через п).
5. Выполнить команду
с аргументом z2.
6. Выполнить
FLD1 и FADD, компенсирующие единицу, которая была вы-
чтена из
функции
на шаге 5 командой
7. Выполнить
FSCALE с аргументом zl. Переменную
нужно инициали-
зировать нулем,
позволит получить корректный результат, даже если ис-
ходное значение z было меньше единицы.
8. Перемножить
полученные на шагах 6 и 7, — в вершине стека ока-
жется результат
в степень. Если показатель степени, проверяемый
на шаге 2, был
необходимо единицу разделить на этот резуль-
тат. Для этого в
загружаем единицу командой FLD1 и применяем команду
FDIV.
Данный алгоритм
программа листинга
Листинг
Возведение числа в произвольную степень
db
0
2.0
proc
masm
model
flag
dd
у dt
x dt
. code
main
mov ax
mov ds
f i n i t
у
x
ftst
f
sahf
jnc ml
inc flag
fabs
ml: fxch
fyl2x
fst st(l)
fabs
;сравним |z|
fcom
f stsw
sahf
jnc
small
данных
степени
степени
процедуры main
@data
ах
ах
переход, если х >=0
flag, если х<0
с единицей:
ax
не сравнимы
1 |z|то переход на тЗ
то приводим к формуле z=zl+z2, где zl - целое,
f дробное и z2xor ecx,
вычитаний
494 Глава 17. Архитектура и программирование сопроцессора
Листинг
st(l), st(0)
ax
не сравнимы
jz
jnc ra2 ;если |z| jmp
;если
то переход на
mov
1
jmp $+7
mov
ecx
1
степени
fscale
fldl
fscale
fxch
на отрицательную степень
cmp flag, 1
jnz exit
fldl
fxch
fdiv
e x i t :
mov ax,
int
main endp
end main
Используя тождество
-
•
можно вычислить логарифм
любого числа по любому основанию. Значения
и некоторых дру-
гих логарифмических функций вычисляются соответствующими командами со-
процессора: FLDL2T, FLDL2E,
FLDLN2.
Еще одна команда FYL2XP1 — команда вычисления значения функции z =
у
+
Исходное значение х размещается в вершине стека сопроцессора —
регистре
а исходное
у — в регистре
х должно лежать
в диапазоне 0 \х\ 1
, а значение у — в диапазоне
у
Перед тем
как записать результат z в вершину стека — регистр ST(0), команда FYL2XP1 вытал-
кивает из стека значения х и у.
Очень интересную программу можно найти среди файлов, прилагаемых к кни-
ге, в подкаталоге
каталога данной главы. Программа преобразует содер-
жимое вершины стека в символьный вид и выводит его на экран. В этом примере
иллюстрируется работа многих уже рассмотренных команд.
0> Do'stlaringiz bilan baham: |