Арифметические команды

      Настоящим "сердцем" микросхемы 8087 является блок выполнения

    арифметических команд.  Сопроцессор 8087 быстро и точно выполняет

            Microsoft (R) Macro Assembler Version 5.00                4/2/89 16:07:21

            Фиг. 7.16 Арифметические команды сопроцессора 8087        Page     1-1

 

                                          PAGE  ,132

                                          TITLE Фиг. 7.16 Арифметические команды сопроцессора 8087

 

             0000                   CODE  SEGMENT

                                          ASSUME      CS:CODE,DS:CODE

 

             0000                   WORD_INTEGER      LABEL WORD

             0000                   SHORT_INTEGER     LABEL DWORD

             0000                   SHORT_REAL  LABEL DWORD

             0000                   LONG_REAL   LABEL QWORD

 

             0000  9B D8 C1               FADD  st(0),ST(1)

             0003  9B D8 C2               FADD  st(0),ST(2)

             0006  9B D8 C2               FADD  ST(0),ST(2)

             0009  9B DC C2               FADD  ST(2),ST(0)

             000C  9B DE 06 0000 R              FIADD WORD_INTEGER

             0011  9B DA 06 0000 R              FIADD SHORT_INTEGER

             0016  9B D8 06 0000 R              FADD  SHORT_REAL

             001B  9B DC 06 0000 R              FADD  LONG_REAL

             0020  9B DE C2               FADDP ST(2),ST(0)

             0023  9B D8 E2               FSUB  st(0),ST(2)

             0026  9B DE 26 0000 R              FISUB WORD_INTEGER

             002B  9B DE EA               FSUBP ST(2),ST(0)

             002E  9B DC E2               FSUBR ST(2),ST(0)

             0031  9B DA 2E 0000 R              FISUBR      SHORT_INTEGER

             0036  9B DE E2               FSUBRP      ST(2),ST(0)

             0039  9B D8 0E 0000 R              FMUL  SHORT_REAL

             003E  9B DE 0E 0000 R              FIMUL WORD_INTEGER

             0043  9B DE CA               FMULP ST(2),ST(0)

             0046  9B D8 F2               FDIV  ST(0),ST(2)

             0049  9B DA 36 0000 R              FIDIV SHORT_INTEGER

             004E  9B DE FA               FDIVP ST(2),ST(0)

             0051  9B D8 FA               FDIVR st(0),ST(2)

             0054  9B DE 3E 0000 R              FIDIVR      WORD_INTEGER

             0059  9B DE F2               FDIVRP      ST(2),ST(0)

 

             005C                   CODE  ENDS

                                          END

 

            Фиг. 7.16 Арифметические команды сопроцессора 8087

    вычислительные операции, и не только четыре основных действия -

    сложение, вычитание, умножение и деление, но также трансцендентные

    и тригонометрические функции.

 

      На Фиг. 7.16 показан ассемблерный листинг программы, состоящей

    из некоторых команд для выполнения основных четырех действий.

    Данный пример иллюстрирует только работу команды FADD, во всех

    возможных комбинациях.  Прежде чем рассматривать команды, разберем

    возможные варианты их работы.  Как видно из Фиг. 7.17, существует

    пять различных методов выполнения арифметических команд.  На

    Фиг. 7.17а показаны пять способов использования данных в

    арифметических командах.  В случае 1 указывается только код

    операции команды.  В операции принимают участие вершина стека и

    элемент ST1, а результат замещает вершину стека.  Заметим, что на

    Фиг. 7.17а приведены примеры для каждого случая с использованием

    команды сложения.  На рисунке также показаны схемы выполнения

    вычислительных операций.

      Случай 2 иллюстрирует операцию, выполняемую с двумя регистрами

    стека сопроцессора 8087.  Одним из этих регистров должна быть

    вершина стека.  Если вершина стека - приемник результата, ее можно

    не упоминать, указав только регистр источника.  Если же приемником

    результата служит какой=то другой регистр, нужно указывать и

    источник, и приемник.

 

      Форма команды           Пример FADD      Действие

     -----------------------------------------------------------------

     1. Fop             FADD        ST0<-ST0+ST1

     2. Fop STi         FADD  ST2   ST0<-ST0+STi

      Fop   ST0,STi     FADD  ST0,ST2 ST0<-ST0+STi

      Fop   STi,ST0     FADD  ST2,ST0 ST2<-ST0+ST2

     3. FopP      STi,ST0     FADDP ST2,ST0 ST2<-ST0+ST2,Извлечь из стека

     4. Fop вещ.пам.    FADD  ВЕЩЕСТ      ST0<-ST0+ВЕЩЕСТ

     5. Flop      целоеПам    FIADD ЦЕЛОЕ ST0<-ST0+ЦЕЛОЕ

                        (a)

 

            Операция          Действие

            ----------------------------------------------------------

            ADD         назначение <- назначение + источник

            SUB         назначение <- назначение - источник

            SUBR        назначение <- источник - назначение

            MUL         назначение <- назначение * источник

            DIV         назначение <- назначение / источник

            DIVR        назначение <- источник / назначение

            ----------------------------------------------------------

                        (b)

 

       Фиг. 7.17 Арифметические операции (a) Комбинации данных

      (b) Арифметические функции для NDP 8087

 

      Случай 3 представляет собой стековую операцию.  Команда такого

    формата выполняет операцию с двумя стековыми операндами, а затем

    уничтожает вершину стека.  Так как данные из вершины стека

    извлекаются из него после операции, она не может быть приемником

    результата этой операции.  Если приемник результата - элемент ST1,

    то операция становится классической стековой.  Классическая

    стековая операция удаляет из вершины стека два верхних элемента,

    использует их в требуемой операции, а затем помещает результат

    назад в стек.  Конечно в качестве приемника результата этой

    операции может быть указан любой из регистров.

 

      Два оставшихся варианта используют операнды в памяти.  В случае

    4 операнд в памяти - это короткое или длинное действительное число.

    В случае 5 операнд - это короткое целое или целое слово.

 

      Вернувшись к Фиг. 7.16 можно заметить, что в команде FADD

    определены только четыре операнда в памяти.  Это два целых числа -

    короткое и слово, и два действительных числа - короткое и длинное.

    Арифметические команды не могут непосредственно работать с

    десятичным, длинным целым и временным действительным форматами

    чисел, и перед использованием их в счете программа должна загрузить

    такие числа в регистр.

 

      На Фиг. 7.17 показаны шесть существующих арифметических команд.

    В процессоре 8087 стандартные четыре арифметические операции

    дополнены обратными операциями деления и вычитания.  Поскольку

    сложение и умножение коммутативны, обратных операций для них

    вводить не надо; порядок же операндов у вычитания и деления

    критичен.  И иногда бывает, что число, находящееся в регистре

    источника - не то число, которое нужно вычитать из

    регистра=приемника; в этом случае вычитание правильно выполнит

    обратная операция.

Hosted by uCoz