7.7.2. Команды управления

Команды управления микросхемы 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