-
Собственно никтог не видел? А то без них никак OBJ-файл не подключить, ругается на отсутствие этих функций. Их описание я на шел, но вот сами функции - нет :( Поможет кто?
-
Вроде как нашел на АСМ-ие, но может не то? function lrotr(N: ULONG; Num: byte): ULONG;
asm
@@loop:
ROR EAX, 1
SUB EDX, 1
JNZ @@loop
end;
function lrotl(n: ulong; num: integer): ulong;
asm
@@loop:
ROL EAX, 1
SUB EDX, 1
JNZ @@loop
end;
-
ООО нашел таки, но только на чистом АСМе с СиБуилдера. Поможете перевести на дельфийский? Func@ _lrotl, _EXPFUNC, _RTLENTRY, <long val>, <int rcount>
mov eax, [esp+4] ; get value
mov ecx, [esp+8] ; get rotate count
rol eax,cl ; rotate the value
Return@
EndFunc@ _lrotl
Func@ _lrotr, _EXPFUNC, _RTLENTRY, <long val>, <int rcount>
mov eax, [esp+4] ; get value
mov ecx, [esp+8] ; get rotate count
ror eax,cl ; rotate the value
Return@
EndFunc@ _lrotr
-
function lrotr(N:ULONG; Num:DWORD):ULONG; asm MOV ECX, EDX ROR EAX, CL end;
function lrotl(N:ULONG; Num:DWORD):ULONG; asm MOV ECX, EDX ROL EAX, CL end;
Сопстна вот. Хотя номинально тип 2-го парама позволяет записать в него любую бяку вплоть до 0FFFFFFFFh, больше 1Fh (т.е. 31) скармливать этим функциям не рекомендуется.
-
> andreil © (06.05.08 23:56) [1] > > Вроде как нашел на АСМ-ие, но может не то? >
Не знаю точно, что должны делать эти функции, но на вскидку+телепатор вроде как похоже на "то".
Второе то же самое, только там соглашение о вызовах другое.
-
Циклический сдвиг на Эн бит. Перевод сделан правильно.
-
> Не знаю точно, что должны делать эти функции, но на вскидку+телепатор вроде как похоже на "то". Эти функции должны сдвигать число на Num двоичных разрядов влево/вправо с записью цепочки "выдвигаемых" битов в другой конец числа.
> Второе то же самое, только там соглашение о вызовах другое. Ага. Первое - __safecall(первые три парама - EAX, EDX и ECX, далее - в стэк), второе - __stdcall (только стэк)
PS Лучше не делать Num связок по две операции, как в примере из поста #1, а обойтись всего двумя, как в #2.
-
> Renegat (07.05.08 00:56) [6] > > > Не знаю точно, что должны делать эти функции, но на вскидку+телепатор > вроде как похоже на "то". > Эти функции должны сдвигать число на Num двоичных разрядов > влево/вправо с записью цепочки "выдвигаемых" битов в другой > конец числа. >
Я так и подумал.
> Ага. Первое - __safecall(первые три парама - EAX, EDX и > ECX, далее - в стэк)
Хм. Это в Билдере так называется? Для Дельфи первое - register. А safecall в Дельфи (если верить справке) не передаёт параметры через регистры.
> PS Лучше не делать Num связок по две операции, как в примере > из поста #1, а обойтись всего двумя, как в #2. >
Это очевидно. Сомнений нет.
-
> Сопстна вот.
Не то :( При работе 8 раз вызывается нормально, а на 9-ом - вылет.
> PS Лучше не делать Num связок по две операции, как в примере > из поста #1, а обойтись всего двумя, как в #2.
Во втором посте вооющето сделано на чистом АСМе, да и взято с С++ Буилдера, поэтому 100% правильно. Но вот как перевести это на Дельфи?
ЗЫ: В АСМе я не силен :(
-
Лучше не заниматься самодельщиной. Нужно просто вытащить объектник из соответствующей библиотеки cw32.lib (или cw32mt.lib и т. д.) утилитой tlib например так: tlib.exe cw32.lib*rotr включить его в юнит. Правильный header к этой функции составить на основе билдерной документации или пройтись по нему отладчиком и понять какой он должен быть. В таких функциях может быть много нюансов, связанных с многопоточностью или с обращением к другим функциям библиотеки или к библиотеке cc3250.dll
-
Второй от третьего отличается только соглашением о вызове. Оно тебе надо? Если надо, то cdecl/stdcall
-
offtop > А safecall в Дельфи (если верить справке) не передаёт параметры > через регистры.
- safecall это stdcall, плюс генерация исключения если после возврата EAX <> 0 это обертка: export function fff(...): HRESULT; stdcall; ==> import procedure fff(...): safecall;
-
> Хм. Это в Билдере так называется? Для Дельфи первое - register. > А safecall в Дельфи (если верить справке) не передаёт параметры > через регистры.
Чорт. Нет, определённо надо было уже спать ложиться %) Имелся в виду __fastcall Да и с количеством команд напутал. Выполнаются-то не две а три... Простите дурака :)
> Не то :( При работе 8 раз вызывается нормально, а на 9-ом - вылет. Опана... Это как это?! У себя проверил - всё работает отлично... Вы точно больше 31 в Num не передаёте? Вывод один - показывайте код
-
имхо: [code] procedure _lrot; asm mov eax, [esp+4] ; get value mov ecx, [esp+8] ; get rotate count rol eax,cl ; rotate the value end;
procedure _lrotr asm mov eax, [esp+4] ; get value mov ecx, [esp+8] ; get rotate count ror eax,cl ; rotate the value end; [/code]
линкеру нужен только адрес вызова и всё, "параметры" он сам "подставит".
P.S. а где ты нашёл эти и аналогичные функции ? Мне, например, нужны ldexp всякие.
-
> [13] DevilDevil © (07.05.08 18:26)
Тогда надо добавить директиву, ибо без неё Вам Делфи парамы в стек не запишет: procedure _lrot; stdcall;
...
procedure _lrotr; stdcall;
-
Да и вообще, почему procedure? И плюс ещё список параметров не определён. Если уж пошла такая пьянка, то вот: function lrotr(N:ULONG; Num:DWORD):ULONG; stdcall;
asm
MOV EAX, DWORD PTR [ESP+4]
MOV ECX, DWORD PTR [ESP+8]
ROR EAX, CL
end;
function lrotl(N:ULONG; Num:DWORD):ULONG; stdcall;
asm
MOV EAX, DWORD PTR [ESP+4]
MOV ECX, DWORD PTR [ESP+8]
ROL EAX, CL
end;
-
> Renegat (07.05.08 18:35) [14]
дабы не париться лишний раз с параметрами, рекомендую их не писать; в приведённом мной листинге, как Вы успели заметить, их нет. "Функции" тоже лучше заменять на процедуры.
-
> Опана... Это как это?! У себя проверил - всё работает отлично. > .. Вы точно больше 31 в Num не передаёте?Вывод один - показывайте > код
Код на С++ не мой, а на дельфи перевести не сумел - там все замешано на указателях. Вот кусок кода, вызывающий эти функции: static ulong FlipDword(ulong d)
static void FlipDwordString(ulong *dst, ulong *src, int blen)
Renegat, DevilDevil © - нифига не пашет, вылет на 9 вызове. А нашел я вариант, указанный во втором сообщении в файлах "Source\Rtl\Source\math\lrotl.asm" и "Source\Rtl\Source\math\lrotr.asm", входящих в комплект поставки CBuilder6.
-
Да, забыл написать, часто в качастве параметра передается 0 (если ключик дешифровки не указан).
-
> static ulong FlipDword(ulong d)
Хоспади!!! о_0 Какие усилия для банальной перестановки байт!!! BSWAP и всё! Или нужна-таки совместимость с .386 и ниже? Если так, то function FlipDword(n:DWORD):DWORD;
asm
XCHG AL, AH;
ROR EAX, 16;
XCHG AL, AH;
end; если же совместимость со старым хламом типа .286 и .386 не требуется, то можно обойтись этим: function FlipDword(n:DWORD):DWORD;
asm
BSWAP EAX;
end;
-
Renegat (07.05.08 20:22) [19]
> совместимость со старым хламом типа .286 и .386
Гм, а на 386 хотя бы Windows 95 запустится? Если нет, то обеспечивать такую совместимость в прикладных прогах смысла никакого.
-
> Гм, а на 386 хотя бы Windows 95 запустится?
А то как же? Правда тормозов будет... ууу %) Ибо триставосьмидесятники они уже 32-разрядные, в отличие от двести-, сто-, и просто восьмидесятников. В принципе, под двойки пожет пойти Win 3.11 - а посему совместимость тоже нужна :D
-
> Тыщ © (08.05.08 00:13) [20]
Да какая разница? Запустится, не запустится. Ты найди во всём мире хоть один рабочий комплект .386 + матплата + память + видеокарта. О такой мелочи как мышь и клавиатура я уже молчу. Их разъёмы хоть перепаять можно. :)
-
> andreil © (07.05.08 20:18) [18] подозреваю, что ошибка не в этих функциях.
-
> Если так, то
Спасибо, конечно, но эти функции используются и в других местах ;)
-
Только что подставил эту функцию в код - вылет с aCCESvIolation :( Надо все-таки покопаться в АСМе...
-
> Надо все-таки покопаться в АСМе...
Бряк + ctrl-alt-c в помощь. Там всё просто - два задействованных регистра, посмотришь что как крутится и куда попадает.
-
Не сильно вникая в тему. ИМХО наиболее правильно писать не cdecl, stdtcall etc, а assembler. Что бы фреймов входа/выхода в функцию не было. Но могу ошибаться - нужно смотреть.
-
> andreil © (08.05.08 16:01) [25] > > Только что подставил эту функцию в код - вылет с aCCESvIolation > :( > Надо все-таки покопаться в АСМе... >
Не надо копаться в АСМе. В этих 6 строчках просто негде копаться. Надо подобрать правильное соглашение о вызовах.
-
> Дмитрий Белькевич (08.05.2008 16:15:27) [27]
Чего? Справку умеешь читать? Попробуй, просветляет.
-
> Спасибо, конечно, но эти функции используются и в других местах ;)
Сильно подозреваю, что в тех других местах тоже можно переписать проще. Хочешь - выкладывай код: подумаем, как именно. Возможно, от етих функций вообще удастся избавиться. А так, имхо, ошибка не в приведённых выше функциях, а в коде непосредственно_до/сразу_после их вызова.
-
>The reserved word inline and the directive assembler are maintained for backward compatibility only. They have no effect on the compiler.
Кгхм. Вот жеж козлы, а я свято верил ;)
-
> Дмитрий Белькевич (08.05.2008 17:44:31) [31]
Теперь лишился детских иллюзий
-
> Сильно подозреваю, что в тех других местах тоже можно переписать > проще. Хочешь - выкладывай код: подумаем, как именно. Возможно, > от етих функций вообще удастся избавиться. А так, имхо, > ошибка не в приведённых выше функциях, а в коде непосредственно_до/сразу_после > их вызова.
Говорю сразу - исходник 100%рабочий, тк он уже участвует в моей программе в виде ДЛЛки. Но вся соль в том, что моя программа - тоже ДЛЛка, так что тягать еще один файл как минимум некультурно. Пока попробую перевести на Дельфи....
-
> andreil © (08.05.08 21:39) [33]
Про соглашения о вызовах справку читал?
-
>Теперь лишился детских иллюзий
Век живи - век учись, всё равно дураком помрёшь...
-
> Дмитрий Белькевич © (09.05.08 01:00) [35] > > >Теперь лишился детских иллюзий > > Век живи - век учись, всё равно дураком помрёшь... >
Ну, судя по анкете, у тебя ещё много времени, чтобы опровергнуть сей афоризм. :) 34 года это ещё молодость.
-
-
Не, лучше уж таскать ее с собой, ка ресурс, ведь: 1) весит она 19Кб; 2) в моей программе есть функции инициализации/деинициализации, вот по ним и будем извлекать/удалять ДЛЛку. Другого выхода я не вижу, тк: 1) подключить OBJ-файл, судя по всему, не получится; 2) если включить в состав программы ДЛЛку виде ПАС-модуля, как в статье, то это даст 20Кб прироста к размеру программы, а она весит со всеми файлами ровно 96Кб, так что не целесообразно.
-
> andreil (10.05.2008 12:22:38) [38]
19 кб целесообразно, а 20 уже нет. А к этим 19 кб ты прибавил операции по манипулированию с ним как с ресурсом, а они всяко будут более 1 еб.
-
> а они всяко будут более 1 еб.
Щас проверю :) ..... Добавил ДЛЛку как ресурс. Работы с ней пока нету. 58 392 байт (оригинал, без сжатия, - 106 056 байт).... ......Добавил работу с ресурсом - 58 880/107 520 байт. Как видно, на размер сильно не повлияло :) А залог этого - КОЛ :))))
-
KOL погубит мир О_о
|