ASM - zliczanie liter w wyrazie

0

Witam !
Chciałbym napisać program który zlicza mi litery w wyrazie z tym że nie mam pojęcia jak przerwać petle jezeli juz dojdzie ko końca.
Poki co wpadłem na coś takiego ale niestety nie działa tak jak powinno



               mov       esi, tekst+0            ;w rejestrze esi jest początek wyrazu
               mov       edi, 0                     ;licznik

        _petla:
                cmp     esi, 13                    ;porównuje do znaku entera
         je _koniec:
                inc       esi                         ;przesuwa na kolejny znak
                inc       edi                         ;zwiększa licznik

                
                


        jmp _petla
        _koniec:


1

Porównujesz adres znaku, a nie sam znak. Powinno być:

        _petla:
                cmp     byte [esi], 13                    ;porównuje do znaku entera
         je _koniec
0

Nadal nie działa

0

Działa jak zamiast 13 wpisze 0ah wytłumaczy mi ktoś dlaczego 13 nie działa ?

0

Bo nie umiesz liczyć? 0ah to 10

0

Ale w tablicy znaków ACSI jest napisane że "Enter" to nr 13

0

To jest trudna kwestia.
\r to jest carrige return i to jest 13, \n to jest newline i to jest 10
http://www.asciitable.com/index/asciifull.gif
Problem w tym że dla windowsa "enter" to jest \r\n a dla linuxa \n ;]

0
[bits 32]

;stack frame
mov ebp, esp
sub esp, 0x1000


;ebp -0x100 -> Bufor na 0x1000 elementow
;scanf(%255s, esp-0x1000)
lea eax, [ebp-0x1000]
mov esi, eax
push eax


;Tutaj wywołujesz sobie scanf() by wprowadzic znaki. 



;ile zanakow?

xor ecx, ecx ; zerowanie ecx
not ecx ; ecx = 0xfffffff
;esi == adres buforu

petla:
mov al, [esi] ; do al wrzucamy adres esi
inc esi ; esi++,  poniewaz znalzalo litere
test al, al ; and al, al --> if(a==0) ZF
loopnz petla 

;printf("znaki:%u %u\n", ilosc znakow)
;esi - (ebp -0x100) <-- pierwszy sposow na wylicznie ilosci znakow
;0xfffffff - ecx <-- drugi sposob na wyliczenie ilosci znakow

lea eax, [ebp-0x1000] ; eax = ebp - 0x100
sub esi, eax ;  
dec esi ;  zmniejszamy o 1 poniewaz musimy odjac znak zakonczenia stringu
push esi

xor eax, eax
not eax ; 0xfffffff
sub eax, ecx  ; od 0xfffffff odejmujemy przesuniete ecx
dec eax ; pomijamy znak zakonczenia stringu
push eax

;Dalej wywołujesz sobie printf() i exit()

1 użytkowników online, w tym zalogowanych: 0, gości: 1