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 --> 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;