Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ORG 100H
- START:
- call enter
- mov ah,10
- mov dx,pierwszy
- int 21h ;wpisujemy sobie ciąg z klawiatury
- mov bx,pierwszy
- mov bufor,bx ;ładujemy ciąg do bufora. Przed kolejnym użyciem iloscZnakow trzeba będzie wyczyścić bufor i przepisać do niego kolejny ciąg
- call iloscZnakow
- call enter
- mov ah,2 ;wyświetla znak, którego kod ASCII jest w dl
- mov dl,[jakaszmienna] ;dl = ilość liter w ciągu znaków (nie w ASCII, trzeba dodać "0"/48 żeby się wyświetliło co trzeba)
- int 21h ;wyświetla dl
- mov ax,4c00h
- int 21h
- iloscZnakow:
- pusha ;wrzuca wszystkie rejestry na stos
- mov bx,0 ;w bx będzie nasza ilość liter w ciągu znaków
- mov di,2 ;do indeksowania
- mov cl,[bufor+1] ;w cl mamy ile znaków jest w buforze, będzie to licznik pętli p
- p:
- mov dl,[bufor+di] ;do dl przenosimy di+1 element bufora - min. 2, bo 1 i 2 mają odpowiednio maksymalną długość ciągu i faktyczną długość ciągu
- cmp dl,65 ;sprawdzamy, czy di+1 element jest większy/równy niż 65
- jge costam ;65 w ASCII to "A". Sprawdzamy po prostu, czy to nie jest jakiś dziwny znak przed "A"
- poczymstam: ;to jest po to, żeby można było do czegoś skoczyć po sprawdzeniu, czy di+1 element jest literą
- inc di ;zwiększamy di, żeby sprawdzić następny element
- dec cl ;zmniejszamy licznik pętli
- cmp cl,0 ;porównujemy cl do 0
- jg p ;jeśli cl większe to robi wszystko od nowa
- ;tutaj już czynią się rzeczy po skończeniu pętli. W bx jest ilość liter w ciągu
- mov [jakaszmienna],bx ;przenosimy zawartość bx do jakiejś zmiennej - bx zostanie nadpisane po popa
- popa ;z powrotem wyrzucamy wszystkie stosy
- ret
- costam: ;cośtam ma dalej sprawdzać, czy di+1 element jest liczbą
- cmp dl,90
- jle cos ;jeśli di+1 element jest "Z" (90 w ASCII to "Z"), to idziemy do czegoś
- cmp dl,97 ;jeśli di+1 element nie jest dużą literą, to zaczynamy sprawdzać. W tym celu sprawdzamy, czy jest to jakaś litera po "a"
- jge cosinnego ;jeśli to jest coś po "a" lub to jest to "a", to wszystko idzie do czegoś innego
- jmp poczymstam ;jeśli to nie jest żadna litera, to po prostu wracamy. Jeśli wygodniej, to można użyć ret'a
- cos: ;coś ma po prostu zwiększyć bx, w którym siedzi ta liczba liter w ciągu
- inc bx ;zwiększamy bx
- jmp poczymstam ;wracamy. Może być też ret
- cosinnego: ;jeśli program doszedł do tego momentu, to oznacza, że di+1 element jest czymś po "a"
- cmp dl,122 ;sprawdzamy, czy di+1 element jest małą literą (122 to "z", więc patrzymy, czy dl jest czymś pomiędzy "a", a "z")
- jle cosjeszczeinnego ;jeśli jest, to idziemy do czegoś jeszcze innego (w sumie można było iść od razu do czegoś, ale lubię utrudniać ludziom życie, coś jeszcze innego działa identycznie jak coś)
- jmp poczymstam ;jeśli to nie jest mała litera, tylko coś po niej, to wracamy
- cosjeszczeinnego: ;patrz: coś
- inc bx
- jmp poczymstam
- jakaszmienna db 0 ;w tej zmiennej przechowywana jest długość ciągu znaków (samych liter), trzeba sobie przenosić jej zawartość do różnych rejestrów przed kolejnymi użyciami procedury iloscZnakow, bo się będzie nadpisywać
- pierwszy:
- db 20 ; def wielkość bufora na 20 bajtów
- db 0 ; ilość znaków w buforze
- .text: times 22 db "$"
- bufor:
- db 20 ; def wielkość bufora na 20 bajtów
- db 0 ; ilość znaków w buforze
- .text: times 22 db "$"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement