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
-
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