Advertisement
YomoMan

Untitled

May 10th, 2021
3,089
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.          .586
  2.          .MODEL  flat, stdcall
  3.          OPTION CASEMAP:NONE
  4.  
  5. Include kernel32.inc
  6. Include masm32.inc
  7.  
  8. IncludeLib kernel32.lib
  9. IncludeLib masm32.lib
  10.  
  11.          .CONST
  12. MsgExit  DB     0AH,0DH,"Program ending...",0AH,0DH,0
  13. initial  DB     "Initial string: ", 0
  14. result   DB     "Numbers of strings: ", 0
  15.  
  16.  
  17.          .DATA
  18. cons        DB      "qwrtpsdfghjklzxcvbnm", 0
  19. vowels      DB      "yueioa", 0
  20.  
  21. cons_size   dword   20
  22. vowels_size dword   6
  23. source      DB      "yome trio   texe    help plse", 0
  24. space       DB      "  ", 0
  25. endl        DB      10, 13, 0
  26.  
  27. buf         DB      40 DUP (?)
  28. string      DB      100 DUP (?)
  29.  
  30.  
  31.  
  32.  
  33.          .CODE
  34. Start:
  35.         ;-вывод изначальной строки--
  36.         Invoke StdOut, ADDR initial
  37.         Invoke StdOut, ADDR source
  38.         Invoke StdOut, ADDR endl
  39.         ;---------------------------
  40.        
  41.         Invoke StdOut, ADDR result
  42.        
  43.        
  44.         ;--ВЫЧИСЛЕНИЕ ДЛИНЫ СТРОКИ--
  45.         lea edi, source
  46.         mov ecx, 100
  47.         mov al, 0
  48.      repne scasb
  49.         mov eax, 100
  50.         sub eax, ecx
  51.         mov ecx, eax
  52.         dec ecx
  53.         ;---------------------------
  54.        
  55.        
  56.         cld ; направление слева на право
  57.      
  58.      
  59.         ;-добавим служебные пробелы в строку-
  60.         push ecx
  61.         lea esi, source
  62.         lea edi, string
  63.        rep movsb
  64.         mov ecx, 2
  65.         lea esi, space
  66.        rep movsb
  67.         pop ecx
  68.         add ecx, 2
  69.         ;------------------------------------
  70.        
  71.        
  72.        
  73.         mov ebx, 0          ; счетчик номера слова
  74.         lea esi, string
  75.      cycle: cmp ecx, 0      ; проверка на окончание строки
  76.             jle ecx_0       ; если закончилась - прыгаем к метке ecx_o
  77.             lodsb           ; загружаем первый символ слова в AL
  78.             dec ecx         ; загрузили символ - увеличилась и длина строки
  79.             inc ebx         ; увеличиваем счетчик слов
  80.             lea edi, cons   ; чтобы проверить, является ли первая буква согласной (cons)
  81.             push ecx        ; поместим в edi все согласные, в ecx - кол-во всех согласных в алфавите
  82.             mov ecx, cons_size  
  83.           repne scasb       ; пытаемся найти в списке согласных букву, находящуюся в AL
  84.             pop ecx        
  85.             jne not_cons    ; если первая буква не согласная - прыгаем на метку not_cons
  86.            
  87.           is_cons:          ; если согласная,то проверяем дальше на последнюю гласную букву
  88.             mov edi, esi    ; последня буква слова - значит, что она идет до первого пробела
  89.             mov al, ' '
  90.           repne scasb       ; поэтому находим пробел, в итоге попадаем на букву ПОСЛЕ пробела
  91.             dec edi         ; поэтому дважды шагаем назад, сначала к пробелу, потом к последней букве
  92.             dec edi
  93.            
  94.            
  95.             mov esi, edi    
  96.             lodsb           ; загружаем в ALпоследнюю букву слова
  97.            
  98.             lea edi, vowels ; теперь также проверяем, является ли буква гласной
  99.             push ecx
  100.             mov ecx, vowels_size
  101.           repne scasb
  102.             pop ecx
  103.             je vowel        ; если буква гласная,то слова нам подходит и прыгаем на vowel
  104.             inc esi        
  105.             jmp cycle       ; если не подошла, начинаем занаво
  106.           vowel:
  107.             push ecx        
  108.             invoke dwtoa, ebx, addr buf     ; выводим номер слова
  109.             invoke StdOut, ADDR buf
  110.             invoke StdOut, ADDR space
  111.    
  112.             mov edi, esi
  113.             mov al, ' '
  114.           repe scasb                        ; пропускаем пробел(ы) между словами
  115.             dec edi
  116.             pop ecx
  117.             mov esi, edi
  118.             jmp cycle                       ; возврашаемся в начало
  119.            
  120.           not_cons:                         ; если первая буква не согласная,сразу переходим к следую-
  121.             mov edi, esi                    ; щему слову, пропуская все пробелы
  122.             mov al, ' '
  123.           repne scasb
  124.             mov esi, edi
  125.             jmp cycle
  126.        
  127.        
  128.     ecx_0:
  129.                          
  130.         XOR    EAX,EAX
  131.         Invoke StdOut,ADDR MsgExit
  132.         Invoke StdIn, ADDR buf, LengthOf buf       
  133.    
  134.         Invoke ExitProcess,0
  135.         End    Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement