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