· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Floating point - проблема очистки регистров FPU

Посл.отвђт Сообщенiе


Дата: Июн 8, 2004 11:18:52

На самом дела это я так только думаю, что проблема в очистке регистров FPU. Просто вот какая бяка выходит: прилинковываю к основной проге (компилятор VC6.0) процедурки написанные на MASM и богато использующие работу с FPU. И вот фигня: в первый раз все чисто, но при попытке вызова процедурки несколько раз - лезет чушь!
что я только не пробовал (разве что не сохранял полностью все регистры и состояние флагов до входа в процедуру и восстанавливать при выходе)!
как правильно очищать регистры FPU?
пытался ответить на этот вопрос, отвлеживая действия самого компилятора VC6.0 при решении подобной задачи (только вызывалась процедура написанная на С++), так он никаких видимых спец.действий так и не произвел :-(


Дата: Июн 8, 2004 12:20:12

stbzh
лезет чушь
В чем это выражается?


Дата: Июн 8, 2004 13:22:22

"чушь" вероятно выражаестся в "мусоре".
вопрос номер 1: finit в начале _каждого_ блока есть?
вопрос номер 2: непонятно зачем очищать ренистры, их надо иницилизировать
вопрос номер 3: а контекст вообще сохраняется? можно указать винде сохранять только регистры общего назначения, не трогая плавучку (хотя по умолчанию плавучка всегда сохраняется)
вопрос номер 4: нет ли каких ошибок в программировании? может у тебя от слова состояния сопра результат зависит?
вопрос номер 5: нети ли пересечений с MMX (они отображаютя на общие регистры)
вопрос номер 6: а в отладчике смотреть пробовал? в каком месте выскакивает глюк? приведи дамп стека сопра и его служебных регистров до и после выполнения плавучей команды, а мы посмотрим


Дата: Июн 8, 2004 13:24:25

как правильно очищать регистры FPU?
Попробуй emms в конце вставить, оно, правда, для MMX, но я как-то пользовался - лениво было правильный вариант искать - все работало и ладно :)


Дата: Июн 8, 2004 15:09:20

Если остаются неочищенные регистры, то лучше для каждого использовать fstp st.
А еще можно использовать Vkdebug для отладки. Очень полезная вещь.


Дата: Июн 10, 2004 14:33:30

Спасибо всем за внимание к моей проблеме.
как всегда моя главная ошибка - неумение поставить вопрос правильно. Я смотрел под отладчиком: все замечательно и правильно храниться во время первого захода в процедуру, но после второго входа в некоторых регистрах FPU появляются НЕЧИСЛА, в смысле бессмысленный набор байтов. Дебагер С++. А процедурки компилированны в MASM 6.11
Вот очень может быть, что есть ошибки именно в программе, но ведь при детальном рассмотрении в Дебаггере - все нормально! А может есть какие то особые условности, при сопряжении MASMовских и C++ obj файлов?


Дата: Июн 10, 2004 15:34:12

в смысле - при втором заходе?
ты что ли _хранишь_ данные в фпу-регистрах? тогда их порча вполне естественна, т.к. библиотеки языка си их активно используют и не восстаналивают (да и не должны).


Дата: Июн 10, 2004 16:46:11

stbzh
При написании функции которыя работают с FPU, нужно убедится что при вызове данной функции в FPU будет нужное количество свободных регистров, а если функции что-то в них возвращает то, эти регистры будут потом освобождены. Так как при загрузке данных в занятый регистр или при операциях с пустым регистром, в случае если генерация исключений подавлена FPU записывает в регистр NAN, чтобы как-то сообщить об исключении.


Дата: Июн 11, 2004 16:04:47

Во-во!
Очень похоже на то, о чем говорит Black_mirror. Пошагово:
1) Из С++ вызываю процедуру MASM (передаю параметры в массиве);
2) На основании переданных значений и констант (термодинамические свойства воздуха и продуктов сгорания, если кому интересно), по довольно простым, но многочленным формулам вычисляю интересующие значения;
3) Записываю полученные значения обратно в массив (ну там как бы первые три элемента - исходные, остальные 5 получаются расчетами в процедуре);
4) Управление передается главной проге;
5) после некоторых действий, процедура вызывается вновь и тут лезут NAN!
Хотя, я pop-аю все из стека FPU! То есть по идее, после выхода из подпрограммы стек должен остаться чист. Я даже пытался кроме собственно pop еще и устанавливать флаг, что данный регистр пуст. Увы, ничего не помогает.


Дата: Июн 12, 2004 06:39:34

stbzh
Долго будем гадать? Пора уже и код показать.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.128