OberonCore
https://forum.oberoncore.ru/

BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?
https://forum.oberoncore.ru/viewtopic.php?f=2&t=3226
Страница 1 из 1

Автор:  ScrollLock [ Понедельник, 31 Январь, 2011 02:23 ]
Заголовок сообщения:  BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?

В ходе отладки примеров использования программ на Обероне наткнулся на генерацию исключения (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

Автор:  Info21 [ Понедельник, 31 Январь, 2011 02:57 ]
Заголовок сообщения:  Re: Необычное поведение компилятора

ScrollLock писал(а):
Если строку x:=1 закомментировать, то исключение не генерируется.
...
P.S. Что это такое? Может ли это быть недоработкой в самом компиляторе или это нечто иное?

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

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

Автор:  Евгений Темиргалеев [ Понедельник, 31 Январь, 2011 09:50 ]
Заголовок сообщения:  Re: BlackBox и MATLAB. Проблемы с исп. REAL?

Вы бы, того, этого, если без подсистемы делаете, то хотя бы именуйте документ с модулем так же как модуль. Пришлось все файлы протыкивать, чтобы найти MODULE mexfile.

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

Автор:  Евгений Темиргалеев [ Понедельник, 31 Январь, 2011 10:19 ]
Заголовок сообщения:  Re: BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?

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;
      ...

Автор:  ScrollLock [ Понедельник, 31 Январь, 2011 20:32 ]
Заголовок сообщения:  Re: BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?

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

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

Автор:  Александр Ильин [ Понедельник, 31 Январь, 2011 20:40 ]
Заголовок сообщения:  Re: BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?

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

Автор:  ScrollLock [ Понедельник, 31 Январь, 2011 20:54 ]
Заголовок сообщения:  Re: BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?

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

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

Автор:  Евгений Темиргалеев [ Понедельник, 31 Январь, 2011 23:27 ]
Заголовок сообщения:  Re: BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?

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

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

Автор:  ScrollLock [ Вторник, 01 Февраль, 2011 00:24 ]
Заголовок сообщения:  Re: BlackBox и MATLAB. Проблемы с исп. REAL. Компилятор?

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/