Assembler (Win32): Strings aneinanderreihen
-
Ich sollte 2 (nullterminierte) Strings aneinanderreihen wie z.B. in BASIC geht mit string3=string1+string2.
Habe nichts dergleichen gefunden
Danke!
-
Geht es auch etwas konkreter? Wo genau ist dein Problem? Wenn du an einer solchen Aufgabe schon beim Ansatz scheiterst, empfehle ich noch einige Anfaengertutorials (siehe FAQ).
-
Bei dem FAQ habe ich nichts gefunden; und in einem Tutorial oder Buch bin ich leider auch nie auf diese Funktion gestossen; musste ich bisher auch noch nie einsetzen). Die Stringbefehle habe ich natürlich durchsucht aber da ist kein Befehl für diesen Zweck vorgesehen (habe ich vielleicht übersehen?), ich habe aber auch an eine API-Funktion gedacht falls eine existiert (kenne die Win API noch nicht so gut, jedenfalls nicht auswändig).
-
Dazu brauchst du keine API-Funktion. Und selbst wenn: WinAPI hat nichts mehr mit Assembler zu tun, die hat ein eigenes Forum.
Einen extra Befehl zum Kopieren von 0-term strings hat der x86 nicht, bietet aber durchaus die Moeglichkeiten, sowas problemlos zu basteln.
Einfachste Moeglichkeit zB. mit lods und stos und einer kleinen Abfrage dabei.
-
Bin recht weiter gekommen. Nun, (um es kompliziert zu machen), ich sollte 3 Strings zusammenkopieren. Das hat zuerst super geklappt, nur war die Reihenfolge falsch; also tauschte ich die Variablen so aus dass es nun richtig sein müsste (open1+szFileName+open2). Allerdings genau dann (und sonst nie) stürzt das Programm ab
Hier der Codeausschnitt:mov szFileName[0],0 invoke GetFileName,hWin,SADD("Open A File"), SADD("All files",0,"*.*",0) cmp szFileName[0],0 je @F Start: lea esi, open1 FindLastByte: lodsb Or al, al jnz FindLastByte dec esi mov edi, esi lea esi, szFileName CatStrings: lodsb Or al, al jz Done stosb jmp CatStrings Done: mov al, 0 stosb Start2: lea esi, open1 FindLastByte2: lodsb Or al, al jnz FindLastByte2 dec esi mov edi, esi lea esi, open2 CatStrings2: lodsb Or al, al jz Done2 stosb jmp CatStrings2 Done2: mov al, 0 stosb invoke MessageBox,hWin,ADDR open1,ADDR szDisplayName,MB_OK
-
Um in Deinem Assemblercode den Fehler zu finden, brauchte ich den vollständigen Code
.data ... .code ... , wie gesagt alles.
Hab mal drei Strings mit Inline-Assembler aneinandergereiht ohne lodsb und stosb.int main() { char eins[] = "eins"; char zwei[] = "zwei"; char drei[] = "drei"; char buf[256]; __asm { push edi push esi lea esi, eins // Quelle1 lea edi, buf // Ziel mov ecx, 3 // Anzahl L0: dec ecx L1: movsb cmp byte ptr [edi-1], 0 jne L1 dec edi cmp ecx, 1 je L3 js L4 lea esi, zwei // Quelle2 jmp L0 L3: lea esi, drei // Quelle3 jmp L0 L4: pop esi pop edi } }
MfG
-
Ach so ja, das sind aber keine Nullterminierten. Jetzt habe ich den Code xmal versucht abzusenden aber das klappte nie... ist eventuell zu lang?
Eigenartigerweise funktioniert mein Code problemlos mit anderen Reihenfolgen (szFileName nicht in der Mitte oder open1 am Schluss etc.)
-
[quote="C. M. Obrecht"]Ach so ja, das sind aber keine Nullterminierten.
Das sind alles Nullterminierte C-Strings!
char eins[] = "eins"; char zwei[] = "zwei"; char drei[] = "drei";
und nach der Routine steht in buf "einszweidrei" und eine abschliessende Null!
-
ich denke er meint, bei ihm handelt es sich nicht um null-terminierte strings, also er will immer nur einen teil davon kopieren. wenn ich richtig liege, dann musses eher etwas à la strncat werden.
-
eddi schrieb:
ich denke er meint, bei ihm handelt es sich nicht um null-terminierte strings, also er will immer nur einen teil davon kopieren. wenn ich richtig liege, dann musses eher etwas à la strncat werden.
Glaub ich nicht - hab seinen Assemblercode gelesen - er arbeitet mit nullterminierten Strings.
Sein erster Beitrag lautete:C. M. Obrecht schrieb:
Ich sollte 2 (nullterminierte) Strings aneinanderreihen wie z.B. in BASIC geht mit string3=string1+string2.
-
Ups, sorry, kenne die Strings in C nicht so gut; kenne gerade mal std::string (resp. bevor ich wieder etwas falsches in C sage, mit #include <string>) und die Funktion zum die umwandeln für API-Aufrufe aber blicke da bei C nicht so durch.
Ich habe meine Strings in ASM deklariert als szString1 db "Teststring",0
szFileName kommt aus einer externen Datei und bringt den Dateinamen des Common Dialog-Fensters mit. Hat auch alles funktioniert nur dass der der String welcher am Anfang stehen sollte am Schluss stand und umgekehrt; und als ich das änderte stürzte das Programm immer ab und zwar genau bei:dec esi mov edi, esi lea esi, open2 <-- Hier Absturz CatStrings2:
wenn ich mich im Debugger nicht irre.
-
.. in der Datei wo szFileName deklariert wird ist natürlich folgendermassen deklariert:
szFileName db 260 dup(0)
; aber wie kann ich das umgehen? Andere Deklarationsvarianten funktionierten da diesmal nicht (wegen der OpenFileName-Struktur vermutlich, Überläufe)
-
Weiss da niemand mehr? Oder würde strcpy etwas bringen?