Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: bitmap32 and xor

  Alt 17. Sep 2011, 17:37
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.
  Mit Zitat antworten Zitat