[Lazarus] RE : Convert assembler to Pascal
Ludo Brands
ludo.brands at free.fr
Tue Sep 13 15:40:23 CEST 2011
Procedure XorMemPrim(var Mem1; const Mem2; Count : Cardinal);
Var i:integer;
p1,p2:pointer;
Begin
p1:=@Mem1;
p2:=@Mem2;
for i:=1 to count div 4 do
begin
pdword(p1)^:=pdword(p1)^ xor pdword(p2)^;
p1:=p1+4;
p2:=p2+4;
end;
For i:=1 to count mod 4 do
begin
pbyte(p1)^:=pbyte(p1)^ xor pbyte(p2)^;
p1:=p1+1;
p2:=p2+1;
end;
End;
Ludo
> procedure XorMemPrim(var Mem1; const Mem2; Count :
> Cardinal); register; 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;
>
> Thanks in advance,
> --
> Leonardo M. Ramé
> http://leonardorame.blogspot.com
>
> --
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>
More information about the Lazarus
mailing list