Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Model Small
- Stack 1024
- .186
- DATASEG
- OutValNL db 1 ;Флаг перехода на новую строку.
- BufLen db 240 ;Максимальное количество символов для ввода
- BufSize db 0h ;Реальное количестве введенных символов
- Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
- NewLine db 0Dh, 0Ah, '$' ;Строка - переход на новую линию.
- InputStr db 'Введите строку: $';
- CharsCount db 'Количество слов в строке: $';
- Separators db ' ,;' ;Разделители слов - пробел, запятая, точка с запятой
- Alphabet db 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' ;Алфавит допустимых символов слов
- CODESEG
- Start:
- mov ax,@data
- mov ds,ax ;Адрес сегмента данных куда положено
- mov es,ax
- mov dx,offset InputStr
- call OutStr
- call ReadLine
- mov dx,offset NewLine
- call OutStr
- mov si,offset Text
- xor dx,dx
- xor bx,bx
- ;Скинирование слов осуществляется следующим образом: сначала пропускаем все разделительные знаки
- ;Далее проверяем на символ, допустимый в слове.
- ;Если это он - то увеличиваем счетчик найденных слов, если не он - просто пропускаем неизвестный символ.
- ;Если нашли точку - то выходим.
- ;Цикл поиска работает до тех пор, пока не встретит символ точки.
- xor dx,dx
- Scan:
- mov di,offset Separators
- mov cx,3h
- mov al,[si]
- repne scasb ;Проверим на соответствие символа одному из разделителей
- jnz ScanWords ;Если не разделитель - сканируем строку дальше.
- jmp NextChar ;;В противном случае, переходим к следующему символу и снова проверям на разделитель
- ScanWords:
- mov di,offset Alphabet
- mov cx,77 ;Всего 77 досупных символов, из которых могут получаться слова
- mov al,[si]
- repne scasb ;Проверим, какие у нас тут символы
- jnz NotWord ;Если это даже не символ слова, то пропустим неизвестный символ
- mov bl,1 ;Поставим флаг, что слово найдено
- inc si
- jmp ScanWords
- NotWord:
- cmp al,'.' ;Проверим на соответствие точке
- je EndOfText ;Если да - выходим
- add dh,bl ;Иначе приращиваем счетчик найденных слов на bl (он будет 1, если слово найдено, и 0, если нет)
- mov bl,0 ;Обнуляем флаг слова.
- NextChar:
- inc si
- jmp Scan
- EndOfText: ;Выведем подсказку вывода и количество найденных слов
- add dh,bl
- xor ax,ax
- mov al,dh
- mov dx,offset CharsCount
- call OutStr
- call OutVal
- mov ah,04ch
- int 21h
- ;Функция, читает строку символов с клавиатуры
- ReadLine:
- pusha
- mov ah,0ah
- mov dx,offset BufLen
- int 21h
- popa
- ret
- ;Функция, выводит содержимое регистра ax на экран.
- ;Перед этим, двоичное значение в AX преобразуется в строку по адресу Text.
- OutVal:
- pusha
- mov si,offset Text
- test ax,ax
- jns d0
- neg ax
- mov [si],byte ptr '-'
- inc si
- d0:
- mov bx,10
- xor cx,cx
- d1:
- xor dx,dx
- idiv bx
- push dx
- inc cx
- test ax,ax
- jnz d1
- d2:
- pop ax
- add al,"0"
- mov [si],al
- inc si
- loop d2
- mov [si],byte ptr '$'
- mov dx, offset Text
- call OutStr
- cmp [OutValNL],0
- je NotOutNL
- mov dx, offset NewLine
- call OutStr
- NotOutNL:
- popa
- ret
- ;Выводит строку по адерсу ds:dx
- OutStr:
- pusha
- mov ah,09h
- int 21h
- popa
- ret
- END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement