Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#118

AW: Anzahl eines Zeichens im String ermitteln

  Alt 14. Jul 2018, 21:31
Dann möchte ich meine schnell zusammengeschrieben Assembler-Rountine auch noch ins Rennen werfen.

Delphi-Quellcode:
function AH_CharCountAsm(const S: string; Ch: Char): Cardinal;
asm
{$IFNDEF CPUX64}
  test eax, eax
  jz @@Empty // wenn S = '' dann gibt es nichts zu tun

  push ebx
  push esi

  mov esi, eax
  xor eax, eax
  xor ebx, ebx

  // Stringlänge ermitteln
  //mov ecx, DWORD PTR [esi-skew].StrRec.Length
  mov ecx, DWORD PTR [esi-$04]

  // ESI auf das String-Ende zeigen lassen und ECX negieren damit ESI+ECX*2 das erste Zeichen ergibt
  lea esi, [esi+ecx*2]
  neg ecx

@@Loop:
  cmp WORD PTR [esi+ecx*2], dx
  sete bl
  add eax, ebx
  inc ecx
  jnz @@Loop

  pop esi
  pop ebx
@@Empty:
{$ELSE}
  xor rax, rax // Rückgabewert auf 0 setzen

  test rcx, rcx
  jz @@Empty // wenn S = '' dann gibt es nichts zu tun

  mov r8, rcx
  xor ecx, ecx

  // Stringlänge ermitteln
  //movsxd r9, DWORD PTR [r8-skew].StrRec.Length
  movsxd r9, DWORD PTR [r8-$04]

  // R9 auf das String-Ende zeigen lassen und R9 negieren damit R8+R9*2 das erste Zeichen ergibt
  lea r8, [r8+r9*2]
  neg r9

@@Loop:
  cmp WORD PTR [r8+r9*2], dx
  sete cl
  add eax, ecx
  inc r9
  jnz @@Loop
@@Empty:
{$ENDIF ~CPUX64}
end;

Code:
00000 Calibrate
03237 1234588 miep
05421 Ydobon
02629 marabu
03317 Missionar
03232 alzaimar
02661 Uwe Raabe StringCountChar
02629 Uwe Raabe StringCountCharFor
02144 KodeZwerg CountCharInString
07170 KodeZwerg CharInStringA
03498 Neutral General CharCountAsm
01993 Uwe Raabe CharCount
01772 Andreas Hauladen CharCountAsm *****
02696 Egon Hugeist CharCount_1
03242 Egon Hugeist CharCount_2
02556 Egon Hugeist CharCount_Double_Sided_3
02681 Egon Hugeist CharCount_Double_Sided_4
03318 Delphi CountChar

Geändert von jbg (15. Jul 2018 um 19:21 Uhr)
  Mit Zitat antworten Zitat