Assembler для начинающих


Степенные и тригонометрические функции



Степенные и тригонометрические функции


      Оставшаяся группа команд сопроцессора 8087 выполняет вычисления
    сложных математических функций.  Эти команды позволяют микросхеме
    8087 вычислять арифметические выражения, требующие логарифмов,
    экспонент и тригонометрических функций.  На Фиг. 7.22 изображен
    список этих команд.  В этом списке нет тех операций, которые есть у
    карманного калькулятора.  Конструкторы процессора 8087 не смогли
    реализовать все нужные функции на одном кристале, так как это
    оказалось слишком сложным.      Вместо этого они создали набор функций
    более низкого уровня, из которых можно программно построить функции
    калькулятора.  Например, таких тригонометрических функций как синус

           Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:04:28


           Фиг. 7.22 Арифметические команды над вершиной стека 8087     Page   1-1
 
                                         PAGE    ,132
                                         TITLE   Фиг. 7.22 Арифметические команды над вершиной стека 8087
 
            0000                   CODE    SEGMENT
                                         ASSUME  CS:CODE,DS:CODE
 
            0000  9B D9 FA                     FSQRT
            0003  9B D9 FD                     FSCALE
            0006  9B D9 F8                     FPREM
            0009  9B D9 FC                     FRNDINT
            000C  9B D9 F4                     FXTRACT
            000F  9B D9 E1                     FABS
            0012  9B D9 E0                     FCHS
            0015  9B D9 F2                     FPTAN
            0018  9B D9 F3                     FPATAN
            001B  9B D9 F0                     F2XM1
            001E  9B D9 F1                     FYL2X
            0021  9B D9 F9                     FYL2XP1
 
            0024                   CODE    ENDS
                                         END
 
          Фиг. 7.22 Арифметические команды над вершиной стека 8087
    и косинус нет; вместо этих функций есть функция частичного
    тангенса.  Эта функция вычисляет отношение, равное тангенсу угла.
    Из этого отношения программа может определить синус, косинус,
    тангенс и любую другую тригонометрическую функцию.      Из обратных
    тригонометрических функций есть операция частичного арктангенса,
    которая берет значения отношения чисел и вычисляет угол этого
    тангенса.  Эта частичная функция позволяет сконструировать
    арксинус, арккосинус и другие функции, не имея их в явном виде.
      Ниже приведен список команд этой группы с коротким комментарием
    работы каждой команды.  Ни у одной из этих команд не пишутся
    операнды, так как все они работают с вершиной стека, и возможно,
    также с элементом ST1.
 
      FSQRT   (квадратный  корень)
      ST    квадратный корень из (ST)
      ST      должно быть неотрицательно.
      FSCALE  (масштабирование) ST <- ST * 2ST1
 
      Эта команда необходима для возведения в степень.  Другая, и
    притом единственная, функция возведения в степень имеет ограничения
    на значение показателя.  Эта команда возводит 2 в степень, равную
    целому числу.  Далее будет приведен пример возведения 10 в
    произвольную степень.
      FPREM (частичный остаток)
      ST <- ST mod ST1  (частичный)
 
      Полностью операцию деления по заданному модулю команда FPREM не
    выполняет.    Эта команда за один раз уменьшает содержимое вершины
    стека максимум на 264.  Команда выполняет нахождение истинного
    остатка и требует очень много времени для уменьшения большого числа
    по очень маленькому основанию.  Максимально уменьшая число в
    течение каждого выполнения команды, программист может разрешить
    прерывания в течение всей операции поиска остатка.      Если функция не
    завершена, команда FPREM устанавливает флаг C2 равным 1, а когда
    завершает вычисление остатка, то устанавливает другие три флага C3,
    C1 и C0 равными трем младшим битам частного.  Когда команда FPREM
    используется в тригонометрических примитивах для ограничения
    величины угла, это оказывается необходимым для определения октанта
    первоначального угла.  Чтобы продемонстрировать работу этой
    команды, мы далее приведем пример тригонометрических вычислений.
 
      FRNDIN         T  (округление до целого)
          ST <- Integer(ST)
 
      Эта команда округляет текущее содержимое вершины стека до
    целого числа.  Текущее управляющее слово определяет направление
    округления.
 
      FXTRACT    (извлечение)
           ST <- дробная часть ST
           ST1   показатель степени двойки ST
      Эта команда разбивает текущую вершину стека на компоненты.
    Аргументом этой функции является вершина стека.  Значение
    показателя степени замещает содержимое вершины стека, а затем
    дробная часть аргумента помещается в стек и становится новой
    вершиной стека.  Действия этой команды FXTRACT обратны действиям
    команды FSCALE.  Если в вершине стека находится некоторое число, то
    выполнение последовательно команд FXTRACT и FSCALE оставляет в
    вершине стека то же число.      Но команда FSCALE не удаляет из стека
    показатель степени, так что теперь в стеке дополнительно окажется
    еще одно число.
 
      FABS   (абсолютная величина)
        ST <- абсолютное значение ST
 
      Эта команда устанавливает у числа в вершине стека знаковый
    разряю в нуль (что соответствует положительному значению).
 
      FCHS   (смена знака)
        ST <- -ST
 
      Эта команда изменяет знак у вершины стека.
 
      Следующие команды выполняют также трансцендентные функции, как
    тригонометрические, а также логарифмические и возведение в степень.
 
      FPTAN  (частичный тангенс)
        ST <- X
        ST1 <- Y, где Y/X = TAN(угол)
 
      Эта команда позволяет вычислить все тригонометрические функции.
    Исходное число - угол, выраженный в радианах, значение которого
    должно быть в интервале 0 < угол < PI/4, - помещается в вершину
    стека.  Уменьшить угол до правильного значения можно с помощью
    команды FPREM.  Результатом является отношение Y/X, которое равно
    тангенсу угла; Y замещает вершину стека, а затем в стек помещается
    X.      Другие тригонометрические функции можно вычислить с
    использованием этих значений; например, косинус COS(угол) =
    X/SQRT(X2 + Y2).
 
      FPATAN      (частичный арктангенс)
         ST <- Arctan(Y/X) = Arctan(ST1/ST)
 
      Эта функция дополняет предыдущую, FPTAN.  Команда FPATAN
    вычисляет угол в соответствии с отношением чисел ST1 и ST0.  Она
    извлекает из стека число X, а затем записывает результирующий угол
    вместо числа Y в качестве новой вершины стека.  Исходные значения
    должны подчиняться неравенству
 
      0 < Y < X < бесконечность
      F2XM1  (два в степени X минус 1)
         ST <- 2ST - 1
 
      Эта функция выполняет возведение в степень; она возводит 2 в
    степень, указанную в вершине стека.  Исходное число должно
    находиться в диапазоне 0 <= ST <=0.5, и чтобы вычислить два в
    степени, большей 0.5, эту команду нужно использовать вместе с
    командой FSCALF.  С помощью команд FLD, загружающих специальные
    константы, программа может возвести в заданную степень также числа,
    отличные от 2, для этого используются следующие формулы:
 
      10**X = 2**(X*Log2(10))
      e**X = 2**(X*Log2(e))
      Y**X = 2**(X*Log2(Y))
 
      Далее приводится пример возведения 10 в произвольную степень.
 
      FYL2X (Y умножить на логарифм по основанию 2 от X)
         ST <- Y*Log2(X) = ST1*Log2(ST)
 
      Эта функция выполняет операцию логарифмирования.  Она берет
    логарифм по основанию 2 от содержимого вершины стека и затем
    умножает его на элемент ST1.  Команда FYL2X извлекает из стека
    число X и замещает результат числом Y.  Исходные числа должны
    удовлетворять следующим соотношениям:
 
      0 < X < бесконечности и - бесконечность < Y < бесконечности.
    Эта функция позволяет вычислять логарифмы и по основаниям, отличным
    от 2.  Следующая формула:
 
      Logn(2) * Log2(X)
 
      вычисляет логарифм числа X по основанию n; значение Logn2
    вычисляется как 1/(Log2n).
 
      FYL2XP1  (Y умножить на логарифм по основанию 2 от X+1)
          ST <- Y*Log2(X+1) = ST1*Log2(ST+1)
 
      Эта функция идентична функции FYL2X за исключением того, что к
    X прибавляется 1.  Функция FYL2XP1 накладывает более жесткие
    ограничения на X, и предназначена для вычисления логарифмов чисел,
    значения которых очень близки к 1.    Эта функция дает наиболее
    высокую точность, если
 
      0 < ABS(X) < 1 - (корень из 2 )/2




Содержание раздела