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

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

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

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

lea dx,Msg_Res ; адрес выводимого сообщения

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 ;////////////////

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

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 - метка начала исполнение программы

5. Колличество слов в введенной строке.

;-------------- Поле стека -------------

stk segment stack 'stack'

db 256 dup("?")

stk ends

;------------- Поле данных -------------

data segment para public 'data'

buffer db 99,102 dup ('$')

mas db 49 dup (?)

CRLF db 0dh,0ah,'$'

text db 'Enter a string of words','$'

text1 db ' shorter than Num ','$'

save dw ?

exc dw ?

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

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

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

Negate db ? ; Флаг отрицательности

count db 0

counter dw ?

data ends

;----------- Текст программы -----------

code segment para public 'code'

assume cs:code, ds:data, es:data, ss:stk

;________________ START ________________

start:

mov ax,data

mov ds,ax

xor ax,ax

;------------- BASIC PROC --------------

xor bx,bx

lea dx,text call WrStr

call NextL

;------------- Inputting --------------

mov ah,0ah

mov dx,offset buffer

int 21h

mov ax,03 ;функция очистки экрана

int 10h

;------------- Search end --------------

mov ax,ds

mov es,ax

cld

mov cx,100

mov al,0dh

mov di, offset buffer + 2

REPNE SCAS buffer

je F

F: mov exc,di

dec di

mov buffer[di],' '

;------------- Search space --------------

mov ax,offset buffer + 2

mov save,ax

mov mas[bx],100

t1: xor ax,ax

cld

mov cl,mas[0]

t3: mov al,' '

mov di,save

cmp di,exc

je t4

REPNE SCAS buffer

je FOUND

NOTFOUND: lea dx,text1

call WrStr

jmp t4

FOUND: xor ax,ax

mov ax,di

sub ax,save

cmp ax,1

je t2

sub di,2

push bx

mov ax,di

mov bx,save

sub ax,bx

pop bx

inc al

inc bx

mov mas[bx],al

mov al,mas[0]

sub al,mas[bx]

dec al

mov mas[0],al

add di,2

mov save,di jmp t1

t2: dec cx

mov mas[0],cl

mov save,di

jmp t3

;------------- Search max --------------

t4: xor ax,ax

mov al,mas[bx]

mov Num,bx

;------------- Search min max --------------

xor cx,cx

mov si,0

t8: inc si

cmp al,mas[si]

jle t7

inc cx

t7: cmp bx,si

jne t8

;------------- Output --------------

push Num

mov Num,cx

call StrCon

lea dx, StrNum

call WrStr

lea dx,text1

call WrStr

pop Num

call StrCon

lea dx, StrNum

call WrStr

call NextL

mov dx,offset buffer + 2

call WrStr

mov ah,1 ;Функція затримання програми

int 21h

;---------------- END PROC ------------------

mov ah,4ch

int 21h

;_______________ ADD PROC ______________

;-------------- Next Line -------------

NextL proc near

lea dx,CRLF

call WrStr

NextL endp

;-------------- 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

jmp p1

p2: inc count

mov bl,count

xor ax,ax

mov StrNum[bx],al

cmp bx,8

jne p2

lea si, StrNum + 8

mov ax, '$'

mov [si], al

jmp p3

p1: mov cx, 10 ;Фактор деления равен 10

mov count,0

xor bx,bx

jmp p2

p3:

lea si, StrNum + 4 ;Последний символ строки вывода

mov ax, Num ;Заносим в ax число

mov Negate, 0 ;Флаг отрицательности пока не

; установлен

cmp ax, 8000h ;Если старший бит установлен

jb p4 ; то число отрицательно

neg ax ;Возвращаем к положительной форме

mov Negate, 1 ;Устанавливаем флаг отрицательности

p4: cmp ax, 10 ;Если частное меньше 10 то

; прекратить цикл

jb p5 ; и начать рассмотрение знака

cwd ;Иначе расширить знак (для деления)

div cx ; И разделить на фактор деления

or dl, 30h ;Перевести остаток в ASCII

mov [si], dl ; И записать в строку

dec si ;Уменьший индекс

jmp p4 ;И вернуться на начало цикла

p5:

or al, 30h ;Перевести частное в ASCII

mov [si], al ; и занести в строку

cmp Negate, 0 ;Если не был установлен флаг

; отрицательности

jz p6 ;То выйти из процедуры

dec si ;Иначе еще раз уменьшить индекс

mov byte ptr [si], '-' ;И записать в него значок минуса

p6:

pop si

pop bx

pop dx

pop cx

pop ax

ret ;Возврат из процедуры

StrCon endp

;________________ END __________________

code ends

end start