![]() |
|
|
![]()
|
|
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Заметил в Intel Fortran, что статусное слово FPU "ведет" себя по-разному (для одной и той же программы) в Debug и Release-сборках, т.е. зависит от опций компилятора.
Каким образом это происходит? |
|||
|
||||
| sgi1981 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 16.3.2006 Репутация: 2 Всего: 10 |
В FPU есть три служебных регистра: swr (Status Word Register), cwr (Control Word Register), twr (Tags Word Register).
Управляет FPU регистр cwr. Интерес представляют его шесть масок исключений (биты 0...5). Эти исключения: недействительная операция, денормализованный операнд, ошибка деления на нуль, ошибка переполнения, ошибка антипереполнения, ошибка точности. Каждая маска исключения может быть установлена в 1, или сброшена в 0. Если маска установлена в 1, то исключение обрабатывается самим сопроцессором и функция соответствующего прерывания не вызывается. Если маска сброшена в 0, то при исключительной ситуации процессор переключается на подпрограмму обработки прерывания 10h. Операционная система содержит в себе код этой подпрограммы. Эта подпрограмма вызывает другую функцию, которая может вставляться в исполняемый код компилятором, либо программист должен сам написать эту функцию. Если замаскировано исключение деления на нуль или переполнения, то сопроцессор помещает в результат специальное численное значение. Специальные численные значения могут быть такими: +бесконечность (0 11...11 10000...000), -бесконечность (1 11...11 10000...000), вещественная неопределенность (1 11...11 11000...000). Отсюда следует, что возможно допускать эти ошибки при единичных масках, и периодически проверять на ошибки, а при обнаружении ошибки переходить на другой участок кода. Для проверки на ошибки можно использовать регистр состояния swr. Данный способ может пригодится в алгоритмах использующих геометрию. Допустим, что у нас компилятор настроен таким образом, что он вырабатывает такой код, что при возникновении исключительной ситуации она обрабатывается прерыванием, и таким образом программа аварийно завершается. Мы можем "обмануть" компилятор. Вставим ассемблерную вставку.
-------------------- Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства. |
|||
|
||||
![]()
|
| Правила форума "Asm для начинающих" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |