Настоящим "сердцем" микросхемы 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 стандартные четыре арифметические операции
дополнены обратными операциями деления и вычитания. Поскольку
сложение и умножение коммутативны, обратных операций для них
вводить не надо; порядок же операндов у вычитания и деления
критичен. И иногда бывает, что число, находящееся в регистре
источника - не то число, которое нужно вычитать из
регистра=приемника; в этом случае вычитание правильно выполнит
обратная операция.