Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [ASM] Lange Strings als Function - Wert zurückgeben (https://www.delphipraxis.net/106919-%5Basm%5D-lange-strings-als-function-wert-zurueckgeben.html)

himitsu 21. Jan 2008 20:27

Re: [ASM] Lange Strings als Function - Wert zurückgeben
 
ups ... kurze Variante dat auf 0 zu setzen ... hat also funktioniert :lol:
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz