Starałam się to poprawić, wprowadziłam licznik i generalnie w mojej głowie układa się to w całość ale niestety nie jest poprawne. Po skompilowaniu wyświetla się tekst Podaj ciąg znaków -> po podaniu niezliczona ilość "$" -> pytanie o zakończenie programu.
Więc podejrzewam, że winne są albo pętle ze stosem albo coś źle zadeklarowałam tylko nie wiem, 2 bufor?
org 100h
start:
mov ah, 9 ;wpisuje tekst zeby podac ciag znakow
mov dx, podaj
int 21h
mov ah, 0ah ;pobiera ciag znakow
mov dx, ciagznakow ;bufor na dane
int 21h
xor bx, bx ; ustawia koniec pobranego ciagu
mov bl, [dlugosc]
mov byte [tekst+bx+1], '$'
xor bx, bx ;ZERUJE BX
mov di, [tekst]
mov cx, [licznik]
xor ax, ax
bledy:
cmp bl, byte [dlugosc] ; jezeli bl == dlugosc ciagu to koniec
jz koniec
cmp cl, 0 ; jesli 0 to stos bez spacji
jz stos
stos:
mov al, [di] ;przenosi do AL wart. spod adresu DS:DI
push ax ;odłóż na stos zawartosc rej ax
inc cx ; zwieksz cx o 1
dec di ; zmniejsz DI o 1
jnz stos
zdejmij:
pop ax ;zdjemij argument z wierzchołka stosu i zapamietaj w ax
mov ax, ciagznakow2 ;bufor na dane anagramu
inc di ;zwieksz di o 1
dec cx ;zmniejsz cx o 1
jnz zdejmij
znaki:
mov dl, byte [tekst+bx] ; wypisywanie znaku
call wypisz_znak
loop znaki
call wypisz_nl
koniec:
mov dx, czyK ; wypisuje tekst czy koniec
call wypisz
call wypisz_nl
mov ah, 0 ; pobiera znak
int 16h
cmp al, 13 ; sprawdza czy znak to ENTER jesli nie to leci do start
jnz start
; pobierz z stosu numer procedury do wykonania
pop ax
int 21h
wypisz_nl:
mov dx, nowalinia
mov ah, 9
int 21h
ret
wypisz:
mov ah, 9
int 21h
ret
wypisz_znak:
mov ah, 2
int 21h
ret
nowalinia db 13, 10, '$'
ciagznakow db 100
ciagznakow2 db 100
dlugosc: db 0
licznik: dw 0
tekst: times 102 db '$'
podaj db "Podaj ciag znakow: $"
czyK db "Wyjsc z programu? (ENTER)$"