also ohne deine Signatur wär mir langsam was komisch vorgekommen (wo kommt denn das x-Anhänsel her?)
nja, gegen die Assemblerprofies hat man einfach keine Chance
dafür bin ich einfach zu sehr gedanklich in der Delphi-/Pascalschiene drin ... übersetze es sozusagen und versuch's dann zu optimieren...
Delphi-Quellcode:
procedure SwapString(
Var S: WideString);
asm
mov eax, [eax]
// eax := PWideChar(S);
test eax, eax
// if eax = nil then goto @exit;
jz @exit
mov ecx, [eax - 4]
// ecx = length(eax) {div 2};
shr ecx, 1
push ecx
// temp := ecx;
shr ecx, 1
// ecx := ecx div 2;
jz @onechar
// if ecx = 0 then goto @onechar;
@loop:
// @loop:
mov edx, [eax]
// PLongWord(eax)^ := bswap(PLongWord(eax)^) rol 16;
bswap edx
rol edx, 16
mov [eax], edx
add eax, 4
// inc(eac, 4);
//dec ecx // //dec(ecx);
//jnz @loo // //if ecx <> 0 then goto @loop;
loop @loop
// dec(ecx); if ecx <> 0 then goto @loop;
@onechar:
// @onechar:
pop ecx
// ecx := temp;
and ecx, $01
// ecx := ecx and $01;
jz @exit
// if ecx = 0 then goto @exit;
mov dx, [eax]
// PWord(eax)^ := xchg(PWord(eax)^);
xchg
dl, dh
mov [eax], dx
@exit:
// @exit:
end;
nja, zumindestens lerntman da auch immer was dazu.
wußte noch garnicht, daß man ROR/ROL nicht nur mit Register verwenden kann ...
schade, daß dieses nicht auch mit BSWAP geht, sonst würde ich brstimmt auch fast so weit runter(klein) kommen ^_^