Einzelnen Beitrag anzeigen

Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#23

Re: Optimallösung gesucht: Little Endian <-> Big Endia

  Alt 8. Mai 2008, 16:24
Hi,

der Performancetest hat gezeigt, dass bei langen Strings, wie ich sie verwenden möchte, folgendes am schnellsten funktioniert:

Delphi-Quellcode:
procedure SwapBytes(Var S: WideString);
asm
  mov eax, [eax]

  test eax, eax
  jz @exit

  mov ecx, [eax - 4]
  shr ecx, 1

  push ecx
  shr ecx, 1

  jz @onechar

  @loop:

  mov edx, [eax]
  bswap edx
  rol edx, 16
  mov [eax], edx

  add eax, 4
  dec ecx
  jnz @loop

  @onechar:

  pop ecx
  test ecx, $01 //<-- hier habe ich ein test draus gemacht
  jz @exit

  mov dx, [eax]
  xchg dl, dh
  mov [eax], dx

  @exit:
end;

procedure SwapBytes(Var S: UCS4String);
asm
  mov eax, [eax]

  test eax, eax
  jz @exit

  mov ecx, [eax - 4]

  @loop:

  mov edx, [eax]
  bswap edx
  mov [eax], edx

  add eax, 4
  dec ecx
  jnz @loop

  @exit:
end;
Bei kurzen Strings spielt es kaum eine Rolle, welchen Code man nimmt. Somit scheint die Methode, in Pascal zu denken und dann zu übersetzen, gar nicht so falsch zu sein

Mfg
FAlter

[edit] Jetzt weiß ich, was ich in #15 übersehen habe: das pop Kein Wunder, dass es ne AV gab, wenn die Rücksprungadresse nicht mehr stimmt. [/edit]
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat