Advertisement
Guest User

Untitled

a guest
Jan 5th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2. .stack 200h
  3.  
  4. .data
  5.   array      db 256 dup(0)
  6.   arraycount   dw 0
  7.   vowels    db 'eyuioa', 0
  8.   vowelscount dw 7
  9.   loadstr    db 0Dh, 0Ah, 'Input text:', 0Dh, 0Ah, '$'
  10.   resstr     db 0Dh, 0Ah, 'Result words:', 0Dh, 0Ah, '$'
  11.   linestr    db 0Dh, 0Ah, '$'
  12.  
  13. .code
  14.  
  15. ; -----------------------------------------------
  16. ; точка входа в программу
  17.  
  18. start:
  19.  
  20.     mov ax, @data ; пишем в ах адрес сегмента данных
  21.     mov ds, ax ; закидываем адрес в регистр сегмента данных
  22.     mov es, ax ; и в регистр расширенного сегмента данных
  23.    
  24.     call Main ; вызываем главную процедуру
  25.    
  26.     mov ah, 01h ; ждем ввода с клавы - шоб прога не закрылась сразу
  27.     int 21h
  28.    
  29.     mov ah, 4Ch ; выходим
  30.     int 21h
  31.  
  32. ; -----------------------------------------------------------------------------
  33. ; выход: в array - помещаются введенные символы
  34. ;        в arraycount - помещается число введенных символов
  35.  
  36. Read proc
  37.  
  38.     push ax
  39.     push bx
  40.     push cx
  41.     push dx
  42.     push di
  43.  
  44.     ; выводим информационную строку
  45.     mov dx, offset loadstr
  46.     mov ah, 09h
  47.     int 21h
  48.  
  49.     mov cx, 0 ; обнуляем счетчик введенных символов
  50.     mov di, offset array ; загружаем смещение начала буфера строки
  51.     cld ; сброс флага направления
  52.  
  53.   rstart:
  54.  
  55.     ; получаем очередной символ
  56.     mov ah, 01h
  57.     int 21h
  58.  
  59.     cmp al, 13 ; если ввод закончен, нажата клавиша Enter
  60.     jz rend
  61.  
  62.     cmp al, 8 ; если не нажата клавиша Backspace
  63.     jnz rsymbol
  64.  
  65.     ; обработка клавиши Backspace
  66.  
  67.     cmp cx, 0 ; еще остались введенные символы
  68.     jz rstart
  69.  
  70.     dec cx ; уменьшим число введенных символов
  71.     dec di ; уменьшим индекс сохраняемого символа
  72.  
  73.     mov dl, ' ' ; затираем ранее введенный символ
  74.     mov ah, 02h
  75.     int 21h
  76.  
  77.     mov dl, 8 ; возвращаем курсор на символ назад
  78.     mov ah, 02h
  79.     int 21h
  80.    
  81.     jmp rstart
  82.  
  83.    rsymbol:
  84.  
  85.     ; обработка введенного символа
  86.  
  87.     stosb ; в al лежит введенный символ, сохраняем в по адресу es:di
  88.     inc cx ; увеличиваем кол-во введенных символов
  89.     cmp cx, size array - 1 ; проверяем, не заполнен ли массив символов
  90.     jb rstart ; если нет, то считываем еще символ
  91.  
  92.   rend:
  93.  
  94.     ; дополним ввод разделителем
  95.     mov al, ' '
  96.     stosb
  97.     inc cx
  98.     mov arraycount, cx
  99.  
  100.     ; востанавливаем регистры и выходим
  101.    
  102.     pop di
  103.     pop dx
  104.     pop cx
  105.     pop bx
  106.     pop ax
  107.    
  108.     ret
  109.  
  110. Read endp
  111.  
  112. ; -----------------------------------------------
  113. ; вход: ds:si - индекс начала выводимого слова
  114.  
  115. Write proc
  116.  
  117.     push ax
  118.     push bx
  119.     push cx
  120.     push dx
  121.     push di
  122.     push si
  123.  
  124.     ; выводим текущее слово
  125.  
  126.   wstart:
  127.  
  128.     lodsb ; загружаем символ из es:di в al
  129.     cmp al, ' '
  130.     jz wend ; если наткнулись на пробел, то вывод окончен
  131.  
  132.     ; выводим текущий символ
  133.  
  134.     mov dl, al
  135.     mov ah, 02h ; вывод на экран символа из dl
  136.     int 21h
  137.    
  138.     jmp wstart
  139.  
  140.   wend:
  141.  
  142.     ; выводим строку завершения
  143.     mov dx, offset linestr
  144.     mov ah, 09h
  145.     int 21h
  146.  
  147.     ; востанавливаем регистры и выходим
  148.  
  149.     pop si
  150.     pop di
  151.     pop dx
  152.     pop cx
  153.     pop bx
  154.     pop ax
  155.  
  156.     ret
  157.  
  158. Write endp
  159.  
  160. ; -----------------------------------------------
  161. ; вход: al - искомый символ
  162. ; выход: cf=0 - не найден, cf=1 - найден
  163.  
  164. Find proc
  165.  
  166.     push cx
  167.     push di
  168.  
  169.     ; поиск заданного символа в массиве допустимых
  170.  
  171.     mov cx, vowelscount
  172.     mov di, offset vowels
  173.     repne scasb ; сравниваем введенные символы с гласными пока не найдем гласную во введенных символах
  174.     jcxz fclr ; прошли весь массив и ничего не нашли
  175.     stc ; нашли и устанавливаем cf
  176.     jmp fend
  177.  
  178.   fclr:
  179.  
  180.     clc ; не нашли и сбрасываем cf
  181.  
  182.   fend:
  183.  
  184.     ; востанавливаем регистры и выходим
  185.  
  186.     pop di
  187.     pop cx
  188.  
  189.     ret
  190.  
  191. Find endp
  192.  
  193. ; -----------------------------------------------
  194. ; вход: ds:si - индекс начала проверяемого слова
  195. ; выход: cf=0 - не подходит, cf=1 - подходит
  196.  
  197. Check proc
  198.  
  199.     push ax
  200.     push si
  201.  
  202.     mov ah, 0 ; предыдущий символ не из допустимых
  203.  
  204.   cstart:
  205.  
  206.     lodsb
  207.     cmp al, ' ' ; если нарвались на разделитель,
  208.     jz cbad     ; то слово закончилось
  209.  
  210.     call Find ; ищем символ среди допустимых
  211.     jc clast  ; нашли символ среди допустимых
  212.  
  213.     mov ah, 0 ; последний проверенный символ недопустим
  214.     jmp cstart
  215.  
  216.   clast:
  217.  
  218.     cmp ah, 0 ; предыдущий символ был допустим
  219.     jnz cok ; текущий и предыдущий символ был допустим
  220.  
  221.     mov ah, 1 ; последний проверенный символ допустим
  222.     jmp cstart
  223.  
  224.    cbad:
  225.  
  226.      clc ; не наше слово и сбрасываем cf
  227.      jmp cend
  228.  
  229.    cok:
  230.  
  231.      stc ; наше слово и устанавливаем cf
  232.  
  233.   cend:
  234.  
  235.     ; востанавливаем регистры и выходим
  236.  
  237.     pop si
  238.     pop ax
  239.  
  240.   ret
  241.  
  242. Check endp
  243.  
  244. ; -----------------------------------------------
  245.  
  246. Main proc
  247.  
  248.   push ax
  249.   push bx
  250.   push cx
  251.   push dx
  252.   push di
  253.   push si
  254.  
  255.   call Read ; ввод текста в буффер
  256.  
  257.   ; выводим строку завершения
  258.   mov dx, offset linestr
  259.   mov ah, 09h
  260.   int 21h
  261.  
  262.   ; выводим информационную строку
  263.   mov dx, offset resstr
  264.   mov ah, 09h
  265.   int 21h
  266.  
  267.   mov cx, arraycount ; счетчик доступных символов
  268.   mov di, offset array
  269.   cld
  270.  
  271.   mforstart:
  272.  
  273.   ; поиск начала слова
  274.  
  275.   mov al, ' '
  276.   repe scasb
  277.   jcxz mforend ; закончился счетчик доступных символов
  278.  
  279.   ; возвращаемся на последний проанализированный символ (на начало слова)
  280.  
  281.   dec di
  282.   inc cx
  283.  
  284.   ; проверка текущего слова
  285.  
  286.   mov si, di
  287.   call Check
  288.   jnc mignore ; текущее слово не подходит
  289.  
  290.   ; выводим текущее слово
  291.  
  292.   call Write
  293.  
  294.   mignore:
  295.  
  296.   ; обходим текущее слово (ищем его окончание, т.е. первый после него разделитель)
  297.  
  298.   repne scasb
  299.   jcxz mforend
  300.  
  301.   ; возвращаемся на первый разделитель после слова
  302.  
  303.   dec di
  304.   inc cx
  305.  
  306.   jmp mforstart
  307.  
  308.   mforend:
  309.  
  310.   ; востанавливаем регистры и выходим
  311.  
  312.   pop si
  313.   pop di
  314.   pop dx
  315.   pop cx
  316.   pop bx
  317.   pop ax
  318.  
  319.   ret
  320.  
  321. Main endp
  322.  
  323. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement