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.


Anmelden zum Antworten