Задание:
Задано текст из 32 символов, состоящий из слов, разделенных одним пробелом. Определить количество слов и количество согласных букв в каждом слове.
Текст программы:
.386; Директива определения типа микропроцессора
. Model flat, stdcall; задачи линейной модели памяти
; И соглашения ОС Windows
option casemap: none;отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
ExitProcess proto: DWORD
BSIZE equ 30
. Data; директива определения данных
_a dword 3.0; сохранение в 32-разрядной ячейке памяти переменной х
_sum dword 0
sum dword 0
temp_ecx dd 0
mas1 db 'Privet kak dela u tebya'
mas2 db 'qwrtpsdfghjklzxcvbnmQWRTPSDFGHJKLZXCVBNM'
st1 db "Вывод количества слов:" 0
st2 db 10 dup (?), 0
ifmt db "Количество слов в тексте =% d. Количество согласных букв =% d", 0
. Code; директива начала кода
_start:
lea edi, mas1
mov ecx, 23
mov edx, 0
kol:
mov al, ' '
mov ebx, ecx
repne scasb
sub ebx, ecx
. IF (ebx> 2)
inc _sum
. ENDIF
add ecx, 0
jnz kol
lea edi, mas1
mov ecx, 23
m1:
mov al, ' '
mov bl, [edi]
xor al, bl; проверка слова
jz m2
mov temp_ecx, ecx; хранения регистра
mov ecx, 40
lea esi, mas2
mov al, [esi]
_S1:
. IF (al == bl); сложная условие
inc sum;подсчет количества согласных букв
jmp _mm1
. ELSE; иначе
inc esi; расчет адреса нового числа
mov al, [esi]
loop _S1; перейти, если ecx? 0
. ENDIF
_mm1: mov ecx, temp_ecx ;возврат счетчика
_m1:
cld
inc edi
loop m1
jmp m3
m2:
mov edx, 0
jmp _m1
m3:
mov edx, _sum
mov eax, sum; перемещения числа согласных букв
invoke wsprintf, \
ADDR st2, \
ADDR ifmt, \
edx, eax; вывод содержимого
invoke MessageBox, \
NULL, \
addr st2, \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; окончания программы
Результат работы программы: