OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 10:50

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 31 Январь, 2011 02:23 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
В ходе отладки примеров использования программ на Обероне наткнулся на генерацию исключения (MATLAB сообщает об ошибке и выдаёт отладочный дамп) при попытке начать работу с числами типа REAL (они же double, они же 64-битные). Сначала думал, что это из-за указателей, но это не подтвердилось

Код выглядит так:

Код:
MODULE mexBugReport;
   IMPORT mexfile, libmx, mexout;

   PROCEDURE mexFunction_safe(
      varargout: POINTER TO ARRAY OF libmx.mxArray;
      varargin: POINTER TO ARRAY OF libmx.mxArray
      );
   VAR
      i, classid: INTEGER;
      x: REAL;
   BEGIN
         x:= 1;
         mexout.String("Hello, World!");
         mexout.Ln();
   END mexFunction_safe;   
BEGIN
   (* Initialize callbacks *)
   mexfile.mexFunction_safe:= mexFunction_safe;
END mexBugReport.

DevLinker.LinkDll
mexBug.mexw32 :=  National Kernel+ mexout mexfile # mexBugReport # ~


Если строку x:=1 закомментировать, то исключение не генерируется.

С помощью HIEWа и OllyDbg а выяснилось, что ошибка генерируется на фрагменте кода вида (Invalid Floating Point operation). По адресам видно, что это явно не ошибка с указателем
Код:
PUSH 033Eh
FLDCW [ESP]


Исключение "видят" как MATLAB, так и OllyDbg, который я приAttachивал к процессу MATLAB.exe и ставил брейкпоинты внутрь mex-файла в памяти

Система Windows XP Home Edition SP3, MATLAB R2010b, BlackBox Сборка 2010.09.20 для проекта Информатика-21.

P.S. Что это такое? Может ли это быть недоработкой в самом компиляторе или это нечто иное?

P.P.S. Хотя в примере mexExample2 во вложении есть работа с типом REAL, но оно там получается преобразованием из INTEGER, и ассемблерных команд, приведенных выше, там нет. И пример mexExample2 работает.


Вложения:
Комментарий к файлу: Файлы для воспроизведения ошибки
OBERONMEX_015.7z [4.2 КБ]
Скачиваний: 383
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 02:57 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
ScrollLock писал(а):
Если строку x:=1 закомментировать, то исключение не генерируется.
...
P.S. Что это такое? Может ли это быть недоработкой в самом компиляторе или это нечто иное?

P.P.S. Хотя в примере mexExample2 во вложении есть работа с типом REAL, но оно там получается преобразованием из INTEGER, и ассемблерных команд, приведенных выше, там нет. И пример mexExample2 работает.
Может, это какие-то флажки в FPU?

Надо понимать, это обходится чем-то вроде
CONST n=1; .... x := n;
?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox и MATLAB. Проблемы с исп. REAL?
СообщениеДобавлено: Понедельник, 31 Январь, 2011 09:50 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Вы бы, того, этого, если без подсистемы делаете, то хотя бы именуйте документ с модулем так же как модуль. Пришлось все файлы протыкивать, чтобы найти MODULE mexfile.

И нельзя ли Вас попросить выделять экспортируемые сущности жирным (по ББ-м соглашениям)... уж глаз привык :roll: а ещё лучше подсистему организовать, как положено, чтобы Ctrl+0 работало, Info->Source и пр...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 10:19 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
FLDCW (http://siyobik.info/index.php?module=x86&id=102)
Цитата:
Floating-Point Exceptions
None; however, this operation might unmask a pending exception in the FPU status word. That exception is then generated upon execution of the next "waiting" floating-point instruction.
Для проверки этого варианта, попробуйте рекомендацию из описания инструкции.
Цитата:
To avoid raising exceptions when changing FPU operating modes, clear any pending exceptions (using the FCLEX or FNCLEX instruction) before loading the new control word.
FCLEX/FNCLEX: http://siyobik.info/index.php?module=x86&id=85

Код:
PROCEDURE [code] FCLEX 9BH 0DBH 0E2H;

...
      x: REAL;
   BEGIN
      FCLEX;
      x:= 1;
      ...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 20:32 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Спасибо, заработало, когда добавил эту машинную команду лишь в одно место - в "стаб", т.е. модуль mexfile (уж очень не хочется "засорять" пользовательские программы вызовом модуля SYSTEM и иного низкоуровневого функционала). Про традиции оформления кода в BlackBox обязательно учту.

Кстати, то что я обнаружил, можно считать ли "багом" компилятора, который требует устранения? И почему оно себя не проявляет в обычных программах для Windows, написанных на BlackBox? Или это MATLAB за собой исключения какие-то не "подчищает"?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 20:40 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
ScrollLock писал(а):
Кстати, то что я обнаружил, можно считать ли "багом" компилятора, который требует устранения? И почему оно себя не проявляет в обычных программах для Windows, написанных на BlackBox? Или это MATLAB за собой исключения какие-то не "подчищает"?
Багом считать нельзя. Просто разные компиляторы по-разному обращаются с REAL. Можно назвать это разницей в подходах.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 20:54 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Александр Ильин писал(а):
Багом считать нельзя. Просто разные компиляторы по-разному обращаются с REAL. Можно назвать это разницей в подходах.

Тогда это достаточно редкая особенность BlackBoxа - у меня такого не было со связкой MATLAB-Си (пользовался LCC-WIN32, Open Watcom C, MS Visual C++ (32 и 64 бита), исключения на операциях с вещественными числами не выбрасывало.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 23:27 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
ScrollLock писал(а):
Александр Ильин писал(а):
Багом считать нельзя. Просто разные компиляторы по-разному обращаются с REAL. Можно назвать это разницей в подходах.

Тогда это достаточно редкая особенность BlackBoxа - у меня такого не было со связкой MATLAB-Си (пользовался LCC-WIN32, Open Watcom C, MS Visual C++ (32 и 64 бита), исключения на операциях с вещественными числами не выбрасывало.
Вполне возможно, что эта "редкая особенность" сродни проверке индексов массивов и проч.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 01 Февраль, 2011 00:24 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Выложил исправленную версию, которая сбрасывает флаг исключений, умеет работать с вещественными матрицами, а также исходники значительно лучше организованы
http://forum.oberoncore.ru/viewtopic.php?f=47&t=3196


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB