|
|
| Посл.отвђт | Сообщен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 |