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

Настоящим "сердцем" микросхемы 8087 является блок выполнения арифметических команд. Сопроцессор 8087 быстро и точно выполняет вычислительные операции, и не только четыре основных действия - сложение, вычитание, умножение и деление, но также трансцендентные и тригонометрические функции.


Microsoft (R) Macro Assembler Version 5.00                  1/1/80 04:03:56
Фиг. 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 стандартные четыре арифметические операции дополнены обратными операциями деления и вычитания. Поскольку сложение и умножение коммутативны, обратных операций для них вводить не надо; порядок же операндов у вычитания и деления критичен. И иногда бывает, что число, находящееся в регистре источника - не то число, которое нужно вычитать из регистра=приемника; в этом случае вычитание правильно выполнит обратная операция.