Strings vergleichen
-
Hallo,
wie kann ich zwei Null-Terminierte String vergleichen ?
Und wo wir gerade schon dabei sind :-), wie kann man die Länge eines Null-Terminierten Strings ermitteln ?
Danke schon mal für alle Vorschläge.
-
eine strlen Implementierung von mir
size_t strlen(const char * s) { __asm__("movl 0x08(%ebp),%edi /*%edi = s*/ xorl %ecx,%ecx decl %ecx /*%ecx = -1*/ xorb %al,%al /*%al = `0`*/ repne scasb /*%edi++ == %al?*/ incl %ecx incl %ecx negl %ecx /*%ecx=-%ecx*/ movl %ecx,%eax"); /*return %ecx*/ }
der Stringvergleich funktioniert ganz ähnlich.
-
Kannst du das auch als REIN Assembler Code posten ?
[ Dieser Beitrag wurde am 18.07.2002 um 20:04 Uhr von SP editiert. ]
-
xorl %ecx,%ecx decl %ecx /*%ecx = -1 (wiederhole unbegrenzt)*/ xorb %al,%al /*%al = `0` (setze Zeichen das gesucht werden soll, hier die string terminierung)*/ repne scasb /*%edi++ == %al? (wiederhole bis ende des strings erreicht ist*/ incl %ecx /*korrigiere die Anzahl der durchläufe*/ incl %ecx negl %ecx
ich hab nochmal ein paar kommentare zugebastelt.
-
Danke @ kingruedi.
So ich hab noch mal ne Frage zum Thema Strings vergleichen. Ich hab es geschafft eine einfach Methode zum String vergleich zu schreiben.
mov si,TEXT1 mov di,TEXT2 mov cx,LAENGEvonDI cld repe cmpsb je gleich
So nur funktioniert das nicht so ganz wie ich will, denn angenommen der eine Text ist "Hallo" und der andere "Halloe" meldet die Funktion die Strings sind gleich. Vertausche ich SI und DI ist es genau andersrum. Ist Text1 "H" und Text2 "Hjaja" meldet er die beiden sind gleich. Was kann ich da machen ?
-
Pruefe, bevor du die Strings vergleichst, ob sie gleich lang sind.