![]() |
Re: [ASM] Lange Strings als Function - Wert zurückgeben
ups ... kurze Variante dat auf 0 zu setzen ... hat also funktioniert :lol:
Delphi-Quellcode:
und das hast du schon richtig hinbekommen
function ASM_StrLaengeKurz(s: String): integer;
ASM TEST EAX, EAX JZ @@EmptyString MOV EAX, [EDX - 4] @@EmptyString: END; 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 --> 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;
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 --> 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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