Registriert seit: 14. Aug 2005
1.859 Beiträge
Delphi 11 Alexandria
|
Re: [ASM] Lange Strings als Function - Wert zurückgeben
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.
|
|
Zitat
|