OberonCore
https://forum.oberoncore.ru/

Арифметика в XDS Oberon2 ?
https://forum.oberoncore.ru/viewtopic.php?f=30&t=1368
Страница 1 из 1

Автор:  sia [ Четверг, 26 Февраль, 2009 16:59 ]
Заголовок сообщения:  Арифметика в XDS Oberon2 ?

Время от времени использую в повседневной деятельности XDS Оберон для небольших утилит.
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.

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

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

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

Автор:  Vlad [ Четверг, 26 Февраль, 2009 17:17 ]
Заголовок сообщения:  Re: Арифметика в XDS Oberon2 ?

sia писал(а):
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.


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

Автор:  sia [ Четверг, 26 Февраль, 2009 18:04 ]
Заголовок сообщения:  Re: Арифметика в XDS Oberon2 ?

Vlad писал(а):
sia писал(а):
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.


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


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

Автор:  Vlad [ Четверг, 26 Февраль, 2009 18:12 ]
Заголовок сообщения:  Re: Арифметика в XDS Oberon2 ?

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


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

Автор:  Димыч [ Четверг, 26 Февраль, 2009 18:36 ]
Заголовок сообщения:  Re: Арифметика в XDS Oberon2 ?

sia писал(а):
Столкнулся с проблемой умножения целых 32*32 бит с получением 64 бит результата,
и делением 64 бит на 32 бит целое.


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

Автор:  sia [ Четверг, 26 Февраль, 2009 20:24 ]
Заголовок сообщения:  Re: Арифметика в XDS Oberon2 ?

Димыч писал(а):
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 раз *)

Автор:  Sergo [ Четверг, 26 Февраль, 2009 21:38 ]
Заголовок сообщения:  Re: Арифметика в XDS Oberon2 ?

Может, вместо Windows.LARGE_INTEGER использовать SYSTEM.INT64 ? С этим типом работают обычные операторы - +,*, DIV. Но операнды тоже должны быть типа SYSTEM.INT64.

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

Sergo писал(а):
Может, вместо Windows.LARGE_INTEGER использовать SYSTEM.INT64 ? С этим типом работают обычные операторы - +,*, DIV. Но операнды тоже должны быть типа SYSTEM.INT64.


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

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

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