В недавнем проекте Delphi, который достался мне в наследство, есть процедура в ASM. Я полный новичок в ASM, поэтому не понимаю ее. Я прочитал различные инструкции по ASM, чтобы попытаться расшифровать поток процедур, но я все еще не понимаю.
Не мог бы кто-нибудь с опытом работы с ASM помочь мне понять и перевести следующую процедуру на английский язык (потом я смогу перевести обратно в Delphi, чтобы код было легче читать в будущем!!!)
Объявление Mem1 - это массив [0..15] байтов;. Mem2 - это LongInt.
Вот процедура:
procedure TForm1.XorMem(var Mem1; const Mem2; Count : Cardinal); register;
begin
asm
push esi
push edi
mov esi, eax //esi = Mem1
mov edi, edx //edi = Mem2
push ecx //save byte count
shr ecx, 2 //convert to dwords
jz @Continue
cld
@Loop1: //xor dwords at a time
mov eax, [edi]
xor [esi], eax
add esi, 4
add edi, 4
dec ecx
jnz @Loop1
@Continue: //handle remaining bytes (3 or less)
pop ecx
and ecx, 3
jz @Done
@Loop2: //xor remaining bytes
mov al, [edi]
xor [esi], al
inc esi
inc edi
dec ecx
jnz @Loop2
@Done:
pop edi
pop esi
end;
end;
edit: Thanks to Roman R i've converted the ASM back to Delphi
procedure TForm1.XorMem2(var Mem1; const Mem2 :LongInt; Count : Cardinal);
var
Key : array [0..3] of byte absolute Mem1;
Num : array [0..3] of byte absolute Mem2;
idx : byte;
begin
for Idx := 0 to Count -1 do Key[idx] := Key[idx] Xor Num[idx];
end;