Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > c++ и ассемблер — нужна ли finit?


Автор: Camphene 18.10.2015, 12:44
В учебниках по ассемблеру рекомендуется перед началом работы с вещественными числами сбрасывать состояние и настройки FPU 8087 командой finit.

Но как быть, если программа пишется не на чистом ассемблере, а на C++ с использованием ассемблерных вставок или функций?

Если написать программу с вещественными вычислениями и получить ассемблерный код модуля (g++ -S), то в нём нет finit (сразу fld и арифметика).
Но, может быть, сопроцессор сброшен в стартовом коде, который выполняется перед main()?

Если finit вообще отсутствует в программе, то вроде бы могут возникать исключения.
А сбросив настройки уже инициализированного компилятором FPU, я, скорее всего, что-то испорчу, особенно если ассемблерная вставка — не единственное место с вещественными вычислениями.
Так что ставить finit в начале вставки «на всякий случай» не хочется.

Выполняют ли компиляторы сброс сопроцессора сами?
Всегда или надо указывать какие-то директивы/параметры?
И чем различаются разные компиляторы (и реализации для разных ОС) в этом смысле?

Автор: a0730 20.10.2015, 21:16
где-то видел:

Программа должна использовать команду FINIT только в момент запуска.
Команда FINIT никогда не должна быть использована внутри подпрограммы для сопроцессора 8087.


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/c-i-assembler-—-nuzhna-li-finit-id56236a22ae2015c0118b4567#findElement_E7045_562684f3ae201596560470d1_0

Автор: Camphene 21.10.2015, 00:51
Тогда встаёт вопрос: считать ли main() подпрограммой?

И всё ещё непонятно, обязан ли компилятор вставлять finit в стартовый код c++-программы.

Автор: volatile 21.10.2015, 10:17
Цитата(Camphene @  18.10.2015,  12:44 Найти цитируемый пост)
 учебниках по ассемблеру рекомендуется перед началом работы с вещественными числами сбрасывать состояние и настройки FPU 8087 командой finit

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


Автор: Camphene 21.10.2015, 11:01
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)