Внутренние регистры: Регистр состояния FPU

Внутренние регистры: Регистр состояния FPU

Регистр состояния FPU (рис. 1.13.) выполняет функции в чем-то аналогичные функциям регистра флагов (E)FLAGS, но только для операций с плавающей точкой. За исключением одного бита (SF), его формат и функции совершенно идентичны для всех сопроцессоров архитектуры x87 (начиная с 8087).

Рис. 1.13. Формат регистра состояния SW (регистра флагов FPU)

B (Бит занятости, бит 15)

Бит занятости сохранен для совместимости с 8087 и Intel287, где он устанавливается в 1, когда сопроцессор выполняет команду, или происходит прерывание в сопроцессоре в результате исключительной ситуации. Если сопроцессор свободен, бит занятости установлен в 0. В современных процессорах (Intel387, Intel486, …) этот бит дублирует состояние бита ES.

TOP (Указатель вершины стека FPU, биты 13, 12, 11)

Содержит номер 80-битного регистра общего назначения, являющегося вершиной стека.

  • 000 – R0;
  • 001 – R1;
  • .
  • 111 – R7.

C0, C1, C2, C3 (Коды условий, биты 8, 9, 10, 14)

Коды условий FPU аналогичны флагам CPU из регистра флагов (E)FLAGS. FPU устанавливает значения этих битов по результатам арифметических операций.

Таблица 1.1. Интерпретация кодов условий

Команда

C0

C3

C2

C1

по результатам сравнения

операнды не сравнимы

неопределено (эти команды влияют на флаги в регистре EFLAGS)

0 – преобра-зование завершено 2

1 – преобра-зование не завершено

округление 4 или #IS 1

1 – недо-пустимое значение операнда-источника 3

округление 4 или #IS 1 (неопреде-лено, если C2=1)

биты загружаются из памяти

Примечания:

  1. В случае возникновения стековой ошибки (#IS), когда устанавливаются биты IE и SF слова состояния SW, бит C1 определяет тип ошибки: переполнение (C1 = 0) или антипереполнение (C1 = 1).
  2. Если в процессе выполнения FPREM или FPREM1 получается остаток меньший чем модуль, то функция считается выполненной и флаг C2 очищается. В противном случае, флаг C2 устанавливается, а результат в ST называется неполным остатком. Программа может перезапускать команду (используя неполный остаток в ST как делимое), пока флаг C2 не будет очищен.
  3. Для команд FPTAN, FSIN, FCOS и FSINCOS флаг C2 устанавливается, если значение операнда находится вне приемлемого диапазона.
  4. В случае возникновения исключения неточный результат (#P), когда устанавливается бит PE слова состояния SW, бит C1 показывает, в какую сторону произведено округление: вверх (C1 = 1) или вниз (C1 = 0).

Команда FSTSW копирует значение слова состояния сопроцессора в регистр AX процессора. Далее командой SAHF можно скопировать флаги C3..C0 в регистр флагов FLAGS.

Таблица 1.2. Соответствие между битами C3..C0 и битами регистра флагов CPU

Флаги FPU

Флаги EFLAGS

В сопроцессорах 8087 этот бит содержит флаг запроса прерывания (IR), который устанавливается в единицу при возникновении какой-либо незамаскированной исключительной ситуации. Значение флага IR повторяется на выводе INT# сопроцессора. Флаг IR может быть замаскирован программно установкой бита IEM регистра управления FPU.

Во всех последующих моделях FPU (Intel287 …) этот бит называется битом суммарной ошибки (ES) и устанавливается в 1 при возникновении какой-либо незамаскированной исключительной ситуации, иначе — очищается. При установленном бите ES, активизируется сигнал на выводе ERROR# (Intel287, Intel387) или FERR# (Intel486 …).

SF (Стековая ошибка, бит 6: Intel387 …)

Eсли исключение недействительная операция (#I) возникает в результате выхода за верхнюю или нижнюю границы регистрового стека (#IS), то устанавливается не только бит 0 (IE) слова состояния, но и бит 6 (SF), при этом бит 9 (C1) указывает на выход за верхнюю границу (переполнение) стека (C1 = 1) или на выход за нижнюю границу (C1 = 0).

В сопроцессорах Intel287 и 8087 этот бит не используется и является зарезервированным.

PE, UE, OE, ZE, DE, IE (Флаги исключительных ситуаций, биты 5, 4, 3, 2, 1, 0)

Устанавливаются в случае возникновения одной из шести особых ситуаций сопроцессора (исключений FPU). Каждому исключению соответствует свой флаг:

  • PE – неточный результат (#P);
  • UE – антипереполнение (#U);
  • OE – переполнение (#O);
  • ZE – деление на нуль (#Z);
  • DE – денормализованный операнд (#D);
  • IE – недействительная операция (#I).

Помимо установки соответствующего флага исключительной ситуации, сопроцессор при возникновении исключения может выдавать или не выдавать сигнал прерывания. Это зависит от состояния соответствующих битов маски исключений регистра управления FPU. В случае, когда бит маски исключения установлен, внешний сигнал не выдается, но флаг исключения все равно устанавливается. Таким образом, используя эффект накопления ошибок, программное обеспечение может замаскировать все исключения до выполнения групповых вычислений, затем произвести вычисления и проверить содержимое всех флагов для выяснения того, какие исключения имели место.

📎📎📎📎📎📎📎📎📎📎