;Определить слова содержащие два символа рядом
.MODEL tiny

.CODE
org	100h

start:

	mov	nst,0			; nst - число символов в строке
	lea	si,source		;адрес начала строки

	mov	ah,09h
	lea	dx,text1
	int	21h

outstr:					;воод очередного символа
	call	ReadChar	;ввод очередного сивола с клавиатуры, возвращает символ в регистр al
	mov	[si],al			;пересылка символа в строку
	cmp	al, 13   		;если  Enter ? то заканчиваем ввод строки
    je  done      		; да -  > завершение
	add	si,1			;подготовка адреса следующего символа
	inc	nst				;подсчет числа введенных символов
	jmp	outstr

done:	
	cmp	nst,0
	je	byby		;если не введено ни одного символа то на выход
					;вывод введенного текста на дисплей
	call	vkps	;перевести строку

	mov	ah,09h
	lea	dx,text2
	int	21h

	mov	n,0				;инициализация счетчика символов
	lea	si,source		;загрузка адреа строки
	
lab1:	
	inc	n				;подсчет символов
	mov	al,[si]			;чтение символа из строки
	call WriteChar		;вывод на дисплей очередного символа
	mov	bx,nst			;загрузка длинны строки
	cmp	n,bx			;проверка не конец ли строки
	je	lab2			;строка закончена
	add	si,1			;формирование адреса следующего символа
	jmp	lab1			;преход на вывод следующего символа
	
lab2:	
	call vkps			;перевод строки

;сохранить параметры в стеке

	lea	bp, source
	push bp				;сохранить в стеке адрес строки
	mov	bp,nst
	push bp				;сохранить в стеке длину строки

	call work			;вызов подпрограммы определения соседних слов начинающихся с одной буквы

	pop	bp				;восстановить стек
	pop	bp				;восстановить стек
	
byby:	
	ret	
	
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@WORK@@WORK@@WORK@@WORK@@WORK@@WORK@@WORK@@WORK@@WORK@@WORK@@WORK@@WORK@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

work proc 				;поиск оинаковых символов в слове и вывод этого слова на экран

	push bp
	mov	bp,sp			;сохранить увазатель стека
	push ax
	push bx
	push si
	push cx
	
	mov	si,[bp+4]		;в si пересылаем длину строки
	mov	bx,si			;получим число символов в строке из стека
	mov	si,[bp+6]		;получим адрес строки из стека

	cld				;строка читается слева на право
	
	xor	cx,cx		;сброс счетчика символов в строке

m1:	mov	nm,si		;запоминаем место в строке
	mov k,cx		;запоминаем номер позиции
	
m2:	mov	dl,[si]		
	lodsb			;чтение символа из строки
	inc	cx			;подсчет числа символов
	cmp	cx,bx		;проверка не конец ли строки
	je	m3			;строка закочиена
	
	mov al,' '
	mov di,si
	scasb
	jnz t	
	
	inc cx ;пробел = > слово закончено возвращаемся к проверке
	mov si,di
	jmp m1
t:
	cmp	dl,[si]		;сравниваем два символа стоящих рядом
	jne	m2			;буквы не равны (движемся дальше по слову)
	;буквы равны
	mov si,nm		;восстанавливаем указатель строки на начало слова
	mov cx,k		;восстанавливаем счётчик символов на начало подходящего слова


v:	lodsb			;читаем символ

	mov	dl,al  		;выводим его на экран
	mov	ah,2  
    int	21h
	
	inc cx			;увеличиваем счётчик символов в слове
	cmp cx,bx		;не конец ли строки?
	je m3			;конец - выход)
	
	mov al,' '
	mov di,si
	scasb
	jnz t1		
	inc cx	;пробел = > слово закончено возвращаемся к проверке
	mov si,di
	
	mov	dl,' '  		;выводим его на экран
	mov	ah,2  
    int	21h	
	
	jmp m1
t1:
	jmp v			;нет не пробел - продолжаем печатать
		
m3:					;метка выхода
	pop	cx
	pop	si
	pop	bx			;восстанавливаем регистры из стека
	pop	ax
	pop	bp
	
	ret				;выход
work endp

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;вывод символа на диплей
WriteChar proc  
    mov dl, al  
    mov ah, 2  
    int 21h
    ret  
WriteChar endp 

; ввод одного символа с клавиатуры
ReadChar proc 
    mov ah,1 
    int 21h
	
    ret  
ReadChar endp

;перевод строки
vkps proc 
	push ax
	push dx	
	mov ah,09h		
	lea dx,crlf
	int 21h
	int	21h
	pop	dx
	pop	ax
	
    ret  
vkps endp

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@@DATA@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

nst	dw	0	;n-число элементов в строке
n	dw 	0
nm	dw 	0
k dw 0		;номер позиции в строке (вспомогательная переменная)

text1	db	'vvedite stroku >  ','$'
text2	db	'vyvod stroki >  ','$'

crlf	db	0dh,0ah,'$'      ; возврат каретки, перевод строки 
source	db	100 DUP(?) 

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

end start