- •2.5 Процессор чисел с плавающей точкой (fpu)
- •2.5.1 История
- •2.5.2 Математический сопроцессор x87 (fpu)
- •2.5.3 Форматы чисел с плавающей точкой
- •2.5.4 Регистры сопроцессора х87
- •2.5.5 Команды сопроцессора х87
- •Команды передачи данных сопроцессора х87
- •Арифметические команды
- •Дополнительные арифметические команды
- •Команды сравнений
- •Трансцендентные команды
- •Команды управления сопроцессором х87
- •2.6 Команды mmx
- •2.7 Команды sse и 3Dnow!
Команды управления сопроцессором х87
Команды управления сопроцессором х87 обеспечивают доступ к нечисловым регистрам. Мнемоники, которые начинаются с FN, соответствуют командам «БЕЗ ОЖИДАНИЯ», т.е. процессор х86 передает их для выполнения в сопроцессор х87, не проверяя занятость сопроцессора и игнорируя численные особые случаи.
Мнемоники без буквы «N» соответствуют командам «С ОЖИДАНИЕМ», т.е. заставляют процессор х86 реагировать на незамаскированные особые случаи и ожидать завершения выполнения команд в сопроцессоре х87. В общем случае, программистам рекомендуется избегать форм команд «без ожидания».
Команда – FNSTCW mem (FSTCW mem) – передает содержимое регистра управления (CW) в ячейку памяти.
Команда – FLDCW mem – загружает регистр управления (CW) из ячейки памяти. Эти две команды применяются для изменения режима работы сопроцессора х87.
Команда – FNSTSW mem (FSTSW mem) – передает содержимое регистра состояния (SW) сопроцессора х87 в ячейку памяти.
Команда – FNSTSW AX (FSTSW AX) – передает содержимое регистра состояния (SW) сопроцессора в регистр AX микропроцессора х86.
Команда – FNCLEX (FCLEX) – сбрасывает в регистре состояния сопроцессора флаги особых случаев, а также биты ES и BUSY. Эти флаги не сбрасываются аппаратно и должны явно сбрасываться программистом.
Команда – FNINIT (FINIT) – инициализирует регистры управления, состояния и тэгов на значения, приведенные в табл. 2.34. Такое же действие производит аппаратный сигнал сброса – RESET.
Таблица 2.34 – Инициализация сопроцессора х87
Регистр |
Выбор |
Режим работы |
Регистр управления |
(Режим бесконечности) |
Проективный – (287) Афинный – (387+) |
Режим округления |
Округление к ближайшему |
|
Точность |
Расширенная |
|
Все особые случаи |
Замаскированы |
|
Регистр Состояния |
Бит занятости |
В = 0: Не занят |
Код условия |
Не определен |
|
Указатель стека |
TOP = 000 |
|
Бит суммарной ошибки |
ES = 0 |
|
Регистр тэгов |
|
Все тэги показывают – "пустой" |
Команда запоминания среды – FNSTENV mem (FSTENV mem) – записывает в память содержимое регистров: управления, состояния, тэгов и указателей особого случая. Формат этой информации в памяти для сопроцессоров 87/287 (и реального режима остальных процессоров) показан на рис. 2.18. (Для сопроцессоров 387+ в защищенном режиме виртуальной адресации при размере операндов 32 бита – все регистры занимают в памяти по 4 байта – старшие 2 байта могут быть нулевыми). Затем инициализируются все регистры так же, как и команда FNINIT.
Команда – FLDENV – загружает среду, ранее запомненную командой FNSTENV. Эти команды применяются в процедурах обработки особых случаев, чтобы получить доступ к указателям особого случая.
-
Нач. адрес
Регистр управления
0
Регистр состояния
2 (4)
Регистр тегов
4 (8)
Указатель команды
6 (12)
Указатель операнда
10 (20)
Рис. 2.18 – Формат памяти
в командах FSTENV, FLDENV
|
|
Нач. адрес |
||||
|
Регистр управления |
0 |
||||
|
Регистр состояния |
2 (4) |
||||
|
Регистр тегов |
4 (8) |
||||
|
|
Указатель команды |
|
6 (12) |
||
|
|
|
|
|||
|
|
Указатель операнда |
|
10 (20) |
||
|
|
|
|
|||
ST(0) |
14 (28) |
|||||
ST(1) |
24 (38) |
|||||
ST(2) |
34 (48) |
|||||
ST(3) |
44 (58) |
|||||
ST(4) |
54 (68) |
|||||
ST(5) |
64 (78) |
|||||
ST(6) |
74 (88) |
|||||
ST(7) |
84 (98) |
Рис. 2.19 – Формат памяти
в командах FSAVE, FRSTOR
Команда – FNSAVE mem (FSAVE mem) – записывает в память содержимое всех регистров сопроцессора. Всего в память передается 94 байта для сопроцессоров 87/287 и реального режима остальных процессоров (см. формат на рис. 2.19) и 108 байтов при 32-х битовых операндах в режиме виртуальной адресации.
Команда – FRSTOR mem – восстанавливает все регистры сопроцессора из памяти. Эти команды в основном применяются для переключения задач.
Команды FINCSTP и FDECSTP осуществляют соответственно инкремент и декремент указателя стека ST. Они не влияют на регистр тэгов и численные регистры.
Команда FFREE ST(i) устанавливает тэг регистра ST(i) на указатель "пустой".
Команда FNOP действует так же, как команда FST ST,ST(0), т.е. не производит никакой операции.
Команда FSETPM переводит сопроцессор х87 в виртуальный режим.