Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .586
- .MODEL flat, stdcall
- OPTION CASEMAP:NONE
- Include kernel32.inc
- Include masm32.inc
- IncludeLib kernel32.lib
- IncludeLib masm32.lib
- .CONST
- MsgExit DB 0AH,0DH,"Program ending...",0AH,0DH,0
- initial DB "Initial string: ", 0
- result DB "Numbers of strings: ", 0
- .DATA
- cons DB "qwrtpsdfghjklzxcvbnm", 0
- vowels DB "yueioa", 0
- cons_size dword 20
- vowels_size dword 6
- source DB " omm hope et yt ioe sfjso", 0
- space DB " ", 0
- endl DB 10, 13, 0
- buf DB 20 DUP (?)
- string DB 200 DUP (?)
- .CODE
- Start:
- ;-вывод изначальной строки--
- Invoke StdOut, ADDR initial
- Invoke StdOut, ADDR source
- Invoke StdOut, ADDR endl
- ;---------------------------
- Invoke StdOut, ADDR result
- ;--ВЫЧИСЛЕНИЕ ДЛИНЫ СТРОКИ--
- lea edi, source
- mov ecx, 200
- mov al, 0
- repne scasb
- mov eax, 200
- sub eax, ecx
- mov ecx, eax
- dec ecx
- ;---------------------------
- cld ; направление слева на право
- ;-добавим служебные пробелы в строку-
- push ecx
- lea esi, source
- lea edi, string
- rep movsb
- mov ecx, 2
- lea esi, space
- rep movsb
- pop ecx
- add ecx, 2
- ;------------------------------------
- mov ebx, 1 ; счетчик номера слова
- lea esi, string
- mov edi, esi
- mov al, ' '
- repe scasb ; пропускаем пробел(ы) между словами
- dec edi
- inc ecx
- mov esi, edi
- cycle: cmp ecx, 0 ; проверка на окончание строки
- jle ecx_0 ; если закончилась - прыгаем к метке ecx_o
- lodsb ; загружаем первый символ слова в AL
- dec ecx ; загрузили символ - уменьшилась и длина строки
- ;inc ebx ; увеличиваем счетчик слов
- lea edi, vowels ; чтобы проверить, является ли первая буква согласной (cons)
- push ecx ; поместим в edi все согласные, в ecx - кол-во всех согласных в алфавите
- mov ecx, vowels_size
- repne scasb ; пытаемся найти в списке согласных букву, находящуюся в AL
- pop ecx
- jne not_vowel ; если первая буква не согласная - прыгаем на метку not_cons
- is_vowel: ; если согласная,то проверяем дальше на последнюю гласную букву
- mov edi, esi ; последня буква слова - значит, что она идет до первого пробела
- mov al, ' '
- repne scasb ; поэтому находим пробел, в итоге попадаем на букву ПОСЛЕ пробела
- dec edi ; поэтому дважды шагаем назад, сначала к пробелу, потом к последней букве
- dec edi
- add ecx, 2
- mov esi, edi
- lodsb ; загружаем в ALпоследнюю букву слова
- lea edi, cons ; теперь также проверяем, является ли буква гласной
- push ecx
- mov ecx, cons_size
- repne scasb
- pop ecx
- je con ; если буква гласная,то слова нам подходит и прыгаем на vowel
- ;inc esi
- mov edi, esi
- mov al, ' '
- repe scasb ; пропускаем пробел(ы) между словами
- dec edi
- inc ecx
- inc ebx
- mov esi, edi
- jmp cycle ; если не подошла, начинаем занаво
- con:
- push ecx
- invoke dwtoa, ebx, addr buf ; выводим номер слова
- invoke StdOut, ADDR buf
- invoke StdOut, ADDR space
- mov edi, esi
- mov al, ' '
- repe scasb ; пропускаем пробел(ы) между словами
- dec edi
- pop ecx
- mov esi, edi
- inc ebx
- jmp cycle ; возврашаемся в начало
- not_vowel: ; если первая буква не согласная,сразу переходим к следую-
- mov edi, esi ; щему слову, пропуская все пробелы
- mov al, ' '
- repne scasb
- repe scasb
- dec edi
- inc ecx
- mov esi, edi
- inc ebx
- jmp cycle
- ecx_0:
- XOR EAX,EAX
- Invoke StdOut,ADDR MsgExit
- Invoke StdIn, ADDR buf, LengthOf buf
- Invoke ExitProcess,0
- End Start
Add Comment
Please, Sign In to add comment