Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Упростить и убыстрить алгоритм


Автор: tishaishii 2.4.2007, 12:28
Надо убыстрить и упростить алгоритм:
Код
function KeySum(key:PChar):Integer; cdecl; export;
var len, res:Integer;
begin
  len:=length(String(key));
  res:=0;
    while(len>0)do
  begin
        res:=res+ord(String(key)[len]);
        dec(len);
    end;
  result:=res mod 255;
end;

function Crypt(value:PChar; id_firm:PChar):PChar; cdecl; export;
var sum, len, i:Integer;
    res: String;
begin
  Result:=nil;
  len:=length(String(value));
    if (len>0) then
  begin
        sum:=KeySum(id_firm);
    res:='';
    i:=1;
        while(len>0) do
    begin
      res:=res+chr(ord(String(value)[i]) xor ((sum xor len) xor i));
      dec(len);
      inc(i);
        end;
    Result:=PChar(res);
    end;
end;

Можно ли с учётом синтаксиса Delphi 7?

Автор: sgi1981 2.4.2007, 21:35
Уже давненько не программирую в Delphi, але думаю, что...
Код

function KeySum(key:PChar):Integer; cdecl; export;
var len, res:Integer;
begin
asm
cld;
mov esi, key;
xor edx,edx;
xor eax,eax;
@c1:lodsb;
test al,al;
je @p2;
add edx,eax;
jmp @c1;
@p2:
mov eax,edx;
xor edx,edx;
mov ecx,255;
div ecx;
mov eax,edx;
end;
end;



Код

function Crypt(value:PChar; id_firm:PChar):PChar; cdecl; export;
var len: Integer;
    res: Integer;
begin
asm
mov res, 0;
mov ebx, value;
cmp byte ptr [ebx],0;
je @p88;
push value;
call lstrlen;
mov len, eax;
inc eax;
push eax;
push 0;
call GlobalAlloc;
mov res, eax;
push id_firm;
call KeySum;
mov ebx, eax; {sum - ebx}
cld;
mov edi, res; {res - edi}
xor eax,eax;
mov esi, value;
mov ecx, len; {len - ecx}
mov edx, 1; {i - edx}
@c1:
mov al, bl;
xor al, cl;
xor al, dl;
xor al, [esi];
mov [edi], al;
inc esi;
inc edi;
inc edx;
loop @c1;
mov byte ptr [edi], 0;
@p88:
end;
    Result:=PChar(res);
end;


Тестировать - не тестировал. Тестируй сам...

Автор: tishaishii 5.4.2007, 08:45
KeySum возвращает неадыкватное значение.
В Crypt использована не известная функция lstrlen.

ИТОГО: 0.

Автор: sgi1981 9.4.2007, 22:29
lstrlen - функция из библиотеки kernel32.dll возвращает количество символов нуль-терминальной строки

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)