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



         

Синус угла - часть 6


        -----------------------------------------------------
         0  0    0    0     PI/4  SIN(R)
         0  0    1    PI/4  PI/2  COS(PI/4-R)
         0  1    0    PI/2  3*PI/4      COS(R)
         0  1    1    3*PI/4      PI    SIN(PI/4-R)
         1  0    0    PI    5*PI/4      - SIN(R)
         1  0    1    5*PI/4      3*PI/2      - COS(PI4-R)
         1  1    0    3*PI/2      7*PI/4      - COS(R)
         1  1    1    7*PI/4      2*PI  - SIN(PI/4-R)
 
                  (R - остаток, 0<R<PI/4)
        -----------------------------------------------------
 
                 Фиг. 7.28 SIN(X) в восьми секторах
 
      Программа проверяет разряд C1 в регистре состояния, чтобы
    определить, должна ли она использовать остаток R, или его надо
    вычесть из PI/4.  Так как PI/4 еще находится в одном из регистров,
    это сделать просто.  Если вычитание не требуется, команда FCOMP
    удаляет из стека ненужное значение PI/4.
 
      Затем команда FPTAN вычисляет частичный тангенс.  Результат
    работы команды показан, как OPP/ADJ (сокращения от английских слов
    Opposite (противоположный) и Adjacent (соседний)), что равно
    тангенсу угла R или PI/4-R, в зависимости от того, что было
    выбрано.  С помощью этих двух чисел теперь можно опеределить синус
    или косинус угла.  Например, синус, заданный парой чисел OPP/ADJ,
    можно вычислить по формуле
 
      SIN(X) = OPP/SQR(OPP**2+ADJ**2), где TAN(X) = OPP/ADJ
 
      Чтобы вычислить косинус, нужно числитель заменить на ADJ.  Мы
    решаем, нужен ли синус или косинус, анализируя запомненные
    описатели октанта, т.е.  проверяя значения разрядов C3 и C1.
    Команда TEST выделяет эти значения, а команда JPE делает переход,
    если они оба нулевые или оба единичные.  В этом случае мы вычисляем
    синус; если же они различны, мы вычисляем косинус, что достигается
    заменой местами значений OPP и ADJ в стеке регистров.
 
      Далее следующие команды сопроцессора 8087 вычисляют значение
    синуса (или косинуса) по значению частичного тангенса.
    Единственный шаг, который еще надо выполнить - это определение
    окончательного знака результата.  В случае синуса результат
    отрицателен, если угол находится в октантах от четвертого до
    седьмого.  Проверка разряда C0 определяет верный знак результата.
    Затем программа FLOAT_ASCII, показанная на Фиг. 7.25, печатает
    число в плавающем формате.      Управление возвращается назад, к началу
    цикла, если еще не пройдены все октанты.  Нижняя часть Фиг. 7.27
    иллюстрирует результат выполнения этой программы.



Содержание  Назад  Вперед