Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];

Вниз

Дельфийские аналоги функций _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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.038 c
15-1234990250
Кое кто
2009-02-18 23:50
2009.04.19
have been + третья форма глагола...


15-1234535049
Саша
2009-02-13 17:24
2009.04.19
Кто знает, как заблокироватть доступ к сайту.


15-1234819801
Юрий
2009-02-17 00:30
2009.04.19
С днем рождения ! 17 февраля 2009 вторник


2-1235963625
karaya
2009-03-02 06:13
2009.04.19
сортировка массива в делфи


2-1235949145
WeX
2009-03-02 02:12
2009.04.19
Помогите с TTreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский