ZAS     SEGMENT STACK           ;direktiva pre assembler - zaciatok
                                ;zasobnikoveho segmentu
        DW      64 DUP(?)       ;definicia 64-och slov
ZAS     ENDS                    ;koniec zasobnikoveho segmentu
;----------------------------------------------------------------------------
DATA    SEGMENT                 ;zaciatok datoveho segmentu
menu    DB      10,10,13,'MOLNAR TOMAS 2.rocnik ZS 2001/2002',10,13,'prve  zadanie',10,10,13,'1. Hlada v retazci zadany znak a vypise poziciu jeho prveho vyskytu',10,13,'2. Vypise pocet slov zadaneho retazca',10,13,'3. Najde znak s maximalnou hodnotou a vypise tento znak',10,13,'4. Vypise povodne nacitany retazec v obratenom poradi',10,13,'5. Ukonci vykonavanie programu',10,10,13,'$'
zadz	db	10,10,13,'Zadajte znak ktory chcete vyhladat',10,13,'$'
zadr	db	10,10,13,'Zadajte retazec (max 100 znakov)',10,13,'$'
nevysk  db	10,10,13,'Zadany znak sa v retazci nevyskytuje$'
vysk	db	10,10,13,'Zadany znak sa v retazci vyskytuje na mieste cislo $'
rpslov	db	10,10,13,'Pocet slov je : $'
rmaxz   db	10,10,13,'Maximalny znak : $'
VSTUP	DB 99
POCET	DB 0
RETAZ	DB 80 DUP(?) 
DATA    ENDS                    ;koniec segmentu
;----------------------------------------------------------------------------
CODE    SEGMENT                 ;zaciatok kodoveho segmentu
        ASSUME  CS:CODE, DS:DATA, SS:ZAS        ;direktiva - oznamuje
                                ;assembleru aktivne segmenty
START:  MOV AX, SEG DATA        ;do AX vloz segmentovu cast adresy
        MOV DS, AX              ;seg. cast adresy presun do DS
        MOV DX, OFFSET zadr     ;do DX vloz posunutie retazca v dat. segmente
        MOV AH, 09H             ;funkcia vypis retazca (write string)
        INT 21H
	MOV DX,OFFSET VSTUP  ; v DS:DX ocakava DOS sluzba zaciatok bufra
	MOV AH,0aH           ; sluzba Dos pre bufrove nacitanie retazca
	INT 21H	             ; Dos-ske prerusenie
st2:	MOV DX, OFFSET menu     ;do DX vloz posunutie retazca v dat. segmente
        MOV AH, 09H             ;funkcia vypis retazca (write string)
        INT 21H
ov:	mov ah,8 	      	;ziadost o nacitanie znaku
	int 21h			;vstup z klavesnice
	cmp al,'1'              ;zistenie vyberu
	jnz m1
	jmp hladzna              
m1:	cmp al,'2'
	jnz m2
	jmp pocslov
m2:	cmp al,'3'
	jnz m3
	jmp maxznak
m3:	cmp al,'4'
	jnz m4
	jmp obrat	
m4:	cmp al,'5'		
	jnz  ov		;opakuj ponuku
	jmp koniec    	  
;-----------------------------------------------------------
hladzna:MOV DX, OFFSET zadz   ;vypise text
	MOV AH, 09H
	INT 21H
	mov ah,1                  ;nacitanie znaku
	int 21h
	mov si,offset retaz       ;v si je adresa retaz-e
	mov cx,1			
h2:	cmp al,[si]		;porovna zadany znak so znakom na adrese si
	jz  h1			;ak su rovnake skoc na h1
	inc si			;ak nie zvetci si a cx o 1
	inc cx
	cmp cl,pocet		;dosiahli sme koniec retazca ?
	jbe h2	
h1:	cmp cl,pocet		
	jbe h3
	MOV DX, OFFSET nevysk	;vypis spravy
	MOV AH, 09H
	INT 21H
	jmp start		;skok na zaciatok programu
h3:	mov ax,cx		;do ax daj hodnotu znaku rovnakeho so zadanym
	MOV DX, OFFSET vysk	;vypis oznam
	call cislo		;vola podprg.cislo
	jmp st2			;skok na menu
;-----------------------------------------------------------	
pocslov:
	mov cx,1		;nastav pocitadlo na 1
	mov bx,0		;vynuluj bx
	mov si,offset retaz	
p2:	cmp byte ptr[si],' '	;zistenie ci na adr si sa nachadza medzera
	jnz p1			;ak ano skok na p1
	inc si			;ak nie zvis si a cx o1
	inc cx
	cmp cl,pocet		;sme na konci retazca ?
	jbe p2			;ak nie opakuj(skoc) na p2
	jmp p3 			;ak hej skok na p3
p1:     inc bx			;zvis bx o1
p5:	cmp byte ptr[si],' '	;je za tou medzerou dalsia ?
	jz p4			;ak nie skok na p4
	inc si			;ak ano zvis si a cx o1 
	inc cx	
	cmp cl,pocet		;sme na konci ?	
	jbe p5			;ak nie skoc na p5
	jmp p3 			;ak koniec ret
p4:	inc si
	inc cx
	jmp p2
p3:	mov ax,bx
	MOV DX, OFFSET rpslov
	call cislo
	jmp st2
;-----------------------------------------------------------
maxznak: mov cx,1
	mov bl,0
	mov si, offset retaz
max4:	cmp bl,[si]
	jae max3
	mov bl,[si]
max3:	inc si
	inc cx
	cmp cl,pocet
	jbe max4
	mov dx,offset rmaxz
	mov ah,9
	int 21h
	mov dl,bl
	mov ah,2
	int 21h
	jmp st2
;-----------------------------------------------------------
obrat:	xor cx,cx
	mov cl,pocet
	mov si,offset retaz
	add si,cx
	dec si
o1:	mov dl,[si]
	mov ah,2
	int 21h
	dec si
	loopnz o1
	jmp st2
;-----------------------------------------------------------
	
koniec: MOV AX, 4C00H           ;funkcia ukoncenie programu
        INT 21H
cislo:	mov cl,10		;ziskanie posunutia v asciitvare z 
	div cl			;posunutia najdeneho znaku
	add al,48
	add ah,48
	push ax			;odlozenie ax na zasobnik pre neskorsie pouzitie
	MOV AH, 09H		;vypisanie spravy
	INT 21H
	pop ax			;obnovenie ax
	push ax			;znova ulozenie ax na zasobnik
	mov dl,al		
	mov ah,2		;zobrazenie miesta vyskytu znaku
	int 21h
	pop ax			;obnovenie ax zo zasobnika
	mov dl,ah		
	mov ah,2
	int 21h
	ret			;navrat z podprogramu
CODE    ENDS                    ;koniec kodoveho segmentu
        END     START           ;koniec suboru - pre assembler


;PREKLAD:        [cesta]\tasm /l/zi/c subor.asm
;LINKOVANIE:     [cesta]\tlink /l/i/v subor.obj
;POMOCNE PROGRAMY:    j:\thelp\help.exe, abshelp.exe
                     j:\tasm\thelp.com
                     j:\ng\ng.exe   

;!!!pozrite si vyznam prepinacov pri preklade a spajani(spustite iba tasm alebo tlink)!!!