Assembler (Win32): Strings aneinanderreihen



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


Anmelden zum Antworten