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/ |