Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

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

Re: [ASM] Lange Strings als Function - Wert zurückgeben

  Alt 21. Jan 2008, 20:27
ups ... kurze Variante dat auf 0 zu setzen ... hat also funktioniert
Delphi-Quellcode:
function ASM_StrLaengeKurz(s: String): integer;
ASM
  TEST EAX, EAX
  JZ @@EmptyString
  MOV EAX, [EDX - 4]
  @@EmptyString:
END;
und das hast du schon richtig hinbekommen
bei JZ @@EmptyString hätte eigentlich Result (EAX) auf die Länge 0 gesezt werden, aber da EAX schon 0 ist ...


PS: oder du nutzt die Delphi-Funktion LStrLen

Code:
function ASM_StringTest(s: String): String;
var
  StrPChar: PChar;               // String Adresse von s merken
ASM
        PUSH EBX                   // EBX --> Stack
        MOV StrPChar, EAX
//******************************************************************************
// String - Länge von s bestimmen
// Parameter: EAX <-- Adresse von s
//******************************************************************************
        [color=#ff0000]CALL LStrLen[/color]
//******************************************************************************
// In EAX ist die String - Länge von s
// String - Länge ENDE
//******************************************************************************
        MOV EBX, EAX              // s String- Länge --&gt; EBX
//******************************************************************************
// Vorbereitung um den Speicher für den Rückgabe - String vorzubereiten
// Zustand der Reg.: EAX = String - Länge von s
//                   EDX = Adresse vom Rückgabe - String
// Für den Aufruf der Procedure: _LStrSetLength in der System-Unit müssen die
// beiden Inhalte der Reg. getauscht werden.
// procedure _LStrSetLength (Adresse, String-Länge)
//           _LStrSetLength (EAX, EDX)              (
        XCHG EDX, EAX             // Adresse vom Rückgabe-String in EAX
                                   // Länge die Reserviert werden soll in EDX
        CALL System.@LStrSetLength // _LStrSetLength (EAX, EDX);
                                   // _LStrSetLength (Adresse, Länge)
//******************************************************************************
// In EAX ist die Adresse vom Rückgabe - Sring
//* ****************************************************************************

                                  // Prüfen ob der String ='' ist
                                  // if StrLaenge = 0 then exit;
      MOV ECX, EBX               // ECX := StrLaenge;
      TEST ECX, ECX              // Flags setzen
      JZ @@Schluss               // Wenn die String - Länge = 0 dann ist

//******************************************************************************
// Kopieren eines Strings der in KleinBuchstaben umgewandelt wird und in den
// Rückgabe String kopiert wird.
// nur für Testzwecke ob der Rückgabe - String richtig zurückgegeben wird.
//******************************************************************************

      PUSH EAX                  //  Adresse vom Rückgabe - String --&gt; Stack

      PUSH ESI                   // ESI --&gt; Stack
      PUSH EDI                   // EDS --&gt; Stack
      MOV ESI, StrPChar
      MOV EDI, [EAX]
@@CopySchleife:
      LODSb
      CMP AL, 'A'
      JB @@Buchstabe
      CMP AL, 'Z'
      JA @@Buchstabe
      ADD AL, 32
@@Buchstabe:
      STOSb
      AND AL, AL
      JNZ @@CopySchleife
      POP EDI                   // Stack --&gt; EDI
      POP ESI                   // Stack --&gt; ESI

      POP EAX                  // Adresse Rückgabe String --&gt; EAX
@@Schluss:
      POP EBX                   // Stack --&gt; EBX

END;

Code:
function ASM_StringTest(s: String): String;
var
  StrPChar: PChar;               // String Adresse von s merken
ASM
        PUSH EBX                   // EBX --> Stack
        MOV StrPChar, EAX
//******************************************************************************
// String - Länge von s bestimmen
// Parameter: EAX <-- Adresse von s
//******************************************************************************
        [color=#ff0000]TEST EAX, EAX
        JZ @@EmptyString
        MOV EAX, [EDX - 4]
        @@EmptyString:[/color]
//******************************************************************************
// In EAX ist die String - Länge von s
// String - Länge ENDE
//******************************************************************************
        MOV EBX, EAX              // s String- Länge --&gt; EBX
//******************************************************************************
// Vorbereitung um den Speicher für den Rückgabe - String vorzubereiten
// Zustand der Reg.: EAX = String - Länge von s
//                   EDX = Adresse vom Rückgabe - String
// Für den Aufruf der Procedure: _LStrSetLength in der System-Unit müssen die
// beiden Inhalte der Reg. getauscht werden.
// procedure _LStrSetLength (Adresse, String-Länge)
//           _LStrSetLength (EAX, EDX)              (
        XCHG EDX, EAX             // Adresse vom Rückgabe-String in EAX
                                   // Länge die Reserviert werden soll in EDX
        CALL System.@LStrSetLength // _LStrSetLength (EAX, EDX);
                                   // _LStrSetLength (Adresse, Länge)
//******************************************************************************
// In EAX ist die Adresse vom Rückgabe - Sring
//* ****************************************************************************

                                  // Prüfen ob der String ='' ist
                                  // if StrLaenge = 0 then exit;
      MOV ECX, EBX               // ECX := StrLaenge;
      TEST ECX, ECX              // Flags setzen
      JZ @@Schluss               // Wenn die String - Länge = 0 dann ist

//******************************************************************************
// Kopieren eines Strings der in KleinBuchstaben umgewandelt wird und in den
// Rückgabe String kopiert wird.
// nur für Testzwecke ob der Rückgabe - String richtig zurückgegeben wird.
//******************************************************************************

      PUSH EAX                  //  Adresse vom Rückgabe - String --&gt; Stack

      PUSH ESI                   // ESI --&gt; Stack
      PUSH EDI                   // EDS --&gt; Stack
      MOV ESI, StrPChar
      MOV EDI, [EAX]
@@CopySchleife:
      LODSb
      CMP AL, 'A'
      JB @@Buchstabe
      CMP AL, 'Z'
      JA @@Buchstabe
      ADD AL, 32
@@Buchstabe:
      STOSb
      AND AL, AL
      JNZ @@CopySchleife
      POP EDI                   // Stack --&gt; EDI
      POP ESI                   // Stack --&gt; ESI

      POP EAX                  // Adresse Rückgabe String --&gt; EAX
@@Schluss:
      POP EBX                   // Stack --&gt; EBX

END;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat