
- •Найти количество слов меньше первого.
- •Самое маленькое слово вывести
- •Int 21h ; ввод строки - прерывание дос
- •3. Самое маленькое слово найти.
- •Int 21h ; ввод строки - прерывание дос
- •Int 21h ; ввод строки - прерывание дос
- •Int 21h ; ввод строки - прерывание дос
- •5. Колличество слов в введенной строке.
- •6. Підрахувати кількість слів, коротших ніж останнє
- •7. Количество слов больше первого по длине
- •8. Підрахувати кількість слів праворуч найкоротшого
- •Int 21h ; ввод строки - прерывание дос
- •9. Для вывода слова
- •10. Подсчет колличества букв в слове.
- •11. Колличество слов, больше самого короткого.
- •12. Количество слов после самого короткого
- •13. Підрахувати кількість слів праворуч найбольшего.
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