Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проги.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
25.08 Кб
Скачать

Int 21h ; ввод строки - прерывание дос

; нахождение первого слова

mov ch,0 ; старший байт = 0

mov cl,len ; количество байт (символов) для сканирования

lea di,text ; адрес строки

mov al,' ' ; искомый символ

mov dx,di ; начало самого короткого слова

find_space:

mov si,di ; запомнить адрес начала текущего слова

repne scasb ; сканировать пока не равно пробелу

; вычисление длины слова

mov bx,di ; указывает на следующий символ после найденного

sub bx,si ; вычесть адрес начала слова

jz no_min ; перейти если длина=0 (подряд 2 пробела)

inc colW ;//////

cmp cx,0 ; если просканирована вся строка

jz end_str ; перейти на метку

dec bx ; реальная длина слова, т.к. di указывал на символ

; следующий за пробелом

jz no_min ; перейти если длина=0 (подряд 2 пробела)end_str:

cmp bx,min ; сравнение длины слова (ВХ) с самым коротким

jge no_min ; если длина больше либо равна - то перейти

inc count

no_min:

cmp cx,0 ; если просканированна не вся строка

jnz find_space ; тогда перейти - продолжить сканирование

xor cx,cx

mov cl,len

lea di, text

mov al,'I'

forM: repne scasb

inc colI

cmp cx,0

jnz forM

lea dx, text1

call WrStr

dec colI

mov ax,colI ;количество слов меньше первого по длине

mov Num,ax

call StrCon

lea dx, StrNum

call WrStr

mov ax,colW ;////////////количество слов всего

mov Num,ax

call StrCon

lea dx,StrNum

call WrStr ;////////////////

call StrCon

; вывод сообщения о необходимости нажатия клавиши

mov dx,OFFSET Msg_press ;адрес выводимого сообщения

mov ah,09h ; функция вывода строки на экран

int 21h ; прерывание DOS

; ожидаем нажатие клавиши

mov ah,1 ; ввод символа с клавиатуры - задержка

int 21h ; чистим буфер, ждем ввода

; завершение программы

mov ah,4ch ; функция завершения программы

int 21h

;_______________ ADD PROC ______________

;-------------- Proc WrStr -------------

WrStr proc near

push ax

mov ah,09h

int 21h

pop ax

ret

WrStr endp

;-------------- Proc StrCon ------------StrCon proc

push ax

push cx

push dx

push bx

push si

mov bx,-1

p1: inc bx

xor ax,ax

mov StrNum[bx],al

cmp bx,3

jne p1

mov cx, 10

lea si, StrNum + 3

mov ax, Num

p2: cmp ax, 10

jb p3

cwd

div cx

add dl, 30h

mov [si], dl

dec si

jmp p2

p3:

add al, 30h

mov [si], al

pop si

pop bx

pop dx

pop cx

pop ax

ret

StrCon endp

;________________ END __________________

CODE ENDS

END start ; Start - метка начала исполнение программы

4-я кол-во I

STACK_ SEGMENT ; Сегмент стека

db 100 dup(?) ; резервируем 100 байт

STACK_ ENDS

DATA SEGMENT ; Сегмент данных

; выводимые сообщения

Msg_Inp db 'Enter the line: $'

Msg_Press db 10,13,'Press any key ...$'

Msg_Res db 10,13,'Result: $'

Msg_Count db 10,13,'Count: $'

text1 db 10,13,'Number of words bigger then minlen: $'

String db 41 ; максимальная длина вводимой строки

len db ? ; длина введенной строки

text db 41 dup(?) ; введенная строка

min dw ? ; длина самого короткого слова

colI dw 0 ; количество слов после самого короткого

count dw 0

colW dw 0 ;///////;------------ Proc StrCon --------------

Num dw ? ; Num:=? Поле в 1 байт

StrNum db 5 dup (?),'$' ; Хранение результата перевода

counter dw ?

DATA ENDS

CODE SEGMENT ;Сегмент кода

ASSUME CS:CODE,DS:DATA,SS:STACK_ ;ассоциация сегментных регистров

start:

mov ax,data ; настройка сегментных регистров

mov ds,ax ; сегмент данных

mov es,ax ; вспомагательный сегментный регистр

cld ; очистка флага направления

; строковые операции будут проводится слева на право

; приглашения к вводу строки и ее ввод

lea dx,Msg_Inp ; адрес сообщения

mov ah,9 ; номер функции вывода строки на экран

int 21h ; прерывание ДОС - вывод строки

mov ah,0ah ; функция ввода строки

lea dx,String ; адрес структуры вводимой строки