Команды управления микросхемы 8087 ничего не вычисляют, однако они необходимы для управления ее работой. На Фиг. 7.12 показан листинг ассемблера команд управления сопроцессора 8087.
Многие из команд управления могут выполняться без синхронизации с микропроцессором 8088. На Фиг. 7.12 показаны эти команды в форме, ассемблированной с использованием команды WAIT, а код операции в поле комментариев изображает команды без команды WAIT. Ассемблеру сообщается о том, что операция выполняется без ожидания, с помощью символов FN в качестве первых двух символов мнемоники команды.
На Фиг. 7.13 перечислены действия всех команд управления сопроцессором 8087. Команды FENI, FDISI, FCLEX обслуживают особые ситуации в сопроцессоре 8087. В управляющем регистре содержится маска прерываний, которая выделяет те ситуации, которые могут вызвать прерывание. Маской прерываний сопроцессора 8087 в целом управляют команды FENI и FDISI; эти команды аналогичны соответственно командам STI и CLI микропроцессора 8088, за исключением того, что они управляют прерываниями только от сопроцессора 8087. Команда FCLEX сбрасывает биты особых ситуаций регистра состояния. Микросхема 8087 помнит все особые ситуации, так что если последовательность команд возбудила более одного типа ошибки, все эти ошибки будут отмечены в регистре состояния. И команда FCLEX - единственный способ сброса этих флагов.
| Команда | Действие |
|---|---|
| FINIT | Инициализация 8087. Переустановка программ |
| FENI | Освобождение прерываний по исключительным состояниям |
| FDISI | Блокирование прерываний по исключительным состояниям |
| FLDCW | Загрузка управляющего регистра 8087 из памяти |
| FSTCW | Сохранение управляющего регистра 8087 в память |
| FSTSW | Сохранение регистра состояния 8087 в память |
| FCLEX | Очистка индикаторов исключительных состояний |
| FSTENV | Сохранить оборудование 8087 в память |
| FLDENV | Загрузить оборудование 8087 из памяти |
| FSAVE | Сохранить состояние 8087 в память |
| FRSTOR | Загрузить состояние 8087 из памяти |
| FRSTOR | Увеличеть указатель вершины стека |
| FDECSTP | Уменьшить указатель вершины стека |
| FFREE | Освободить регистр стека |
| FNOP | Ничего не делать |
| FWAIT | Идентично WAIT |
Фиг. 7.13 Управляющие действия
Мы уже рассмотрели управляющее слово и слово состояния в составе программной модели сопроцессора 8087. Команды управления FLDCW, FSTCW и FSTSW загружают и сохраняют эти регистры. Рабочая среда сопроцессора 8087 содержит все регистры микросхемы, за исключением стека данных; рабочая среда состоит из 14 байт. Рисунок 7.14 показывает структуру рабочей среды после того, как сопроцессор 8087 записал ее в память. Запись рабочей среды - это обычное действие при обработке особой ситуации в сопроцессоре 8087, так как рабочая среда содержит все данные об особых ситуациях. Один 20-битовый адрес указывает на последнюю команду, которую выполнил сопроцессор 8087. Другой адрес указывает последнюю из вызывавшихся ячеек данных. Код последней выполнявшейся сопроцессором 8087 команды тоже входит в рабочую среду.
| Смещение | Действие | Примечание |
|---|---|---|
| +0 | Управляющее слово | |
| +2 | Слово состояния | |
| +4 | Слово признака | |
| +6 | IP15-0 | Указатель команды |
| +8 | IP19-16 | Указатель команды, Код операции |
| +10 | OP15-0 | Указатель операнда |
| +12 | OP19-16 | Указатель операнда |
Фиг. 7.14 Рабочая среда 8087
Состояние микросхемы 8087 - это рабочая среда вместе с регистрами данных. Так как в сопроцессоре 8087 имеется восемь 10-байтовых регистров, состояние содержит 94 байта. Рисунок 7.15 иллюстрирует структуру состояния сопроцессора 8087, записанного в память. Структура состояния идентична рабочей среде с добавленным в конце регистровым стеком. Программа может записать состояние сопроцессора 8087, когда происходит переключение задач, или если в обработчике прерываний потребуется использование сопроцессора 8087. Когда ранее выполнявшаяся задача снова получает управление, состояние может быть программно восстановлено.
Две команды - FINCSTP и FDECSTP - взаимодействуют с указателем стека; они перемещают его. Все данные в регистрах остаются на местах, т.е. слово "этикеток" не изменяется. Увеличение указателя стека не эквивалентно извлечению данных из стека, так как "этикетка" для этих данных все же показывает, что в регистре есть данные. Попытка загрузить какое-либо число в такой стек приведет к появлению особой ситуации - переполнению стека. Команда FFREE освобождает ячейку стека, устанавливая "этикетку" для этой ячейки так, что она показывает отсутствие данных в ячейке. Но команда FFREE не меняет указатель стека, и если вам просто нужно выбросить верхний элемент из стека, то в большинстве случаев это легче сделать с помощью арифметической команды.
| Смещение | Действие | Примечание |
|---|---|---|
| +0 | Управляющее слово | |
| +2 | Слово состояния | |
| +4 | Слово признака | |
| +6 | IP15-0 | Указатель команды |
| +8 | IP19-16 | Указатель команды, Код операции |
| +10 | OP15-0 | Указатель операнда |
| +12 | OP19-16 | Указатель операнда |
| +14 | Мантисса 15-0 | Элемент вершины стека |
| +16 | Мантисса 31-16 | |
| +18 | Мантисса 47-32 | |
| +20 | Мантисса 63-48 | |
| +22 | Порядок 14-0 | |
| +24 | Мантисса 15-0 | Следующий элемент стека |
| +26 | Мантисса 31-16 | |
| +28 | Мантисса 47-32 | |
| +30 | Мантисса 63-48 | |
| +32 | Порядок 14-0 | |
| ...... | ........ | ........... |
| +84 | Мантисса 15-0 | Последний элемент стека |
| +86 | Мантисса 31-16 | |
| +88 | Мантисса 47-32 | |
| +00 | Мантисса 63-48 | |
| +92 | Порядок 14-0 |
Фиг. 7.15 Состояние 8087