Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FPU status word и опции компилятора 
:(
    Опции темы
FCM
Дата 3.9.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Заметил в Intel Fortran, что статусное слово FPU "ведет" себя по-разному (для одной и той же программы) в Debug и Release-сборках, т.е. зависит от опций компилятора.
Каким образом это происходит?

PM MAIL   Вверх
sgi1981
Дата 16.9.2009, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
{//замаскировать исключения и установить режим округления в большую сторону
fstcw t_cwr1;//сохранить старое значение регистра управления cwr, мы его восстановим в конце функции
mov ax, t_cwr1;//подать старое cwr в ax
/*замаскировать все 6 ошибок (биты 0...5) (111111), установить точность (биты 8, 9) в 64 бита (11), 
режим округления (биты 10, 11) к большему числу (10)
*/
and ax, 1111000011000000b;
or ax,  0000101100111111b;
mov t_cwr, ax;//записать в память новое значение cwr
fldcw t_cwr;//загрузить его из памяти
fnclex;//очистить признаки возникновения исключительных ситуаций
;*********
fdiv;//здесь возможны деление на нуль либо переполнение, при этом установятся биты ошибок в swr
fstsw ax;//сохранить регистр swr в ax
test ax, 1101b;проверить на ошибки
jnz ERROR1;если ошибка - переходим на другой участок кода
//периодически таким образом проверяем на ошибки
;*********
//код прошел выполнение без ошибок 
jmp RR;//теперь перепрыгиваем через участок кода выполняющийся в случае ошибки
ERROR1://возникла ошибка
ffree st(0);
ffree st(1);
ffree st(2);
ffree st(3);
ffree st(4);
ffree st(5);
ffree st(6);
ffree st(7);//освобождаем регистры стека
fnclex;//сброс флагов исключительных ситуаций в swr во избежание обработки исключительных ситуаций с помощью прерывания
RR:
fldcw t_cwr1;//восстановить исходные настройки управления
;*********
};



--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0382 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.