Liczenie liczby litery "a" w asm

0

Mam problem z kodem w asemblerze linux,nasm. Chodzi o to że napisałem nie do końca działający program który liczy ile razy występuje litera "a" w podanym ciągu z tym że maksymalna liczba tych liter wynosi 9 (aby łatwo było przekonwertować na ascii). Kod wygląda tak :


section .text
global _start
_start:

mov eax,3
mov ebx,0
mov ecx,tekst
mov edx,[dlugosc]
int 80h

xor esi,esi
xor edi,edi
xor ah,ah

_petla:
mov edi,[tekst+esi]
cmp edi,0ah    ;sprawdza litery dopóki nie znajdzie znaku końca lini
je _end          ;w przypadku znalezienia tego znaku program kończy sprawdzanie

_warunek:
cmp edi,[letter]
jne _enda
inc ah,
_enda:
inc esi
jmp _petla
_end:

add ah,48     ;jak już napisałem wyżej maksymalna liczba litery a wynosi 9 wiec aby przekonwerować to na 
mov [ile],ah   ;ascii wystarczy dodac 48

mov eax,4
mov ebx,1
mov ecx,ile
mov edx,[dlile]
int 80h

mov eax,1
int 80h

section .data
tekst times 50 db 0
dlugosc dd $ - tekst

letter db "a"

ile dd 0
dlile dd $ - ile

Wynik zawsze jest równy 0, dlaczego?

0

O RLY? Napisałeś? Mam jakieś dejavu z tym:
http://4programmers.net/Forum/Inne/243090-asembler_-_analiza_kodu_nasm_zliczanie_literek_a_w_zdaniu
;]
Ale wracając do pytania, robisz tu przynajmniej jeden błąd -> czytasz po słowie a nie po bajcie. Weź pod uwagę że rejestry maja różne rozmiary! Jak zrobisz mov edi,[tekst+esi] to wczytasz 4 bajty a nie 1...

0

Tak napisałem, może cie to zdziwi ale do tego kodu co wysłałeś dostęp ma co najmniej 150 - 200 osób z roku i ja również,ale po kij przerabiać kod którego sie nie rozumie, dlatego chciałem napisać po swojemu :) . A co do rejestrów : to jeżeli zmodyfikuję ten kod trochę inaczej (czyli wywalę ten warunek w środku i zamiast wyświetlania zwartości ah, dam esi to program policzy mi liczbę liter w ciągu i to działa poprawnie) a w tym programie nawet jak zmienię ah bo tylko tutaj widze różnice w rejestrach na np esp to w dalszym ciągu wyświetla 0. Problem jest w zagnieżdżonej pętli i inkrementacji ah/esi ja tego znaleźć nie mogę to może wy?

0

o_O O czym ty mówisz? Czy ty w ogóle rozumiesz co robisz? o_O
ah i al mają po 1 bajt
ax ma 2 bajty
eax ma 4 bajty
Analogicznie dla innych rejestrów, np. twoje esp ma 4 bajty.
Jak robisz mov rejestr, pamięć to liczba bajtów do wczytania do rejestru jest wyliczana na podstawie rozmiaru tego rejestru chyba że miałbyś tam byte ptr jakieś. Więc jak czytasz do edi na przykład to wczytasz 4 bajty! W ogóle robisz tu cuda na kiju bo jak zrobisz cmp edi,[letter] to porównasz znów 4 bajty! Więc zamiast porównać coś z jedną literką a porównujesz z tą literką i z 3 innymi bajtami które są akurat obok niej w pamięci. Geniusz...

0

Nie sądzisz ze gdybym w 100% rozumiał ten kod i język nie byłoby tego tematu?? Dzięki za pomoc... poprzerabiam i zobaczę co z tego wyjdzie

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