AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [ASM] Lange Strings als Function - Wert zurückgeben
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Chemiker · begonnen am 18. Jan 2008 · letzter Beitrag vom 21. Jan 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

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

  Alt 21. Jan 2008, 21: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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.
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