На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> floating-point invalid в dll
    Здравствуйте. Использую dll в VS C++ написанную в Borlande. Эта dll писалась для одного приложения, в котором она отлично работает.
    Используя эту .dll в VS, вылетает ошибка floating-point invalid при использовании одной из функций.
    Ковыряю dll в IDA pro, обнаружил, что ошибка вылетает при выполнении следующей конструкции:

    ExpandedWrap disabled
      do
      {
      ...
      var = (unsigned __int64) (pow(2.0, (double) k) - 1.0);
      ...
      k++;
      }
      while(k < 64)


    Попробовал выполнить этот код в консольном приложение VS, вылетает точно такая же ошибка: floating-point invalid.
    Как быть? Почему в приложении собранном в Borland эта .dll успешно работает, при использовании же в VS вылетает ошибка.
    Кстати под Win x64 .dll так же работает, по понятным причинам. С чем это связано? VS при сборке проекта изменяет эту .dll, может нужны какие нибудь параметры компиляции?
    Было бы здорово заменить конструкцию приведённую выше на:

    ExpandedWrap disabled
      do
      {
      ...
      var = ((unsigned __int64) 1 << k) - 1;
      ...
      k++;
      }
      while(k < 64)
      Соглашение о вызове совпадает?
        100%
        В Win x64 же работает.
        Сообщение отредактировано: Abraziv -
          А код этой DLL есть? Это функция pow?
            Нету. Только псевдокод в IDA.

            Добавлено
            Нет, это не функция pow(). То что я привёл, это кусок псевдокода из IDA. Несколько итераций проходит, потом падает.

            Добавлено
            Как вообще происходит использование .dll. В нете не могу найти инфу. Просто мне кажется, что компилятор что то делает с этой .dll.

            Добавлено
            Хотя нет. Exe собранная на Win64 под x86 запускается только на Win64, если запустить на Win32, то падает. Компилятор здесь не причём. Это винда значит, что-то делает.
            Сообщение отредактировано: Abraziv -
              А что делает эта функция-то вообще?
              Прикрепите эту DLL-ку и вызов функции (нерабочий и рабочий код - VS, Borland).
              Сложно что-то сказать, ничего не видя...

              Вызов функции из DLL происходит как обычный вызов функции. Небольшие отличия есть только в вызове через указатель (GetProcAddress) и когда DLL грузится системой (когда функция в импорте), но на работе это никак не должно отражаться.
                Цитата
                100%
                В Win x64 же работает.


                В 64-битном режиме соглашение о вызове единственное, так что это не аргумент.

                Покажи объявление функции в DLL, если оно есть и в использующем её приложении Билдера и VS
                  Не в 64 битном режиме, а на 64 битной винде 32 битное приложение.

                  Добавлено
                  Ок. Скоро скину сюда.
                    Еще вариант - посмотреть, совпадает ли кодовое слово сопроцессора 8087CW
                      А можно по подробнее ? Где в VS глянуть?

                      Добавлено
                      Сразу же не вкурил что вы имели ввиду. Вы имеете ввиду слово состояния сопроцессора. Хм. Как узнать, какой используется в том приложении. В IDA pro? Но как?
                        IDA не пользовался. В отладчике Borland его состояние можно видеть.

                        В Borland-овских продуктах его получают функцией Get8087CW и устанавливают Set8087CW. Если аналоги есть в VS, то можно сравнить состояние перед вызовом
                        Сообщение отредактировано: MBo -
                          У меня только .dll. Нет возможности запустить в отладке.
                            В отладке запускается приложение, использующее DLL.
                            Приложение же своё, самописное? Тогда и отладка не нужна - вывести слово состояния перед вызовом.
                            Сообщение отредактировано: MBo -
                              Да самописное. Народ подскажите как в плюсах (WinAPI) установить слово состояния арифметического сопроцессора. Или без ассемблера ни как не обойтись? И какой слово состояния используется в делфях по дефолту???
                              Сообщение отредактировано: Abraziv -
                                $1332 или $1372
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0432 ]   [ 16 queries used ]   [ Generated: 28.03.24, 13:20 GMT ]