Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
FNSTENV
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
9B D9 /6 |
FSTENV m14/28byte |
Проверить на наличие отложенных незамаскированных исключений, сохранить среду FPU в m14/28byte и замаскировать все исключения |
8087 |
fstenv [bp] |
D9 /6 |
FNSTENV m14/28byte |
Сохранить среду FPU в m14/28byte и замаскировать все исключения |
8087 |
fnstenv [si] |
Описание:
Команды FSTENV и FNSTENV записывают текущую среду FPU в память, а затем маскируют все исключения. Команда FSTENV, в отличие от FNSTENV, проверяет на наличие отложенных необработанных исключений.
Среда FPU состоит из управляющего слова FPU (CW), слова состояния (SW), слова тэгов (TW) и указателей ошибки для данных и для команды (FDP, FIP).
Формат и расположение сохраняемых в памяти значений зависят, от атрибута размера операнда команды и от текущего режима работы процессора (см. рис. 1.15., … 1.18.).
FSTENV и FNSTENV не сохраняют среду FPU, пока не будут полностью выполнены все предыдущие операции. Таким образом, сохраненная среда отражает состояние FPU после любой предварительно декодированной и выполненной команды.
Команды FSTENV/FNSTENV обычно используются обработчиками исключений, так как обеспечивают доступ указателям ошибки и предотвращают прерывание обработчика, устанавливая маски исключений.
Команды FSTENV/FNSTENV не оказывают влияния ни на какие SIMD-регистры и не сохраняет их состояния.
Операция:
DEST(FPUControlWord) = FPUControlWord;
DEST(FPUStatusWord) = FPUStatusWord;
DEST(FPUTagWord) = FPUTagWord;
DEST(FPUDataPointer) = FPUDataPointer;
DEST(FPUInstructionPointer) = FPUInstructionPointer;
DEST(FPULastInstructionOpcode) = FPULastInstructionOpcode;
CW[5:0] = 111111b;
Особые ситуации защищенного режима:
#GP(0), если операнд-назначение находится в сегменте, запрещенном для записи, если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#NM, если CR0.EM = 1 или CR0.TS = 1.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
#NM, если CR0.EM = 1 или CR0.TS = 1.
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru