Advertisement
Abaduaber

VadSid_7

Jun 7th, 2013
361
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.     Alphabet db 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'  ;Алфавит допустимых символов
  13.     AlphaC dw 0 ;счетчик
  14.     DigitsC dw 0    ;Счетчик цифр
  15.     Separators db '.,;:- '  ;Знаки препинания
  16.     SeparatorsC dw 0    ;Счетчик
  17.     AlphaBiggerT db 'Букв больше$'
  18.     SepaBiggerT db 'Знаков препинания больше$';
  19.     DigitsBiggerT db 'Цифр больше$'
  20. CODESEG
  21.  
  22. Start:
  23.     mov ax,@data
  24.     mov ds,ax ;Адрес сегмента данных куда положено
  25.     mov es,ax
  26.     mov dx,offset InputStr
  27.     call OutStr
  28.     call ReadLine
  29.     mov dx,offset NewLine
  30.     call OutStr
  31.     mov si,offset Text
  32.     xor dx,dx
  33.     mov dl,[BufSize]
  34.     ;Алгоритм работы программы в двух словах: каждый символ строки просто проверяем на его тип, и увеличиваем счетчики соответствующих
  35.     ;типов
  36. ScanNextChar:
  37.     ;Проверяем, не символ ли это алфавита?
  38.     mov di,offset Alphabet
  39.     mov cx,52
  40.     mov al,[si]
  41.     repne scasb ;Проверим на соответствие текущей буквы одному из символов алфавита
  42.     jne NextCheck ;Если не было найдено соответствие - перейдем к следующей проверке
  43. SetF:
  44.     inc word ptr [AlphaC]   ;Иначе - увеличим счетчик символов алфавита
  45.     jmp NextChar
  46. NextCheck:
  47.     ;Проверяем, не цифра ли это?
  48.     cmp byte ptr [si],'0'
  49.     jb LastCheck
  50.     cmp byte ptr [si],'9'
  51.     ja LastCheck
  52.     inc word ptr [DigitsC]  ;Если да - увеличиваем соответствующий счетчик
  53.     jmp NextChar
  54. LastCheck:
  55.     mov di,offset Separators
  56.     mov cx,5
  57.     repne scasb ;Проверим на соответствие текущей буквы одному из символов алфавита
  58.     jne NextChar ;Если не было найдено соответствие - перейдем к следующей проверке
  59.     inc word ptr [SeparatorsC]  ;Иначе, увеличим количество разделителей
  60. NextChar:
  61.     inc si
  62.     dec dx
  63.     jnz ScanNextChar
  64.     ;Выясняем, чего все-таки больше
  65.     mov ax,[AlphaC]
  66.     cmp ax,[DigitsC]
  67.     jb TestIsDigits
  68.     cmp ax,[SeparatorsC]
  69.     jb TestIsDigits
  70.     jmp AlphaBigger
  71. TestIsDigits:
  72.     mov ax,[DigitsC]
  73.     cmp ax,[SeparatorsC]
  74.     jb SepaBigger
  75.     jmp DigitsBigger
  76.     ;И выводим на экран соответствующую строку
  77. AlphaBigger:
  78.     mov dx,offset AlphaBiggerT
  79.     jmp OutRes
  80. SepaBigger:
  81.     mov dx,offset SepaBiggerT
  82.     jmp OutRes
  83. DigitsBigger:
  84.     mov dx,offset DigitsBiggerT
  85. OutRes:
  86.     call OutStr
  87.    
  88.     mov ah,04ch
  89.     int 21h
  90.  
  91.     ;Функция, читает строку символов с клавиатуры
  92. ReadLine:
  93.     pusha
  94.     mov ah,0ah
  95.     mov dx,offset BufLen
  96.     int 21h
  97.     popa
  98.         ret
  99.  
  100.  
  101.     ;Выводит строку по адерсу ds:dx
  102. OutStr:
  103.     pusha
  104.     mov ah,09h
  105.     int 21h
  106.     popa
  107.     ret
  108. END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement