String durchlaufen



  • Hi, ich bin totaler Anfänger und versuche einen String zu durchlaufen und dann die Länge auszugeben. Aber das Programm gibt nur "Laenge des Strings 'he' = T" aus???

    include \masm32\include\masm32rt.inc
    
        .data
    
          laenge db 2 dup(0)
          kette db "he",0
    
        .code
    
    start:
    
        print "Laenge des Strings 'he' = "
    
        mov cx,5
        xor eax,eax
        xor edx,edx
    
        zaehl:
    
            lea ebx,kette
            add ebx,eax
            cmp [ebx],edx
            je gefunden
    
            inc eax
    
        loop zaehl
    
        gefunden:
        mov laenge,al
        add laenge,48
        print ADDR laenge
    
        invoke ExitProcess,0
    
    end start
    


  • gfenz schrieb:

    cmp [ebx],edx
    

    Damit vergleichst Du, ob 4 Bytes an der Stelle [EBX] = 0 sind. Du hast aber nur ein Byte als 0 in kette belegt. Machs so:

    cmp byte ptr [ebx],dl
    

    viele grüße
    ralph



  • Man muß wissen, in welchem Format der String vorliegt, und wie die Ende-Markierung aussieht. Darüberhinaus gibt es meist auch symbolische Möglichkeiten im Assembler Dinge wie Stringlänge zu zählen (sowas wie Länge = $ - (Var + crlf)).
    Bei DB "spannender Satz",0Ah,0Dh,0 Hat man z.B. eine Null als Endemarkierung.

    Als ASCII-Code ( http://de.wikipedia.org/wiki/Steuerzeichen ) sieht das im Hexeditor so aus:

    -e200 "spannender Satz",A,D,0
    -d200
    1B11:0200  73 70 61 6E 6E 65 6E 64-65 72 20 53 61 74 7A 0A spannender Satz.
    1B11:0210  0D 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
    1B11:0220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
    1B11:0230  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
    

    Was man (lowlevel) braucht, ist ein Zeiger zum Weitersteppen im Speicher, und ein "Hochzähler". Bei Stringbefehlen ist beides zusammengefasst. Je nach Richtungsflag wird hoch oder runtergezählt.
    Beispiel mit lodsb, lobsb läd ein byte von DS:si nach al und addiert 1 auf si:

    -a100
    1B11:0100 mov si,200
    1B11:0103 lodsb
    1B11:0104 or al,al
    1B11:0106 jz 10f
    1B11:010A inc cl
    1B11:010C jmp 103
    1B11:010F nop
    1B11:0110 nop
    1B11:0111 nop
    1B11:0112
    -g 10f
    
    AX=0000 BX=0000 CX=0011 DX=0000 SP=FFFE BP=0000 SI=0212 DI=0000
    DS=1B11 ES=1B11 SS=1B11 CS=1B11 IP=010F NV UP EI PL ZR NA PE NC
    1B11:010F 90                NOP
    -
    

    Hausaufgabe wären die Antworten, warum in cl und si (abzüglich des Startwertes 200) unterschiedliche Werte stehen (und wie das zu umschiffen wäre) und wie man si wieder "runterzählen" könnte falls man das mal bräuchte 😉



  • Vielen Dank für eure Antworten, jetzt funktionierts.


Anmelden zum Antworten