![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Camphene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
В учебниках по ассемблеру рекомендуется перед началом работы с вещественными числами сбрасывать состояние и настройки FPU 8087 командой finit.
Но как быть, если программа пишется не на чистом ассемблере, а на C++ с использованием ассемблерных вставок или функций? Если написать программу с вещественными вычислениями и получить ассемблерный код модуля (g++ -S), то в нём нет finit (сразу fld и арифметика). Но, может быть, сопроцессор сброшен в стартовом коде, который выполняется перед main()? Если finit вообще отсутствует в программе, то вроде бы могут возникать исключения. А сбросив настройки уже инициализированного компилятором FPU, я, скорее всего, что-то испорчу, особенно если ассемблерная вставка — не единственное место с вещественными вычислениями. Так что ставить finit в начале вставки «на всякий случай» не хочется. Выполняют ли компиляторы сброс сопроцессора сами? Всегда или надо указывать какие-то директивы/параметры? И чем различаются разные компиляторы (и реализации для разных ОС) в этом смысле? Это сообщение отредактировал(а) Camphene - 18.10.2015, 12:57 |
|||
|
||||
a0730 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 0 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
где-то видел:
Программа должна использовать команду FINIT только в момент запуска. Команда FINIT никогда не должна быть использована внутри подпрограммы для сопроцессора 8087. Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
Camphene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
Тогда встаёт вопрос: считать ли main() подпрограммой?
И всё ещё непонятно, обязан ли компилятор вставлять finit в стартовый код c++-программы. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Эти учебники писались когда мат.сопроцессор был отдельной микросхемой, и в стандартной конфигурации вообще не устанавливался. Современные ОС, сами инициалзизируют мат.сопроцессор, который начиная с 486 входит в сам процесссор. Вам не нужно использовать эту команду, если вы конечно не пишете собственную ОС. Это сообщение отредактировал(а) volatile - 21.10.2015, 10:19 |
|||
|
||||
Camphene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
Спасибо!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |