Advertisement
Abaduaber

NatVid_2

May 25th, 2013
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Model Small
  2. Stack 1024
  3. .186
  4. DATASEG
  5.     OutValNL db 1 ;Флаг перехода на новую строку.
  6.     BufLen db 240 ;Максимальное количество символов для ввода
  7.     BufSize db 0h ;Реальное количестве введенных символов
  8.     Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
  9.     NewLine db 0Dh, 0Ah, '$' ;Строка - переход на новую линию.
  10.  
  11.     InputStr db 'Введите строку: $';
  12.     CharsCount db 'Количество слов в строке: $';
  13.     Separators db ' ,;' ;Разделители слов - пробел, запятая, точка с запятой
  14.     Alphabet db 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'    ;Алфавит допустимых символов слов
  15. CODESEG
  16.  
  17. Start:
  18.     mov ax,@data
  19.     mov ds,ax ;Адрес сегмента данных куда положено
  20.     mov es,ax
  21.     mov dx,offset InputStr
  22.     call OutStr
  23.     call ReadLine
  24.     mov dx,offset NewLine
  25.     call OutStr
  26.     mov si,offset Text
  27.     xor dx,dx
  28.     xor bx,bx
  29.    
  30.     ;Скинирование слов осуществляется следующим образом: сначала пропускаем все разделительные знаки
  31.     ;Далее проверяем на символ, допустимый в слове.
  32.     ;Если это он - то увеличиваем счетчик найденных слов, если не он - просто пропускаем неизвестный символ.
  33.     ;Если нашли точку - то выходим.
  34.     ;Цикл поиска работает до тех пор, пока не встретит символ точки.
  35.     xor dx,dx
  36. Scan:
  37.     mov di,offset Separators
  38.     mov cx,3h
  39.     mov al,[si]
  40.     repne scasb ;Проверим на соответствие символа одному из разделителей
  41.     jnz ScanWords ;Если не разделитель - сканируем строку дальше.
  42.     jmp NextChar    ;;В противном случае, переходим к следующему символу и снова проверям на разделитель 
  43. ScanWords:
  44.     mov di,offset Alphabet
  45.     mov cx,77 ;Всего 77 досупных символов, из которых могут получаться слова
  46.     mov al,[si]
  47.     repne scasb ;Проверим, какие у нас тут символы
  48.     jnz NotWord ;Если это даже не символ слова, то пропустим неизвестный символ
  49.     mov bl,1    ;Поставим флаг, что слово найдено
  50.     inc si
  51.     jmp ScanWords
  52. NotWord:
  53.     cmp al,'.' ;Проверим на соответствие точке
  54.     je EndOfText ;Если да - выходим
  55.     add dh,bl ;Иначе приращиваем счетчик найденных слов на bl (он будет 1, если слово найдено, и 0, если нет)
  56.     mov bl,0 ;Обнуляем флаг слова.
  57. NextChar:
  58.     inc si
  59.     jmp Scan
  60. EndOfText:      ;Выведем подсказку вывода и количество найденных слов
  61.     add dh,bl
  62.     xor ax,ax
  63.     mov al,dh
  64.     mov dx,offset CharsCount
  65.     call OutStr
  66.     call OutVal
  67.  
  68.     mov ah,04ch
  69.     int 21h
  70.  
  71.     ;Функция, читает строку символов с клавиатуры
  72. ReadLine:
  73.     pusha
  74.     mov ah,0ah
  75.     mov dx,offset BufLen
  76.     int 21h
  77.     popa
  78.         ret
  79.  
  80.     ;Функция, выводит содержимое регистра ax на экран.
  81.     ;Перед этим, двоичное значение в AX преобразуется в строку по адресу Text.
  82. OutVal:
  83.     pusha
  84.     mov si,offset Text
  85.     test ax,ax
  86.     jns d0
  87.     neg ax
  88.     mov [si],byte ptr '-'
  89.     inc si
  90. d0:
  91.     mov bx,10
  92.     xor cx,cx
  93. d1:
  94.     xor dx,dx
  95.     idiv bx
  96.     push dx
  97.     inc cx
  98.     test ax,ax
  99.     jnz d1
  100. d2:
  101.     pop ax
  102.     add al,"0"
  103.     mov [si],al
  104.     inc si
  105.     loop d2
  106.     mov [si],byte ptr '$'
  107.     mov dx, offset Text
  108.     call OutStr
  109.     cmp [OutValNL],0
  110.     je NotOutNL
  111.     mov dx, offset NewLine
  112.     call OutStr
  113. NotOutNL:
  114.     popa
  115.     ret
  116.  
  117.     ;Выводит строку по адерсу ds:dx
  118. OutStr:
  119.     pusha
  120.     mov ah,09h
  121.     int 21h
  122.     popa
  123.     ret
  124. END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement