Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848

Меняется значение поля PC в регистре FPU

24.03.2020, 11:30. Показов 749. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем привет!

Прошу помочь в следующем вопросе:
Есть dll, она содержит форму (экземпляр формы создаётся динамически в момент подключения к библиотеке), на форме лежит компонент TADOQuery. Выяснилось, что при изменении текста запроса
C++
1
Query->SQL->Text = ...
, значение поля PC (Precision Control) регистра CWR в FPU меняется с 3 на 2 (11b -> 10b), что в итоге влияет на результат работы программы. При этом компонент Query даже не является активным, т. е. меняется только текст его запроса, но сам запрос ещё не выполняется.
Экспериментально установил, что не любой текст вызывает такие последствия.

Дополнительно:
- Codeguard молчит.
- изменяется всегда только один бит регистра.
- изменение PC происходит только при первом обращении к компоненту. Если в дебаггере вручную вернуть его значение, то повторные вызовы функции проблему не воспроизводят.
- нет чёткой связи с длинной или конкретным содержимым строки запроса. Просто некоторые варианты текста вызывают проблему, а некоторые нет.
- проблема вызвана именно обращением к тексту запроса. Если перемещать эту операцию в разные части кода, всегда именно она вызывает проблему.
- кинул на форму ещё один TADOQuery, изменение текста его запроса даёт такой же результат.
- для TADOQuery, созданного динамически, проблема не воспроизводится.
- проблема воспроизводится на разных ПК.
- библиотека используется несколько лет на большом количестве машин, работает стабильно, утечек и AV не вызывает.

Первое, и пока единственное, что приходит на ум - где-то рушится память. Только не уверен, может ли неверная запись в какую-то память менять значение регистра FPU? И почему тогда повторение операции не приводит к такому же результату и меняется только один бит? Да и Codeguard не ругается.


Как временный костыль сделал восстановление регистра
C++
1
2
3
4
5
6
7
8
9
10
    short cw = 0;
    asm
    {
        fstcw cw;
    }
    ...проблемный код...
    asm
    {
        fldcw cw;
    }
Но всё же хочется понять в чём дело.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2020, 11:30
Ответы с готовыми решениями:

Как прописать обновление этого поля – т.е. “oninput” по условию, что меняется значение поля с датой?
Есть поле для выбора дат публикаций объявления в форме… <input type="text" name="dt" id="dt" oninput='init(this.value)' ...

Не меняется значение поля
Добрый день. Такая ситуация: // Структура дерева public struct BTree { public int t; ...

Не меняется значение поля после Post
Использую БД Firebird, запросы делаются из Delphi через FIBPlus. В таблице несколько числовых полей, мне нужно изменять значение поля...

2
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
24.03.2020, 22:32  [ТС]
Отладка по шагам в ассемблерном коде показала, что изменение регистра происходит где-то в msjet40.dll.

Чтобы воспроизвести проблему, достаточно в чистом проекте кинуть на форму TADOConnection и TADOQuery.
ADOConnection подключаем к любой базе *.mdb через Microsoft Jet 4/0 OLE DB Provider (св-во Connected остаётся false), ADOQuery соединяем с ADOConnection.
Пишем в коде (например, в обработчике кнопки)
C++
1
ADOQuery1->SQL->Text = L"SELECT DISTINCT Base.Data";
Ставим Breakpoint, запускаем, останавливаемся на этой строке. Открываем окно FPU (Ctrl + Alt + F).
Выполняем строку и видим, что значение поля PC изменилось.

Также заметил, если у ADOQuery свойство ParamCheck установить в false, регистр не меняется.
Если выбрать провайдер Microsoft.ACE.OLEDB.12.0, картина иная: при открытии соединения
C++
1
ADOConnection1->Open()
значение PC меняется на 2, а после изменения текста запроса ADOQuery1 снова меняется на 3.

Что это? Косяк компонентов ADO? Или провайдеров БД?
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
25.03.2020, 13:27  [ТС]
Сбросить регистр можно без ассемблера
C++
1
Set8087CW(Default8087CW);
Но остаётся вопрос, почему его значение меняется? Неужели никто раньше не замечал такой проблемы?

Добавлено через 25 минут
Поправка. Значение Default8087CW тоже изменяется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2020, 13:27
Помогаю со студенческими работами здесь

Создание поля в DBGrid, значение которого присваивается ориентируясь на значение поля в базе данных SQL
Добрый день! Возник такой вопрос: Есть таблица базы данных, которая в числе прочих имеет параметр, показывающий, к какому отделу...

Как сделать слова, буквы четным индексом будет в верхнем регистре, а с нечетными в нижнем регистре
Ввожу слова или текс в textBox вывожу на label, как измененную строку у которой каждая буква с четным индексом будет в верхнем регистре, а...

Напишите функцию, которая возвращает строку strв нижнем регистре, но каждый третий знак в верхнем регистре
Задание 1 Напишите функцию, которая возвращает строку strв нижнем регистре, но каждый третий знак в верхнем регистре.

Получить значение по адресу в регистре
В регистре dx у меня записан адрес, на строку которую ввёл пользователь. Я хочу поместить эту строку в данные db: bufferWay db...

Узнать значение n-го бита в регистре
Доброго времени суток! Суть задачи в следующем: необходимо из регистра вытащить поочередно все биты и применить к ним операцию XOR, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru