OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 04:40

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Четверг, 26 Февраль, 2009 16:59 

Зарегистрирован: Вторник, 27 Ноябрь, 2007 20:40
Сообщения: 48
Время от времени использую в повседневной деятельности XDS Оберон для небольших утилит.
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.

Может быть из-за какой то мелочи не работает? У кого-то это получалось?
Windows XP Sp3, Компилятор XDS версии 2.51 Опции пробовал покрутить, библиотеку перестраивал.

Обращался на форум к создателям - тишина, похоже не поддерживают больше продукт...
http://www.excelsior-usa.com/forum/inde ... pic=1721.0

Можно конечно делать такую арифметику на ассемблере (что пока и делаю), и в принципе это выход.
Или перейти на XDS-C где это работает (проверял), но не хочется иметь на компе еще и монстра С++.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Четверг, 26 Февраль, 2009 17:17 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
sia писал(а):
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.


Апишная функция есть: MulDiv.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Четверг, 26 Февраль, 2009 18:04 

Зарегистрирован: Вторник, 27 Ноябрь, 2007 20:40
Сообщения: 48
Vlad писал(а):
sia писал(а):
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.


Апишная функция есть: MulDiv.


MulDiv возвращает 32 бита, нужно 64. Для умножения не подходит.
Для деления 64 бит, если неизвестны сомножители - тоже.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Четверг, 26 Февраль, 2009 18:12 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
sia писал(а):
MulDiv возвращает 32 бита, нужно 64. Для умножения не подходит.
Для деления 64 бит, если неизвестны сомножители - тоже.


Напишите DLL на C, всяк лучше чем на асме что-то придумывать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Четверг, 26 Февраль, 2009 18:36 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
sia писал(а):
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.


Проблема, похоже, в том, что в *.lib файле отсутствует определение функции Int32x32To64.
Вариантов решения 2.
1) Пересобрать lib. Ни разу не делал, если получится, расскажите здесь.
2) Через LoadLibrary подгрузить функцию и использовать ее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Четверг, 26 Февраль, 2009 20:24 

Зарегистрирован: Вторник, 27 Ноябрь, 2007 20:40
Сообщения: 48
Димыч писал(а):
sia писал(а):
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.


Проблема, похоже, в том, что в *.lib файле отсутствует определение функции Int32x32To64.
Вариантов решения 2.
1) Пересобрать lib. Ни разу не делал, если получится, расскажите здесь.
2) Через LoadLibrary подгрузить функцию и использовать ее.


Я больше склоняюсь что это какое-то тонкое несоответствие компилятора и функций, которые реализуются подстановкой (без ссылки в библиотеку).
Т.к. в SDKs нашёл следующую строку:
#define Int32x32To64(a, b) ((__int64)(((__int64)((long)(a))) * ((long)(b))))

Тогда по идее её и не должно быть в библиотеке. То есть библиотека соответствует Microsoft SDKs, а компилятор почему-то ошибается.

Если функцию откомпилить и засунуть самому в библиотеку, то думаю
что сработает. Тоже не делал, попробую, получится-сообщу.

Пока определил аналоги функций на асме (в своём варианте), кинул в общую кучу MyMisc, например умножение:
Код:
PROCEDURE Mul8* (VAR a: T.INT8; b: T.INT);
    VAR a1, a0: T.INT;
BEGIN
    a0 := a[0];
    ASM
        push    eax
        push    edx
        mov     eax, dword ptr a0
        imul     dword ptr b
        mov     dword ptr a0, eax
        mov     dword ptr a1, edx
        pop     edx
        pop     eax
    END;
    a[1] := a1;  a[0] := a0;
END Mul8;

(*не думал что придётся заглянуть в Аsm 80386, это в 1 раз *)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Четверг, 26 Февраль, 2009 21:38 

Зарегистрирован: Четверг, 03 Август, 2006 16:28
Сообщения: 182
Может, вместо Windows.LARGE_INTEGER использовать SYSTEM.INT64 ? С этим типом работают обычные операторы - +,*, DIV. Но операнды тоже должны быть типа SYSTEM.INT64.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Арифметика в XDS Oberon2 ?
СообщениеДобавлено: Пятница, 27 Февраль, 2009 05:52 

Зарегистрирован: Вторник, 27 Ноябрь, 2007 20:40
Сообщения: 48
Sergo писал(а):
Может, вместо Windows.LARGE_INTEGER использовать SYSTEM.INT64 ? С этим типом работают обычные операторы - +,*, DIV. Но операнды тоже должны быть типа SYSTEM.INT64.


Да, действительно, работают. Проверил для умножения. В тип Windows... можно просто копировать
через SYSTEM.MOVE.

Спасибо. Хороший выход штатными средствами.


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

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


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

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


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

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