Liczenie liczby litery "a" w asm

Odpowiedz Nowy wątek
2014-12-12 15:35
Yelled2
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?

Pozostało 580 znaków

2014-12-12 15:38
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...


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 2x, ostatnio: Shalom, 2014-12-12 15:43

Pozostało 580 znaków

2014-12-12 15:49
Yelled2
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?

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2014-12-12 16:00
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...


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.

Pozostało 580 znaków

2014-12-12 16:02
Yelled2
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

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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