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]