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.