Конференция "Основная" » Дельфийские аналоги функций _lrotr и _lrotr [D7, WinXP]
 
  • andreil © (06.05.08 23:53) [0]
    Собственно никтог не видел? А то без них никак OBJ-файл не подключить, ругается на отсутствие этих функций. Их описание я на шел, но вот сами функции - нет :(
    Поможет кто?
  • andreil © (06.05.08 23:56) [1]
    Вроде как нашел на АСМ-ие, но может не то?
    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;

  • andreil © (06.05.08 23:58) [2]
    ООО нашел таки, но только на чистом АСМе с СиБуилдера.
    Поможете перевести на дельфийский?
    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

  • Renegat (07.05.08 00:38) [3]
    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) скармливать этим функциям не рекомендуется.
  • Германн © (07.05.08 00:42) [4]

    > andreil ©   (06.05.08 23:56) [1]
    >
    > Вроде как нашел на АСМ-ие, но может не то?
    >

    Не знаю точно, что должны делать эти функции, но на вскидку+телепатор вроде как похоже на "то".

    Второе то же самое, только там соглашение о вызовах другое.
  • Anatoly Podgoretsky © (07.05.08 00:54) [5]
    Циклический сдвиг на Эн бит.
    Перевод сделан правильно.
  • Renegat (07.05.08 00:56) [6]
    > Не знаю точно, что должны делать эти функции, но на вскидку+телепатор вроде как похоже на "то".
    Эти функции должны сдвигать число на Num двоичных разрядов влево/вправо с записью цепочки "выдвигаемых" битов в другой конец числа.

    > Второе то же самое, только там соглашение о вызовах другое.
    Ага. Первое - __safecall(первые три парама - EAX, EDX и ECX, далее - в стэк), второе - __stdcall (только стэк)

    PS Лучше не делать Num связок по две операции, как в примере из поста #1, а обойтись всего двумя, как в #2.
  • Германн © (07.05.08 01:13) [7]

    > Renegat   (07.05.08 00:56) [6]
    >
    > > Не знаю точно, что должны делать эти функции, но на вскидку+телепатор
    > вроде как похоже на "то".
    > Эти функции должны сдвигать число на Num двоичных разрядов
    > влево/вправо с записью цепочки "выдвигаемых" битов в другой
    > конец числа.
    >

    Я так и подумал.

    > Ага. Первое - __safecall(первые три парама - EAX, EDX и
    > ECX, далее - в стэк)

    Хм. Это в Билдере так называется? Для Дельфи первое  - register. А safecall в Дельфи (если верить справке) не передаёт параметры через регистры.

    > PS Лучше не делать Num связок по две операции, как в примере
    > из поста #1, а обойтись всего двумя, как в #2.
    >

    Это очевидно. Сомнений нет.
  • andreil © (07.05.08 10:25) [8]

    > Сопстна вот.

    Не то :( При работе 8 раз вызывается нормально, а на 9-ом - вылет.

    > PS Лучше не делать Num связок по две операции, как в примере
    > из поста #1, а обойтись всего двумя, как в #2.

    Во втором посте вооющето сделано на чистом АСМе, да и взято с С++ Буилдера, поэтому 100% правильно. Но вот как перевести это на Дельфи?

    ЗЫ: В АСМе я не силен :(
  • palva © (07.05.08 10:39) [9]
    Лучше не заниматься самодельщиной. Нужно просто вытащить объектник из соответствующей библиотеки cw32.lib (или cw32mt.lib и т. д.) утилитой tlib например так:
    tlib.exe cw32.lib*rotr


    включить его в юнит. Правильный header к этой функции составить на основе билдерной документации или пройтись по нему отладчиком и понять какой он должен быть.

    В таких функциях может быть много нюансов, связанных с многопоточностью или с обращением к другим функциям библиотеки или к библиотеке cc3250.dll
  • Anatoly Podgoretsky © (07.05.08 12:01) [10]
    Второй от третьего отличается только соглашением о вызове.
    Оно тебе надо?
    Если надо, то cdecl/stdcall
  • han_malign © (07.05.08 12:22) [11]
    offtop

    > А safecall в Дельфи (если верить справке) не передаёт параметры
    > через регистры.

    - safecall это stdcall, плюс генерация исключения если после возврата EAX <> 0

    это обертка:
    export
    function fff(...): HRESULT; stdcall;

    ==>
    import
    procedure fff(...): safecall;

  • Renegat (07.05.08 17:35) [12]
    > Хм. Это в Билдере так называется? Для Дельфи первое  - register.
    > А safecall в Дельфи (если верить справке) не передаёт параметры
    > через регистры.

    Чорт. Нет, определённо надо было уже спать ложиться %) Имелся в виду __fastcall
    Да и с количеством команд напутал. Выполнаются-то не две а три...
    Простите дурака :)

    > Не то :( При работе 8 раз вызывается нормально, а на 9-ом - вылет.
    Опана... Это как это?! У себя проверил - всё работает отлично... Вы точно больше 31 в Num не передаёте?
    Вывод один - показывайте код
  • DevilDevil © (07.05.08 18:26) [13]
    имхо:
    [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 всякие.
  • Renegat (07.05.08 18:35) [14]
    > [13] DevilDevil ©   (07.05.08 18:26)
    Тогда надо добавить директиву, ибо без неё Вам Делфи парамы в стек не запишет:
    procedure  _lrot; stdcall;
    ...
    procedure _lrotr; stdcall;

  • Renegat (07.05.08 18:41) [15]
    Да и вообще, почему 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;

  • DevilDevil © (07.05.08 18:47) [16]
    > Renegat   (07.05.08 18:35) [14]

    дабы не париться лишний раз с параметрами, рекомендую их не писать; в приведённом мной листинге, как Вы успели заметить, их нет. "Функции" тоже лучше заменять на процедуры.
  • andreil © (07.05.08 20:12) [17]

    > Опана... Это как это?! У себя проверил - всё работает отлично.
    > .. Вы точно больше 31 в Num не передаёте?Вывод один - показывайте
    > код

    Код на С++ не мой, а на дельфи перевести не сумел - там все замешано на указателях. Вот кусок кода, вызывающий эти функции:
    static ulong FlipDword(ulong d)
    {
     return (_lrotr(d, 8)&0xFF00FF00) | (_lrotl(d, 8)&0x00FF00FF);
    }


    static void FlipDwordString(ulong *dst, ulong *src, int blen)
    {
     int i;

     for (i = 0; i < (blen+3)>>2; i++)
       dst[i] = FlipDword(src[i]);
    }


    Renegat, DevilDevil © - нифига не пашет, вылет на 9 вызове.
    А нашел я вариант, указанный во втором сообщении в файлах "Source\Rtl\Source\math\lrotl.asm" и "Source\Rtl\Source\math\lrotr.asm", входящих в комплект поставки CBuilder6.
  • andreil © (07.05.08 20:18) [18]
    Да, забыл написать, часто в качастве параметра передается 0 (если ключик дешифровки не указан).
  • Renegat (07.05.08 20:22) [19]
    > 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;

  • Тыщ © (08.05.08 00:13) [20]
    Renegat   (07.05.08 20:22) [19]

    > совместимость со старым хламом типа .286 и .386

    Гм, а на 386 хотя бы Windows 95 запустится? Если нет, то обеспечивать такую совместимость в прикладных прогах смысла никакого.
  • Renegat (08.05.08 00:34) [21]
    > Гм, а на 386 хотя бы Windows 95 запустится?

    А то как же? Правда тормозов будет... ууу %)
    Ибо триставосьмидесятники они уже 32-разрядные, в отличие от двести-, сто-, и просто восьмидесятников.
    В принципе, под двойки пожет пойти Win 3.11 - а посему совместимость тоже нужна :D
  • Германн © (08.05.08 00:39) [22]

    > Тыщ ©   (08.05.08 00:13) [20]

    Да какая разница? Запустится, не запустится. Ты найди во всём мире хоть один рабочий комплект .386 + матплата + память + видеокарта. О такой мелочи как мышь и клавиатура я уже молчу. Их разъёмы хоть перепаять можно. :)
  • DevilDevil © (08.05.08 12:50) [23]
    > andreil ©   (07.05.08 20:18) [18]
    подозреваю, что ошибка не в этих функциях.
  • andreil © (08.05.08 15:51) [24]

    > Если так, то

    Спасибо, конечно, но эти функции используются и в других местах ;)
  • andreil © (08.05.08 16:01) [25]
    Только что подставил эту функцию в код - вылет с aCCESvIolation :(
    Надо все-таки покопаться в АСМе...
  • Дмитрий Белькевич © (08.05.08 16:08) [26]

    > Надо все-таки покопаться в АСМе...


    Бряк + ctrl-alt-c в помощь. Там всё просто - два задействованных регистра, посмотришь что как крутится и куда попадает.
  • Дмитрий Белькевич © (08.05.08 16:15) [27]
    Не сильно вникая в тему. ИМХО наиболее правильно писать не cdecl, stdtcall etc, а assembler. Что бы фреймов входа/выхода в функцию не было. Но могу ошибаться - нужно смотреть.
  • Германн © (08.05.08 16:27) [28]

    > andreil ©   (08.05.08 16:01) [25]
    >
    > Только что подставил эту функцию в код - вылет с aCCESvIolation
    > :(
    > Надо все-таки покопаться в АСМе...
    >

    Не надо копаться в АСМе. В этих 6 строчках просто негде копаться. Надо подобрать правильное соглашение о вызовах.
  • Anatoly Podgoretsky © (08.05.08 16:43) [29]
    > Дмитрий Белькевич  (08.05.2008 16:15:27)  [27]

    Чего?
    Справку умеешь читать?
    Попробуй, просветляет.
  • Renegat (08.05.08 17:01) [30]
    > Спасибо, конечно, но эти функции используются и в других местах ;)

    Сильно подозреваю, что в тех других местах тоже можно переписать проще. Хочешь - выкладывай код: подумаем, как именно. Возможно, от етих функций вообще удастся избавиться. А так, имхо, ошибка не в приведённых выше функциях, а в коде непосредственно_до/сразу_после их вызова.
  • Дмитрий Белькевич © (08.05.08 17:44) [31]
    >The reserved word inline and the directive assembler are maintained for backward compatibility only. They have no effect on the compiler.

    Кгхм. Вот жеж козлы, а я свято верил ;)
  • Anatoly Podgoretsky © (08.05.08 19:15) [32]
    > Дмитрий Белькевич  (08.05.2008 17:44:31)  [31]

    Теперь лишился детских иллюзий
  • andreil © (08.05.08 21:39) [33]

    > Сильно подозреваю, что в тех других местах тоже можно переписать
    > проще. Хочешь - выкладывай код: подумаем, как именно. Возможно,
    >  от етих функций вообще удастся избавиться. А так, имхо,
    >  ошибка не в приведённых выше функциях, а в коде непосредственно_до/сразу_после
    > их вызова.

    Говорю сразу - исходник 100%рабочий, тк он уже участвует в моей программе в виде ДЛЛки. Но вся соль в том, что моя программа - тоже ДЛЛка, так что тягать еще один файл как минимум некультурно.
    Пока попробую перевести на Дельфи....
  • Германн © (08.05.08 21:49) [34]

    > andreil ©   (08.05.08 21:39) [33]

    Про соглашения о вызовах справку читал?
  • Дмитрий Белькевич © (09.05.08 01:00) [35]
    >Теперь лишился детских иллюзий

    Век живи - век учись, всё равно дураком помрёшь...
  • Германн © (09.05.08 01:06) [36]

    > Дмитрий Белькевич ©   (09.05.08 01:00) [35]
    >
    > >Теперь лишился детских иллюзий
    >
    > Век живи - век учись, всё равно дураком помрёшь...
    >

    Ну, судя по анкете, у тебя ещё много времени, чтобы опровергнуть сей афоризм. :)
    34 года это ещё молодость.
  • DevilDevil © (09.05.08 13:01) [37]
    > andreil ©   (08.05.08 21:39) [33]

    если так ине выдет с obj-ами, вот альтернативный вариант не таскать за собой dll:
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1294

    скачивай "Тестовый пример" в конце статьи
  • andreil (10.05.08 12:22) [38]
    Не, лучше уж таскать ее с собой, ка ресурс, ведь:
    1) весит она 19Кб;
    2) в моей программе есть функции инициализации/деинициализации, вот по ним и будем извлекать/удалять ДЛЛку.
    Другого выхода я не вижу, тк:
    1) подключить OBJ-файл, судя по всему, не получится;
    2) если включить в состав программы ДЛЛку  виде ПАС-модуля, как в статье, то это даст 20Кб прироста к размеру программы, а она весит со всеми файлами ровно 96Кб, так что не целесообразно.
  • Anatoly Podgoretsky © (10.05.08 13:54) [39]
    > andreil  (10.05.2008 12:22:38)  [38]

    19 кб целесообразно, а 20 уже нет. А к этим 19 кб ты прибавил операции по манипулированию с ним как с ресурсом, а они всяко будут более 1 еб.
  • andreil © (10.05.08 14:49) [40]

    > а они всяко будут более 1 еб.

    Щас проверю :)
    ..... Добавил ДЛЛку как ресурс. Работы с ней пока нету. 58 392 байт (оригинал, без сжатия, - 106 056 байт)....
    ......Добавил работу с ресурсом - 58 880/107 520 байт.
    Как видно, на размер сильно не повлияло :)
    А залог этого - КОЛ :))))
  • DevilDevil © (12.05.08 11:26) [41]
    KOL погубит мир О_о
 
Конференция "Основная" » Дельфийские аналоги функций _lrotr и _lrotr [D7, WinXP]
Есть новые Нет новых   [134491   +8][b:0][p:0.002]