.model small
.stack 100h
.data
NAPIS1 db 'Wprowadzone parametry to:$'
NAPIS2 db 10,13,'Ilosc parametrow: $'
NAPIS3 db 10,13,'Ilosc znakow w parametrach: $'
licznik1 db 0
licznik2 db 0
.code
start:
mov ax, @data
mov ds, ax
mov ax,0600h ;czyszczenie ekranu
mov bh,07h
mov cx,0000h
mov dx,184fh
int 10h
mov ah,02h ;ustawienie kursora
mov bh,00h
mov dx,0000h
int 10h
lea dx, NAPIS1 ; wypisanie napisu 'Wprowadzone parametry to'
mov ah, 09h
int 21h
xor si,si ;wyzerowanie si
etykieta:
mov dl,[es:81h+si] ;w es jest PSP, si w 1 kroku = 0, przenosi do dl
mov ah, 02h ; wyświetlenie znaku znajdującego się w dl
int 21h
inc si ;zwiększa si
cmp dl,0dh ; porównuje czy to co odczytane w dl to koniec linii poleceń
jnz etykieta ;jeżeli nie to skok do etykieta
xor si,si ; wyzerowanie si
licz:
mov dl,[es:81h+si] ;jak wyżej
cmp dl,0dh ;jak wyżej
je koniec ;jeżeli porównanie równe 0 skocz do etykiety koniec
cmp dl,20h ;porównuje wczytany znak z kodem ASCII spacji
je spacja ;jeżeli porównanie równe 0 to skocz do etykiety spacja
inc licznik1 ;zwiększ licznik1 o 1
inc si ;zwiększ si
jmp licz ;skocz do etykiety licz
spacja:
inc si ;zwiększa si (dzieki temu spacje nie są wliczone w licznik1)
inc licznik2 ;zwiększa licznik 2 ,ilość spacji jest równa ilości wyrazów
jmp licz ;skocz do etykiety licz
koniec:
lea dx, NAPIS2 ;wypisanie napisu 'Ilosc parametrow:'
mov ah, 09h
int 21h
mov ah,02h ; wypisuje zawartość zmiennej licznik 2
mov dl,licznik2
add dl,'0'
int 21h
lea dx, NAPIS3 ;wyświetlenie napisu 'Ilosc znakow w parametrach:'
mov ah, 09h
int 21h
mov ah,00h
mov al,licznik1 ; wypisuje zawartość zmiennej licznik 1
mov cl,10 ;dzielenie al/10 i dodanie 48 (przejście nia kod ascii) do wyniku dzielenia
div cl
add al,48
add ah,48
mov bh,ah ;zapisanie reszty z dzielenia do bh i dodanie 48 (przejście nia kod ascii)
mov dl,al ;wypisanie 1. cyfry (wynik dzielenia)
mov ah,02h
int 21h
mov dl,bh ;reszta z dzielenia do dl
mov ah,02h ;wypisanie 2. cyfry (reszta dzielenia)
int 21h
mov ah,4ch ; koniec programu
int 21h
end