将德尔福风格的ASM翻译成英文?

Ruc*_*cia 5 delphi x86 assembly basm

我继承的最近的Delphi项目在ASM中有一个过程.我是一个完整的ASM新手,所以我不明白.我已经阅读了各种ASM指令,试图解读程序流程,但我仍然没有得到它.

有ASM经验的人可以帮助我理解并将以下程序翻译成英语(然后我可以翻译成Delphi,以便将来更容易阅读代码!!!)

Mem1的声明是Byte的数组[0..15]; .而内存2是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;
Run Code Online (Sandbox Code Playgroud)

编辑:感谢Roman R我已将ASM转换回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;
Run Code Online (Sandbox Code Playgroud)

Rom*_* R. 8

该函数接受两个指针(对于任何数组)及其长度(以字节为单位).该函数XOR使用第二个数组字节(Mem2)对第一个数组字节(Mem1)执行字节到字节操作.伪代码:

for Index = 0 to Count - 1
  (Mem1 as Byte Array) [Index] = (Mem1 as Byte Array) [Index] Xor (Mem2 as Byte Array) [Index]
Run Code Online (Sandbox Code Playgroud)

  • @Roman如果数据是DWORD对齐的,则立即读取DWORD是有意义的.否则,它可能会有效地变慢.asm很奇怪:例如,有一个`cld`操作码看起来像是使用`lodsd/stosd`的某个先前版本的遗物.简而言之:提供的asm远未优化.对于少量数据,小的Delphi循环将足够快,并且转换为64位(例如)更快. (2认同)