logo

Главная Внутренние регистры Регистр состояния FPU

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

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

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

 

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

Рис. 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

FCOM, FCOMP, FCOMPP, FTST, FUCOM, FUCOMP, FUCOMPP, FICOM, FICOMP

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

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

0 или #IS1

FCOMI, FCOMIP, FUCOMI, FUCOMIP

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

#IS1

FXAM

класс операнда

знак

FPREM, FPREM1

Q2

Q1

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

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

Q0 или #IS1

FIST, FISTP, FBSTP, FRNDINT, FST, FSTP, FADD, FADDP, FCMOVcc, FIADD, FMUL, FMULP, FIMUL, FDIV, FDIVP, FDIVR, FDIVRP, FIDIV, FIDIVR, FSUB, FSUBP, FISUB, FSUBR, FSUBRP, FISUBR, FSCALE, FSQRT, FPATAN, F2XM1, FYL2X, FYL2XP1

неопределено

округление4 или #IS1

FPTAN, FSIN, FCOS, FSINCOS

неопределено

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

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

FCHS, FABS, FXCH, FINCSTP, FDECSTP, FLDconst (FLD1, FLDL2E, FLDL2T, FLDLG2, FLDLN2, FLDPI, FLDZ), FXTRACT, FLD, FILD, FBLD, FSTP (extended-real)

неопределено

0 или #IS1

FLDENV, FRSTOR

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

FFREE, FLDCW, FSTENV/FNSTENV, FNOP, FSTCW/FNSTCW, FSTSW/FNSTSW, FCLEX/FNCLEX

неопределено

FINIT/FNINIT, FSAVE/FNSAVE

0

0

0

0

 

Примечания:

  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

C0

CF

C1

Нет

C2

PF

C3

ZF

 

ES (Бит суммарной ошибки, бит 7: Intel287 …),
IR (Флаг запроса прерывания, бит 7: только для 8087)

В сопроцессорах 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). Каждому исключению соответствует свой флаг:

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

 

 

 




Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Top.Mail.Ru       Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники