Einzelnen Beitrag anzeigen

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, 18: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