Дополнительные арифметические команды

Тип работы:
Контрольная
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Контрольная работа по теме:

ДОПОЛНИТЕЛЬНЫЕ АРИФМЕТИЧЕСКИЕ КОМАНДЫ

Введение

Дополнительные арифметические команды без явных операндов выполняют действия над содержимым вершины стека, результат помещают туда же БЕЗ МОДИФИКАЦИИ УКАЗАТЕЛЯ СТЕКА.

Ш FABS — нахождение абсолютной величины.

Ш FCHS — изменение знака операнда.

Ш FRNDINT — округление операнда до целого в формате с плавающей точкой.

Ш FSQRT — извлечение квадратного корня.

Ш FPREM — вычисляет остаток от деления содержимого ST (0) на число из ST (1). Остаток замещает число в ST (0).

Ш FSCALE — масштабирование на степень числа 2 — прибавляет целое число из ST (1) к порядку в регистре ST (0), т. е. умножает (или делит) ST (0) на число 2(ST (1)). Эту команду можно использовать для возведения числа 2 в целую степень (положительную или отрицательную).

Ш FXTRACT — разлагает содержимое ST (0) на два числа: несмещенный порядок (замещает старое значение в ST (0)) и знаковую мантиссу (включаемую сверху, т. е. в ST (7)).

Команда FSCALE, находящаяся после команды FXTRACT, восстанавливает исходное число.

Все дополнительные арифметические команды группируются в три группы:

— команды сравнений:

— трансцендентные команды;

— команды управления сопроцессора х87.

1. КОМАНДЫ СРАВНЕНИЙ

Команды сравнений включают:

Ш FCOM ST (i)/mem — сравнивает содержимое ST (0) с операндом «x» (в численном регистре или в памяти), т. е. производит вычитание операндов без запоминания результата и устанавливает коды условий в регистре состояния (таблица 1).

Таблица 1 — Коды условий после сравнения

С3

С0

Условие

0

0

1

1

0

1

0

1

ST (0) > x

ST (0) < x

ST (0) = x

ST (0) и x — не сравнимы

Ш FICOM mem — сравнивает содержи мое вершины стека ST (0) с целым числом в памяти.

Ш FCOMP ST (i)/mem — аналогична команде FCOM, но после сравнения производит извлечение операнда из вершины стека.

Ш FCOMPP ST (i) — сравнивает ST (0) c ST (i) и извлекает из стека оба операнда.

Ш FTST — сравнивает вершину стека с нулем.

Ш FXAM — сравнивает вершину стека с нулем, но выставляет 4 флага условий (в частности, определяется ненормализованная мантисса, бесконечность, нечисло и др.).

Ш FCOMI ST (0), ST (i) — сравнение вещественных чисел и установка флагов в EFLAGS (P6+).

Ш FCOMIР ST (0), ST (i) — сравнение вещественных чисел и установка флагов в EFLAGS и извлечение операнда из вершины стека (P6+).

Флаги условий (С0, С3) сопроцессора х87 используются для организации условных переходов микропроцессором х86. Для этого командой — FSTSW AX — содержимое регистра состояния х87 копируется в аккумулятор АХ микропроцессора х86. После этого командой — SAHF — старший байт аккумулятора (АН) передается в младший байт регистра флагов. При этом условию С0 соответствует флаг СF, а условию С3 — флаг ZF.

2. ТРАНСЦЕНДЕНТНЫЕ КОМАНДЫ

К элементарным трансцендентным функциям относятся:

Ш тригонометрические функции (sin, cos, tg и др.),

Ш обратные тригонометрические функции (arcsin, arctg и др.),

Ш логарифмические функции (log2(x), log10(x), loge(x)),

Ш показательные функции (xy, 2x, 10x, ex),

Ш гиперболические функции (sh, ch, th и др.),

Ш обратные гиперболические функции (arsh, arch, arth и др.).

Таблица 2 — Трансцендентные команды

Мнемоника

Описание команды

Вычисляемая функция

FPTAN

Частичный тангенс

ST (1) / ST (0) = tg (ST (0))

FSIN

Синус (387+)

ST (0) = sin (ST (0))

FCOS

Косинус (387+)

ST (0) = cos (ST (0))

FSINCOS

Синус, косинус (387+)

ST (7) = sin (ST (0));

ST (0) = cos (ST (0))

FPATAN

Частичный арктангенс

ST (0) = arctg (ST (1)/ST (0)

FYL2X

Двоичный логарифм

ST (0) = ST (1) * log2 (ST (0))

FYL2XP1

Двоичный логарифм

ST (0) = ST (1) * log2 (ST (0)+1)

F2XM1

Показательная функция

ST (0) = 2(ST(0)) — 1

Сопроцессор х87 вычисляет любую из элементарных трансцендентных функций от аргументов двойной точности, давая результат двойной точности с ошибкой младшего разряда округления. Аргументы трансцендентных команд должны быть нормализованными.

Команда FPTAN нахождения частичного тангенса в качестве результата выдает два числа (сопроцессоры 87/287):

y / x = tg (ST (0)).

Число «y» заменяет старое содержимое ST (0), а число «x» включается сверху. Поэтому, после выполнения команды указатель стека уменьшится на 1, число «х» будет записано в новую вершину стека ST (0), а число «y» — в регистр ST (1).

Для получения значения тангенса необходимо выполнить команду FDIV. Две команды FPTAN и FDIV выбирают аргумент из вершины стека и туда же помещают значение тангенса (БЕЗ МОДИФИКАЦИИ УКАЗАТЕЛЯ ВЕРШИНЫ СТЕКА). Две команды FPTAN и FDIVR вычисляют значение котангенса.

Для команды FPTAN аргумент задается в радианах и должен находится в диапазоне (сопроцессоры 87/287):

0 <= ST (0) <= ¼.

Для СОПРОЦЕССОРОВ 387+ аргумент команды FPTAN (в радианах) может быть любым:

-263 <= ST (0) <= +264.

Значение тангенса исходного угла tg (ST (0)) замещает аргумент и в стек включается сверху 1,0 (для программной совместимости с предыдущими сопроцессорами 87/287).

Значения остальных тригонометрических функций (для сопроцессоров 87/287) можно вычислить, используя формулы тангенса половинного угла (табл. 3). Поэтому перед началом вычисления тригонометрических функций с использованием команды FPTAN необходимо аргумент в ST (0) поделить на 2. Новое значение аргумента «z» должно также удовлетворять условию: 0 z ¼.

Таблица 3 — Формулы для вычисления тригонометрических функций

3. команды управления сопроцессора х87

В СОПРОЦЕССОРАХ 387+ появились новые команды:

Ш FSIN — вычисление синуса;

Ш FCOS — вычисление косинуса;

Ш FSINCOS — вычисление синуса и косинуса.

Все они воспринимают в ST (0) исходный угол, измеряемый в радианах и находящийся в диапазоне: -263 <= ST (0) <= +263. Команды FSIN и FCOS возвращают результат на место аргумента, а команда FSINCOS возвращает значение синуса на место аргумента и включает значение косинуса в стек.

Команда FPATAN вычисляет arctg (ST (1)/ST (0)). Два операнда извлекаются из стека, а результат включается в стек. Поэтому окончательно, УКАЗАТЕЛЬ СТЕКА УВЕЛИЧИВАЕТСЯ НА 1. Операнды этой команды для сопроцессоров 8087/287 должны удовлетворять условию:

0 < ST (1) < ST (0).

В сопроцессорах 387+ ограничений на диапазон допустимых аргументов команды FPATAN не существует.

Для вычисления остальных обратных тригонометрических функций по аргументу «z» необходимо предварительно подготовить операнды в ST (0) и ST (1) в соответствии с табл. 4 (делить операнды не нужно).

Таблица 4 — Формулы для вычисления обратных тригонометрических функций

Команда FYL2X вычисляет функцию: ST (1) * log2 ST (0). Два операнда извлекаются из стека, а затем результат включается в стек. Поэтому УКАЗАТЕЛЬ СТЕКА УВЕЛИЧИТСЯ НА 1. В команде требуется удовлетворение естественного для логарифмической функции условия:

ST (0) > 0.

Значения других логарифмических функций вычисляются по формулам в табл. 5 с загрузкой в регистр ST (1) необходимых констант командами: FLDLN2 и FLDLG2.

Таблица 5 — Формулы для вычисления логарифмических функций

log2 (x) FLD1; FLD x; FYL2X;

ln (x) = ln (2) * log2 (x) FLDLN2; FLD x; FYL2X;

lg (x) = lg (2) * log2 (x) FLDLG2; FLD x; FYL2X.

Еще одна логарифмическая команда FYL2XP1 вычисляет функцию: ST (1) * log2 (ST (0) + 1). Причина появления этой команды заключается в получении более высокой точности вычисления функции: log (1 + x). Эта функция часто встречается в финансовых расчетах, а также при вычислении обратных гиперболических функций.

Команда показательной функции F2XM1 вычисляет:

F2XM1 [ST (0)] = 2(ST (0)) — 1.

Аргумент показательной функции должен находится в диапазоне: для сопроцессоров 87/287: 0 <= ST (0) <= 0. 5;

для сопроцессоров 387+: -1 <= ST (0) <= +1.

Вычисление функции 2х — 1 вместо функции 2х позволяет избежать потери точности, когда аргумент «х» близок к 0 (а значение функции 2х близко к 1). Остальные показательные функции вычисляются по формулам в табл. 6.

Таблица 6 — Формулы для вычисления показательных функций

2x = [2x — 1] + 1 = F2XM1 (x) + 1;

ex = 1 + [2(x * log2(e)) — 1] = 1 + F2XM1 (x * log2(e));

10x = 1 + [2(x * log2(10))— 1] = 1 + F2XM1 (x * log2(10));

аx = 1 + [2(x * log2(а)) — 1] = 1 + F2XM1 (x * log2(a)).

Таблица 7 — Формулы для вычисления гиперболических функций

Cинус гиперболический

Косинус гиперболический

Тангенс гиперболический

Котангенс гиперболический

Косеканс гиперболический

Секанс гиперболический

Таблица 8 — Формулы для вычисления обратных гиперболических функций

где:

где:

где:

КОМАНДЫ УПРАВЛЕНИЯ СОПРОЦЕССОРОМ х87

Команды управления сопроцессором х87 обеспечивают доступ к нечисловым регистрам. Мнемоники, которые начинаются с FN, соответствуют командам «БЕЗ ОЖИДАНИЯ», т. е. процессор х86 передает их для выполнения в сопроцессор х87, не проверяя занятость сопроцессора и игнорируя численные особые случаи.

Мнемоники без буквы «N» соответствуют командам «С ОЖИДАНИЕМ», т. е. заставляют процессор х86 реагировать на незамаскированные особые случаи и ожидать завершения выполнения команд в сопроцессоре х87. В общем случае, программистам рекомендуется избегать форм команд «без ожидания».

Ш Команда — FNSTCW mem (FSTCW mem) — передает содержимое регистра управления (CW) в ячейку памяти.

Ш Команда — FLDCW mem — загружает регистр управления (CW) из ячейки памяти. Эти две команды применяются для изменения режима работы сопроцессора х87.

Ш Команда — FNSTSW mem (FSTSW mem) — передает содержимое регистра состояния (SW) сопроцессора х87 в ячейку памяти.

Ш Команда — FNSTSW AX (FSTSW AX) — передает содержимое регистра состояния (SW) сопроцессора в регистр AX микропроцессора х86.

Ш Команда — FNCLEX (FCLEX) — сбрасывает в регистре состояния сопроцессора флаги особых случаев, а также биты ES и BUSY. Эти флаги не сбрасываются аппаратно и должны явно сбрасываться программистом.

Ш Команда — FNINIT (FINIT) — инициализирует регистры управления, состояния и тэгов на значения, приведенные в табл. 9. Такое же действие производит аппаратный сигнал сброса — RESET.

Таблица 9 — Инициализация сопроцессора х87

Регистр

Выбор

Режим работы

Регистр управления

(Режим бесконечности)

Проективный — (287)

Афинный — (387+)

Режим округления

Округление к ближайшему

Точность

Расширенная

Все особые случаи

Замаскированы

Регистр

Состояния

Бит занятости

В = 0: Не занят

Код условия

Не определен

Указатель стека

TOP = 000

Бит суммарной ошибки

ES = 0

Регистр тэгов

Все тэги показывают — «пустой»

ПоказатьСвернуть
Заполнить форму текущей работой