Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.286 Beiträge
 
Delphi 12 Athens
 
#19

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

  Alt 6. Mai 2008, 21:50
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 ^_^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat