Man kann übrigens auch verständlichen Assembler-Code schreiben
Delphi-Quellcode:
procedure MemBlockXOR_2(Source1, Source2, Destination: Pointer; Count: Integer);
asm
push edi;
push esi;
mov esi, eax;
mov edi, ecx;
mov ecx, Count;
shr ecx, 2;
// div by 4 (sizeof int)
// esi <- Source1
// edx <- Source2
// edi <- Destination
// ecx <- Count
// exit if count = 0
test ecx, ecx;
jz @@
end;
@@loop:
mov eax, [esi];
xor eax, [edx];
mov [edi], eax;
add esi, 4;
add edx, 4;
add edi, 4;
dec ecx;
jnz @@loop;
@@
end:
pop esi;
pop edi;
end;
Einen Tick schneller als dein ursprünglicher Code ist er zudem auch noch, und er besteht alle Tests. Allerdings funktioniert er nur bei ganzen Integer-Grenzen, also wenn Count durch 4 teilbar ist, sonst wird der Rest abgeschnitten (nicht ge-xor’t). Wie dein Original-Code das handhabt, konnte ich nicht entziffern. Aphtons Variante funktioniert immer, ist jedoch langsamer, weil sie mit Bytes arbeitet.