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
 
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 20. Jan 2008, 17:09
Hallo,

habe die Rückgabe eines Strings in einer Function jetzt so gelöst. Kann einer sich den Code mal ansehen, ob er so ok ist. Das Umwandeln in Kleinbuchstabe vom String ist nur für Testzwecke um zu sehen ob das ganze Ordentlich funktioniert.

Delphi-Quellcode:
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
//******************************************************************************
        MOV EBX, EAX // Adresse s --> EBX
        XOR EAX, EAX // EAX:= 0 // Vorbreitung zu zählen
        JMP @@Vergleich
@@Weiter1:
        INC EBX // EBX:= s[EBX]
        INC EAX // EAX:= EAX + 1 // Zähler um 1 erhöhen
@@Vergleich:
                                  // Zeichen was an EBX in s steht vergleichen
        CMP byte ptr [EBX], $00 // if EBX <> #0 then
                                  // Weiter1;
        JNZ @@Weiter1 // endif
//******************************************************************************
// In EAX ist die String - Länge von s
// String - Länge ENDE
//******************************************************************************
        MOV EBX, EAX // s String- Länge --> 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 --> Stack

      PUSH ESI // ESI --> Stack
      PUSH EDI // EDS --> 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 --> EDI
      POP ESI // Stack --> ESI

      POP EAX // Adresse Rückgabe String --> EAX
@@Schluss:
      POP EBX // Stack --> EBX

END;




Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
 


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 02:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz