Einzelnen Beitrag anzeigen

bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 10:45
unter http://www.delphipraxis.net/51284-te...n-zaehlen.html gibt es super schnelle String-Funktionen,
leider bei mir nicht mit Delphi XE2 compilierbar

a) um prinzpiell im x32 und x64 bit mode zu kompilieren müssten doch die $IFDEF Definition richtig sein?
b) keyword ASM erzeugt bei mir einen Fehler im x64 bit modus
c) unter x32 bekomme ich folgenden Fehler
[DCC Fehler] _faststrings.pas(1467): E2116 Ungültige Kombination von Opcode und Operanden (bei TEST &SubStr, &SubStr) ??


Delphi-Quellcode:
///
/// Counts number of substr in S
/// source: [url]http://www.delphipraxis.net/51284-teil-string-anderem-string-suchen-zaehlen.html[/url]
///
/// failure with XE2 compiler !!!
function CountString(Const substr, s: AnsiString): Word;
begin
{$IFDEF CPUX86}
    ASM
      PUSH ESI
      PUSH EDI
      PUSH EBX
      TEST &SubStr, &SubStr
      JE @Exit
      TEST &S, &S
      JE @Exit0
      MOV ESI, &SubStr
      MOV EDI, &S
      PUSH EDI
      MOV ECX, [EDI - 4]
      MOV EDX, [ESI - 4]
      DEC EDX
      JS @Fail
      XOR EAX, EAX
      MOV AL, [ESI]
      INC ESI
      SUB ECX, EDX
      JLE @Fail

      @Loop:
      REPNE SCASB
      JNE @Ready
      MOV EBX, ECX
      PUSH ESI
      PUSH EDI
      MOV ECX, EDX
      REPE CMPSB
      POP EDI
      POP ESI
      JNE @noInc
      CMP EAX, $FFFF0000
      JAE @Ready
      ADD EAX, $00010000
      @noInc:
      MOV ECX, EBX
      JMP @Loop

      @Fail:
      POP EDX

      @Exit0:
      XOR EAX, EAX
      JMP @Exit

      @Ready:
      POP EDX
      SHR EAX, 16

      @Exit:
      POP EBX
      POP EDI
      POP ESI
    end;
{$ENDIF CPUX86}
/// x64 bit code
{$IFDEF CPUX64}
       /// ????

      asm



      end;
{$ENDIF CPUX64}
End;

Geändert von SirThornberry (21. Sep 2011 um 13:12 Uhr) Grund: Delphi-Tags gesetzt - nächstes mal bitte selbst machen
  Mit Zitat antworten Zitat