Определить количество слов в заданном тексте - Assembler
Формулировка задачи:
Собственно задание - Дан текст. Определить, сколько в нем слов.
В ассемблере новичок. Интересует готовый код, чтобы разобрать построчно как и что работает.
Нашел такой пример(но получил ошибки, скрин прикреплен):
.486 .model flat, stdcall option casemap: none[SPOILER][/SPOILER] 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& gt: 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); сложная условие 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 invoke wsprintf, \ ADDR st2, \ ADDR ifmt, \ edx; вывод содержимого invoke MessageBox, \ NULL, \ addr st2, \ addr st1 \ MB_OK invoke ExitProcess, 0 end _start; окончания программы[SPOILER][SPOILER][SPOILER][SPOILER][/SPOILER][/SPOILER][/SPOILER][/SPOILER]
Решение задачи: «Определить количество слов в заданном тексте»
textual
Листинг программы
format PE GUI 4.0 include '%fasm%\include\win32ax.inc' include '%fasm%\include\encoding\win1251.inc' .data mas1 db 'Привет! Как дела у тебя?' size = $ - mas1 ; длина строки MAS1 text db 'Исходная строка: Привет! Как дела у тебя?',13,13,\ 'Слов в строке: ' ; текст в окне buff db 0,0,0 ; с продолжением в виде 2-байтного буфера .code ; start: ; lea edi,[mas1] ; DI = адрес строки mov ecx,size ; CX = длина строки xor bx,bx ; BX = счётчик слов (пока нуль) mov al,' ' ; AL = символ для поиска @@: ; repne scasb ; ищем пробелы.. or ecx,ecx ; всю строку проверили? jz stop ; inc bx ; счётчик +1 jmp @b ; продолжаем поиск.. stop: ; строка закончилась! inc bx ; учитываем последнее слово mov ax,bx ; aam ; переводим счётчик в DEC or ax,3030h ; ..и в символы xchg ah,al ; mov word[buff],ax ; сохраняем результат в переменной invoke MessageBox,0,text,'Подсчёт слов',MB_OK invoke ExitProcess,0 ; .end start ;
Объяснение кода листинга программы
- format PE GUI 4.0 — это описание формата исполняемого файла, который содержит графический интерфейс и предназначен для операционной системы Windows.
- include '%fasm%\include\win32ax.inc' — это включение файла с набором функций и констант для работы с Win32 API.
- include '%fasm%\include\encoding\win1251.inc' — это включение файла с набором функций и констант для работы с кодировкой Win1251.
- .data — это раздел, в котором хранятся данные программы.
- mas1 db 'Привет! Как дела у тебя?' — это определение переменной типа
строка
(db), которая содержит текстПривет! Как дела у тебя?
. - size = $ - mas1 — это вычисление длины строки mas1, где $ — это символ конца строки.
- text db 'Исходная строка: Привет! Как дела у тебя?',13,13,'Слов в строке: ' — это определение переменной типа
строка
(db), которая содержит текстИсходная строка: Привет! Как дела у тебя? Слов в строке:
. - buff db 0,0,0 — это определение переменной типа
строка
(db), которая содержит три нулевых байта. - .code — это раздел, в котором находится код программы.
- start: — это метка начала выполнения программы.
- lea edi,[mas1] — это команда, которая устанавливает регистр DI в качестве индекса для доступа к переменной mas1.
- mov ecx,size — это команда, которая устанавливает регистр CX в качестве счетчика для перебора символов в строке mas1.
- xor bx,bx — это команда, которая устанавливает регистр BX в ноль, который будет использоваться как счетчик слов.
- mov al,' ' — это команда, которая устанавливает регистр AL в символ пробела для поиска в строке.
- repne scasb — это команда, которая выполняет поиск символа пробела в строке с использованием регистра AL и счетчика CX.
- or ecx,ecx — это команда, которая проверяет, была ли просмотрена вся строка.
- jz stop — это команда, которая переходит к метке stop, если все символы были проверены.
- inc bx — это команда, которая увеличивает значение регистра BX на единицу, чтобы учесть текущее слово.
- jmp @b — это команда, которая переходит к метке @b, чтобы продолжить поиск следующего слова.
- stop: — это метка, которая обозначает конец строки.
- inc bx — это команда, которая увеличивает значение регистра BX на единицу, чтобы учесть последнее слово.
- mov ax,bx — это команда, которая копирует значение регистра BX в регистр AX.
- aam 3030h — это команда, которая делит значение регистра AX на 100 и приводит результат к типу Decimal.
- or ax,3030h — это команда, которая добавляет смещение в 3030h к значению регистра AX, чтобы получить ASCII-код для отображения.
- xchg ah,al — это команда, которая меняет местами регистры AH и AL, чтобы сохранить результат в правильном формате.
- mov word[buff],ax — это команда, которая сохраняет результат в переменной buff, которая является двухбайтовым буфером.
- invoke MessageBox,0,text,'Подсчёт слов',MB_OK — это команда, которая отображает диалоговое окно с сообщением
Подсчёт слов
, используя текстовые переменные. - invoke ExitProcess,0 — это команда, которая завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д