Asembler - zliczanie liter w łańcuchu

0

Program ma za zadanie wczytać łańcuch znaków i wypisać ilość wystąpień litery 'a' w łańcuchu.

Do tej pory udało mi się osiągnąć (przez przypadek, nie było to zamierzone) jedynie wypisywanie ilości wszystkich znaków w łańcuchu:

.286
.model small
.stack 100h
.data
	podaj	db	"Podaj lancuch znakow:",13,10,'$'
	buf	db	100,101 dup('$')

.code
start:	
	mov ax,seg @data
	mov ds,ax

	mov dx,offset podaj
	mov ah,9
	int 21h

	mov dx,offset buf
	mov ah,10
	int 21h

	mov dl,10
	mov ah,2
	int 21h

	mov ah,2
	mov si,offset buf
	add si,2
	mov ax,0

petla:	
	mov dl,[si]
	cmp dl,13
	je  koniec
	cmp dl,'a'
	je licz
	cmp dl,'A'
	je licz
	
licz:	
	inc si
	inc ax
        jmp petla

koniec:	
	call wypisz
	mov ax,4c00h
	int 21h

wypisz proc
	mov cx,0ah
	mov dx,0
	div cx
	cmp ax,0
	je @@kon
	push dx
	call wypisz
	pop dx
@@kon:	
	mov ah,02h
	add dl,'0'
	int 21h
	ret
wypisz endp

end start

Jeśli to możliwe prosiłbym o pomoc z tym zadaniem, mile widziane komentarze objaśniające co dana instrukcja robi.

1

o_O przecież brakuje ci tylko

inc si
jmp petla

na samym końcu operacji w "petla", żeby pomijać zliczanie kiedy nie trafiłeś na 'a' lub 'A'

0

Jestem początkujący w temacie programowania i asemblera i dobrze myślałem, że problem jest banalny :)

Dzięki wielkie, wszystko działa!

0

Pozwolę sobie zadać kolejne pytanie, tym razem wymyśliłem sobie żeby program zliczał słowa w łańcuchu. Słowo rozumiem tutaj jako ciąg znaków po którym następuje spacja. Metoda jest taka, że w momencie kiedy napotka spacje zwiększa licznik, kiedy dojdzie do końca łańcucha również zwiększa licznik. Problem jest taki, że oczywiście można wprowadzić same spacje :D Zabezpieczyłem się przed tym sprawdzaniem czy po spacji nie nastąpiła kolejna, jeśli tak to zmniejszenie licznika. I teoretycznie to działa, ale tylko wtedy gdy np. podam dwie spacje lub więcej po sobie, jeśli wpiszę np. asemblerspacja wynikiem jest 2, a jeśli wpiszę asemblerspacjaspacja to wynikiem jest 1 czyli prawidłowo.

Inna sprawa to jest jeszcze to, że gdy podam pusty łańcuch to również wyświetli 1, ale to efekt uboczny zwiększania licznika gdy napotka koniec łańcucha.

Co poprawić/co zmienić aby było dobrze?

.286
.model small
.stack 100h
.data
	podaj	db	"Podaj lancuch znakow:",13,10,'$'
	buf	db	100,101 dup('$')

.code
start:	
	mov ax,seg @data
	mov ds,ax

	mov dx,offset podaj
	mov ah,9
	int 21h

	mov dx,offset buf
	mov ah,10
	int 21h

	mov dl,10
	mov ah,2
	int 21h

	mov ah,2
	mov si,offset buf
	add si,2
	mov ax,0

petla:	
	mov dl,[si]
	cmp dl,13
	je prawie_koniec
	cmp dl,' '
	je wyraz
	inc si
	jmp petla

wyraz:	
	mov dh,[si+1]
	inc ax
	inc si
	cmp dh,' '
	je utnij
	jmp petla

utnij:	
        dec ax
	inc si
	jmp petla

prawie_koniec:
	inc ax
	jmp koniec
	
koniec:	
	call wypisz
	mov ax,4c00h
	int 21h

wypisz proc
	mov cx,0ah
	mov dx,0
	div cx
	cmp ax,0
	je @@kon
	push dx
	call wypisz
	pop dx
@@kon:	
	mov ah,02h
	add dl,'0'
	int 21h
	ret
wypisz endp

end start

Kolejny pomysł to wypisania ilości wyrazów w których nie wystąpiła litera "a", ale nad tym będę myślał jak powyższy program będzie działał tak jak powinien.

0

@lucyfer ale WTF? Siądź na tyłku, weź do ręki kartkę papieru, ołówek i to sobie po prostu rozpisz. Twój problem nie jest z programowaniem ani z asemblerem tylko z myśleniem na poziomie szkoły podstawowej.

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