YomoMan

Untitled

May 13th, 2021 (edited)
540
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 " omm hope et yt ioe sfjso", 0
  24. space DB " ", 0
  25. endl DB 10, 13, 0
  26.  
  27. buf DB 20 DUP (?)
  28. string DB 200 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, 200
  47. mov al, 0
  48. repne scasb
  49. mov eax, 200
  50. sub eax, ecx
  51. mov ecx, eax
  52. dec ecx
  53. ;---------------------------
  54.  
  55. cld ; направление слева на право
  56.  
  57. ;-добавим служебные пробелы в строку-
  58. push ecx
  59. lea esi, source
  60. lea edi, string
  61. rep movsb
  62. mov ecx, 2
  63. lea esi, space
  64. rep movsb
  65. pop ecx
  66. add ecx, 2
  67. ;------------------------------------
  68.  
  69.  
  70.  
  71. mov ebx, 1 ; счетчик номера слова
  72. lea esi, string
  73. mov edi, esi
  74. mov al, ' '
  75. repe scasb ; пропускаем пробел(ы) между словами
  76. dec edi
  77. inc ecx
  78. mov esi, edi
  79. cycle: cmp ecx, 0 ; проверка на окончание строки
  80. jle ecx_0 ; если закончилась - прыгаем к метке ecx_o
  81.  
  82. lodsb ; загружаем первый символ слова в AL
  83. dec ecx ; загрузили символ - уменьшилась и длина строки
  84. ;inc ebx ; увеличиваем счетчик слов
  85. lea edi, vowels ; чтобы проверить, является ли первая буква согласной (cons)
  86. push ecx ; поместим в edi все согласные, в ecx - кол-во всех согласных в алфавите
  87. mov ecx, vowels_size
  88. repne scasb ; пытаемся найти в списке согласных букву, находящуюся в AL
  89. pop ecx
  90. jne not_vowel ; если первая буква не согласная - прыгаем на метку not_cons
  91.  
  92. is_vowel: ; если согласная,то проверяем дальше на последнюю гласную букву
  93. mov edi, esi ; последня буква слова - значит, что она идет до первого пробела
  94. mov al, ' '
  95. repne scasb ; поэтому находим пробел, в итоге попадаем на букву ПОСЛЕ пробела
  96. dec edi ; поэтому дважды шагаем назад, сначала к пробелу, потом к последней букве
  97. dec edi
  98. add ecx, 2
  99.  
  100. mov esi, edi
  101. lodsb ; загружаем в ALпоследнюю букву слова
  102.  
  103. lea edi, cons ; теперь также проверяем, является ли буква гласной
  104. push ecx
  105. mov ecx, cons_size
  106. repne scasb
  107. pop ecx
  108. je con ; если буква гласная,то слова нам подходит и прыгаем на vowel
  109. ;inc esi
  110. mov edi, esi
  111. mov al, ' '
  112. repe scasb ; пропускаем пробел(ы) между словами
  113. dec edi
  114. inc ecx
  115. inc ebx
  116. mov esi, edi
  117. jmp cycle ; если не подошла, начинаем занаво
  118. con:
  119. push ecx
  120. invoke dwtoa, ebx, addr buf ; выводим номер слова
  121. invoke StdOut, ADDR buf
  122. invoke StdOut, ADDR space
  123.  
  124. mov edi, esi
  125. mov al, ' '
  126. repe scasb ; пропускаем пробел(ы) между словами
  127. dec edi
  128. pop ecx
  129. mov esi, edi
  130. inc ebx
  131. jmp cycle ; возврашаемся в начало
  132.  
  133. not_vowel: ; если первая буква не согласная,сразу переходим к следую-
  134. mov edi, esi ; щему слову, пропуская все пробелы
  135. mov al, ' '
  136. repne scasb
  137. repe scasb
  138. dec edi
  139. inc ecx
  140. mov esi, edi
  141. inc ebx
  142. jmp cycle
  143.  
  144.  
  145. ecx_0:
  146.  
  147. XOR EAX,EAX
  148. Invoke StdOut,ADDR MsgExit
  149. Invoke StdIn, ADDR buf, LengthOf buf
  150.  
  151. Invoke ExitProcess,0
  152. End Start
Add Comment
Please, Sign In to add comment