String wird nicht gefunden



  • Wenn ich nach dem Fragment aus B in A suche wird zum Verrecken nichts gefunden. Wer könnte mir mal eben ein bisschen helfen?

    int main()
    {
    	string A = "Hallo"; //wird eine dynamische Länge haben
    	string B = "Hal";   //wird auch eine dynamische Länge haben
    	int *Adresse  = NULL;
    	int Position;
    	int C  = lstrlenA(B.c_str());
    
    	__asm
    	{
    		lea     esi, A
    	L1:
    		push    esi
    		lea     edi, B
    		mov	ecx, C
    		cld
    		repe    cmpsb
    		je      Uebereinstimmung
    		pop     esi
    		inc     esi
    		or      byte ptr [esi], 0
    		jnz     L1
    		jmp     Ende
    	Uebereinstimmung:
    		pop     Adresse
    		mov     esi, Adresse
    		lea     edi, A
    		sub     esi, edi
    		mov     Position, esi
    	Ende:
    		nop
    		nop
    	}
    }
    


  • Beim schnellen Ueberfliegen, sind mir keine ganz ueblen Schnitzer aufgefallen, daher:
    Hast du dir das compilierte Resultat schon mal im Debugger betrachtet?
    Falls ja: Wo treten dabei Probleme auf?



  • müsste es nicht ein char pointer sein und kein string ?



  • Hi,

    also beim Debuggen ist mit kein Fehler in dem Sinne aufgefallen. Der Code wird ganz normal durchlaufen aber beim direkten Vergleich wird einfach keine Übereinstimmung gefunden.

    Was mache ich denn mit lea!? Lade ich damit nicht einen Pointer?? Intern wird ein string doch eh nur als char Array gehalten. Und wenn ich mir das Ziel des Pointers ansehe, dann lande ich auch bei meinem "Hallo" oder "Hal".

    Oder bin ich Banane?!



  • Dh. edi und esi zeigen im Debugger auch wirklich in die byte-codierten Zeichenfolgen? An welcher Stelle steigt der Vergleich denn dann falsch aus?



  • Also ich habe das Ganze einmal durch IDA gejagt und ja, esi und edi zeigen auf die Strings.
    Also ich besorge mir ja die Länge von B. Und genau so oft wird alles iteriert und anschließend spring er bei jmp Ende raus ohne auch nur einmal den anderen Block angesprungen zu haben. Kannste ja mel selber kompilieren;-). Vielleicht sehen 4 Augen mehr als 2:-P


  • Mod

    secondsun schrieb:

    Hi,

    also beim Debuggen ist mit kein Fehler in dem Sinne aufgefallen. Der Code wird ganz normal durchlaufen aber beim direkten Vergleich wird einfach keine Übereinstimmung gefunden.

    Was mache ich denn mit lea!? Lade ich damit nicht einen Pointer?? Intern wird ein string doch eh nur als char Array gehalten. Und wenn ich mir das Ziel des Pointers ansehe, dann lande ich auch bei meinem "Hallo" oder "Hal".

    Oder bin ich Banane?!

    Das string-Objekt selbst enthält (i.d.R. wenn wir von möglicher Optimierung absehen) nicht die Zeichenkette selbst. Das ist schon deshalb klar, weil die Länge der Zeichenkette durchaus größer sein kann als das string-Objekt selbst.

    Um an die Adresse der Zeichenkette zu kommen, müsstest du entweder auf den internen Zieger des Stringobjektes zugreifen, oder das Ergebnis von c_str oder data benutzen. Beides ist auf eigene Weise unangenehm.
    Einen kleinen Fehler enthält dein Algorithmus zudem, weil er nicht berücksichtigt, das strings eingebette \0 enthalten können (wenn auch die Längenermittelung für B das Problem zumindest für den Suchstring erschlägt).

    das könnte also ungefähr so aussehen.

    int main()
    {
        string A = "Hallo"; //wird eine dynamische Länge haben
        string B = "Hal";   //wird auch eine dynamische Länge haben
        int *Adresse  = NULL;
        int Position;
        int C  = lstrlenA(B.c_str());
    
        __asm
        {
            lea     esi, A
            mov     esi, [esi]string.m_data // oder so ähnlich, muss entsprechend der Name des Zeigers in string sein, und die Syntax ist möglicherweise nicht exakt so
    // alternativ
    //      lea     ecx, A
    //      call    string::c_string // ist wahrscheinlich nicht die korrekte Syntax
    //      mov     esi, eax
    
    // string B analog
        L1:
            push    esi
            lea     edi, B
            mov    ecx, C
            cld
            repe    cmpsb
            je      Uebereinstimmung
            pop     esi
            inc     esi
            or      byte ptr [esi], 0
            jnz     L1
            jmp     Ende
        Uebereinstimmung:
            pop     Adresse
            mov     esi, Adresse
            lea     edi, A
            sub     esi, edi
            mov     Position, esi
        Ende:
            nop
            nop
        }
    }
    


  • Ich bitte vielmals um Entschuldigung. Ich habe wirklich nicht gesehen, dass der Pointer auf den Anfang des String Objektes zeigt. Dort befindet sich aber nicht der String sondern die Größe und Kapazität oder so. Sorry, Sorry, Sorry

    Hab das Problem jetzt so gelöst und es funktioniert:
    Danke für die Antworten;-)

    string A = "Hallo";
        string B = "lo";
        int C            = lstrlenA(B.c_str());
        int *Adresse    = NULL;
        int Position;
    
        __asm
        {
            lea     esi, A + 4
        L1:
            push    esi
            lea     edi, B + 4
            mov        ecx, C
            cld
            repe    cmpsb
            je      Uebereinstimmung
            pop     esi
            inc     esi
            or      byte ptr [esi], 0
            jnz     L1
            jmp     Ende
        Uebereinstimmung:
            pop     Adresse
            mov     esi, Adresse
            lea     edi, A
            sub     esi, edi
            mov     Position, esi
        Ende:
            nop
            nop
    

Anmelden zum Antworten