最近接手的Delphi项目中有一个ASM程序。我对ASM完全不了解,因此无法理解它。我已经阅读了各种ASM指令以尝试解析过程流程,但仍然无法理解。
能否有经验的ASM人员帮助我理解并将以下过程翻译成英语(然后我可以将其翻译回Delphi,以便将来更容易阅读代码!!!)
Mem1的声明是一个字节数组[0..15];而Mem2是一个LongInt。
以下是该过程:
能否有经验的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;
编辑:在Roman R的帮助下,我将汇编代码转换回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;
Mem2: Longint
并不好。只有当Count <= 4时才可以使用。如果您使用开启了范围检查的编译器进行编译,当Count > 4时该方法将会失败。 - Arnaud BouchezMem1
接收了使用某些东西与Mem2
异或的结果。我们还不能确定另一个操作数是否为Mem1
,但这是一个合理的猜测,并且在阅读代码时给我们一些提示。 - Rob Kennedy