Внутренние регистры: Регистр состояния FPU |
Программирование - Архитектура и система команд микропроцессоров x86 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Регистр состояния FPU (рис. 1.13.) выполняет функции в чем-то аналогичные функциям регистра флагов (E)FLAGS, но только для операций с плавающей точкой. За исключением одного бита (SF), его формат и функции совершенно идентичны для всех сопроцессоров архитектуры x87 (начиная с 8087).
Рис. 1.13. Формат регистра состояния SW (регистра флагов FPU)
Бит занятости сохранен для совместимости с 8087 и Intel287, где он устанавливается в 1, когда сопроцессор выполняет команду, или происходит прерывание в сопроцессоре в результате исключительной ситуации. Если сопроцессор свободен, бит занятости установлен в 0. В современных процессорах (Intel387, Intel486, …) этот бит дублирует состояние бита ES.
TOP (Указатель вершины стека FPU, биты 13, 12, 11) Содержит номер 80-битного регистра общего назначения, являющегося вершиной стека.
C0, C1, C2, C3 (Коды условий, биты 8, 9, 10, 14) Коды условий FPU аналогичны флагам CPU из регистра флагов (E)FLAGS. FPU устанавливает значения этих битов по результатам арифметических операций.
Таблица 1.1. Интерпретация кодов условий
Команда FSTSW копирует значение слова состояния сопроцессора в регистр AX процессора. Далее командой SAHF можно скопировать флаги C3..C0 в регистр флагов FLAGS.
Таблица 1.2. Соответствие между битами C3..C0 и битами регистра флагов CPU
ES (Бит суммарной ошибки, бит 7: Intel287 …), В сопроцессорах 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