Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.19;
Скачать: CL | DM;

Вниз

Дельфийские аналоги функций _lrotr и _lrotr   Найти похожие ветки 

 
andreil ©   (2008-05-06 23:53) [0]

Собственно никтог не видел? А то без них никак OBJ-файл не подключить, ругается на отсутствие этих функций. Их описание я на шел, но вот сами функции - нет :(
Поможет кто?


 
andreil ©   (2008-05-06 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 ©   (2008-05-06 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   (2008-05-07 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) скармливать этим функциям не рекомендуется.


 
Германн ©   (2008-05-07 00:42) [4]


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

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

Второе то же самое, только там соглашение о вызовах другое.


 
Anatoly Podgoretsky ©   (2008-05-07 00:54) [5]

Циклический сдвиг на Эн бит.
Перевод сделан правильно.


 
Renegat   (2008-05-07 00:56) [6]

> Не знаю точно, что должны делать эти функции, но на вскидку+телепатор вроде как похоже на "то".
Эти функции должны сдвигать число на Num двоичных разрядов влево/вправо с записью цепочки "выдвигаемых" битов в другой конец числа.

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

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


 
Германн ©   (2008-05-07 01:13) [7]


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

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

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

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

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

Это очевидно. Сомнений нет.


 
andreil ©   (2008-05-07 10:25) [8]


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

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

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

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

ЗЫ: В АСМе я не силен :(


 
palva ©   (2008-05-07 10:39) [9]

Лучше не заниматься самодельщиной. Нужно просто вытащить объектник из соответствующей библиотеки cw32.lib (или cw32mt.lib и т. д.) утилитой tlib например так:
tlib.exe cw32.lib*rotr
включить его в юнит. Правильный header к этой функции составить на основе билдерной документации или пройтись по нему отладчиком и понять какой он должен быть.

В таких функциях может быть много нюансов, связанных с многопоточностью или с обращением к другим функциям библиотеки или к библиотеке cc3250.dll


 
Anatoly Podgoretsky ©   (2008-05-07 12:01) [10]

Второй от третьего отличается только соглашением о вызове.
Оно тебе надо?
Если надо, то cdecl/stdcall


 
han_malign ©   (2008-05-07 12:22) [11]

offtop

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

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

это обертка:
export function fff(...): HRESULT; stdcall; ==>
import procedure fff(...): safecall;


 
Renegat   (2008-05-07 17:35) [12]

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

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

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


 
DevilDevil ©   (2008-05-07 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   (2008-05-07 18:35) [14]

> [13] DevilDevil ©   (07.05.08 18:26)
Тогда надо добавить директиву, ибо без неё Вам Делфи парамы в стек не запишет:
procedure  _lrot; stdcall;
...
procedure _lrotr; stdcall;


 
Renegat   (2008-05-07 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 ©   (2008-05-07 18:47) [16]

> Renegat   (07.05.08 18:35) [14]

дабы не париться лишний раз с параметрами, рекомендую их не писать; в приведённом мной листинге, как Вы успели заметить, их нет. "Функции" тоже лучше заменять на процедуры.


 
andreil ©   (2008-05-07 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 ©   (2008-05-07 20:18) [18]

Да, забыл написать, часто в качастве параметра передается 0 (если ключик дешифровки не указан).


 
Renegat   (2008-05-07 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;


 
Тыщ ©   (2008-05-08 00:13) [20]

Renegat   (07.05.08 20:22) [19]

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

Гм, а на 386 хотя бы Windows 95 запустится? Если нет, то обеспечивать такую совместимость в прикладных прогах смысла никакого.


 
Renegat   (2008-05-08 00:34) [21]

> Гм, а на 386 хотя бы Windows 95 запустится?

А то как же? Правда тормозов будет... ууу %)
Ибо триставосьмидесятники они уже 32-разрядные, в отличие от двести-, сто-, и просто восьмидесятников.
В принципе, под двойки пожет пойти Win 3.11 - а посему совместимость тоже нужна :D


 
Германн ©   (2008-05-08 00:39) [22]


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

Да какая разница? Запустится, не запустится. Ты найди во всём мире хоть один рабочий комплект .386 + матплата + память + видеокарта. О такой мелочи как мышь и клавиатура я уже молчу. Их разъёмы хоть перепаять можно. :)


 
DevilDevil ©   (2008-05-08 12:50) [23]

> andreil ©   (07.05.08 20:18) [18]
подозреваю, что ошибка не в этих функциях.


 
andreil ©   (2008-05-08 15:51) [24]


> Если так, то

Спасибо, конечно, но эти функции используются и в других местах ;)


 
andreil ©   (2008-05-08 16:01) [25]

Только что подставил эту функцию в код - вылет с aCCESvIolation :(
Надо все-таки покопаться в АСМе...


 
Дмитрий Белькевич ©   (2008-05-08 16:08) [26]


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


Бряк + ctrl-alt-c в помощь. Там всё просто - два задействованных регистра, посмотришь что как крутится и куда попадает.


 
Дмитрий Белькевич ©   (2008-05-08 16:15) [27]

Не сильно вникая в тему. ИМХО наиболее правильно писать не cdecl, stdtcall etc, а assembler. Что бы фреймов входа/выхода в функцию не было. Но могу ошибаться - нужно смотреть.


 
Германн ©   (2008-05-08 16:27) [28]


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

Не надо копаться в АСМе. В этих 6 строчках просто негде копаться. Надо подобрать правильное соглашение о вызовах.


 
Anatoly Podgoretsky ©   (2008-05-08 16:43) [29]

> Дмитрий Белькевич  (08.05.2008 16:15:27)  [27]

Чего?
Справку умеешь читать?
Попробуй, просветляет.


 
Renegat   (2008-05-08 17:01) [30]

> Спасибо, конечно, но эти функции используются и в других местах ;)

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


 
Дмитрий Белькевич ©   (2008-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 ©   (2008-05-08 19:15) [32]

> Дмитрий Белькевич  (08.05.2008 17:44:31)  [31]

Теперь лишился детских иллюзий


 
andreil ©   (2008-05-08 21:39) [33]


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

Говорю сразу - исходник 100%рабочий, тк он уже участвует в моей программе в виде ДЛЛки. Но вся соль в том, что моя программа - тоже ДЛЛка, так что тягать еще один файл как минимум некультурно.
Пока попробую перевести на Дельфи....


 
Германн ©   (2008-05-08 21:49) [34]


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

Про соглашения о вызовах справку читал?


 
Дмитрий Белькевич ©   (2008-05-09 01:00) [35]

>Теперь лишился детских иллюзий

Век живи - век учись, всё равно дураком помрёшь...


 
Германн ©   (2008-05-09 01:06) [36]


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

Ну, судя по анкете, у тебя ещё много времени, чтобы опровергнуть сей афоризм. :)
34 года это ещё молодость.


 
DevilDevil ©   (2008-05-09 13:01) [37]

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

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

скачивай "Тестовый пример" в конце статьи


 
andreil   (2008-05-10 12:22) [38]

Не, лучше уж таскать ее с собой, ка ресурс, ведь:
1) весит она 19Кб;
2) в моей программе есть функции инициализации/деинициализации, вот по ним и будем извлекать/удалять ДЛЛку.
Другого выхода я не вижу, тк:
1) подключить OBJ-файл, судя по всему, не получится;
2) если включить в состав программы ДЛЛку  виде ПАС-модуля, как в статье, то это даст 20Кб прироста к размеру программы, а она весит со всеми файлами ровно 96Кб, так что не целесообразно.


 
Anatoly Podgoretsky ©   (2008-05-10 13:54) [39]

> andreil  (10.05.2008 12:22:38)  [38]

19 кб целесообразно, а 20 уже нет. А к этим 19 кб ты прибавил операции по манипулированию с ним как с ресурсом, а они всяко будут более 1 еб.


 
andreil ©   (2008-05-10 14:49) [40]


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

Щас проверю :)
..... Добавил ДЛЛку как ресурс. Работы с ней пока нету. 58 392 байт (оригинал, без сжатия, - 106 056 байт)....
......Добавил работу с ресурсом - 58 880/107 520 байт.
Как видно, на размер сильно не повлияло :)
А залог этого - КОЛ :))))



Страницы: 1 2 вся ветка

Текущий архив: 2009.04.19;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.026 c
3-1219848625
tipman
2008-08-27 18:50
2009.04.19
созданный DBF файл не открывается в excel


2-1235977011
worldmen
2009-03-02 09:56
2009.04.19
Ошибка : "Неверный дескриптор" и "Параметр задан не верно"


10-1155649556
Степан
2006-08-15 17:45
2009.04.19
Объектная модель Paint


15-1235035785
Kerk
2009-02-19 12:29
2009.04.19
Нижегородцы!


10-1155558493
misha_gr
2006-08-14 16:28
2009.04.19
Интеграция приложения в MS Outlook