Определить количество слов в заданном тексте - 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                 ;

Объяснение кода листинга программы

  1. format PE GUI 4.0 — это описание формата исполняемого файла, который содержит графический интерфейс и предназначен для операционной системы Windows.
  2. include '%fasm%\include\win32ax.inc' — это включение файла с набором функций и констант для работы с Win32 API.
  3. include '%fasm%\include\encoding\win1251.inc' — это включение файла с набором функций и констант для работы с кодировкой Win1251.
  4. .data — это раздел, в котором хранятся данные программы.
  5. mas1 db 'Привет! Как дела у тебя?' — это определение переменной типа строка (db), которая содержит текст Привет! Как дела у тебя?.
  6. size = $ - mas1 — это вычисление длины строки mas1, где $ — это символ конца строки.
  7. text db 'Исходная строка: Привет! Как дела у тебя?',13,13,'Слов в строке: ' — это определение переменной типа строка (db), которая содержит текст Исходная строка: Привет! Как дела у тебя? Слов в строке:.
  8. buff db 0,0,0 — это определение переменной типа строка (db), которая содержит три нулевых байта.
  9. .code — это раздел, в котором находится код программы.
  10. start: — это метка начала выполнения программы.
  11. lea edi,[mas1] — это команда, которая устанавливает регистр DI в качестве индекса для доступа к переменной mas1.
  12. mov ecx,size — это команда, которая устанавливает регистр CX в качестве счетчика для перебора символов в строке mas1.
  13. xor bx,bx — это команда, которая устанавливает регистр BX в ноль, который будет использоваться как счетчик слов.
  14. mov al,' ' — это команда, которая устанавливает регистр AL в символ пробела для поиска в строке.
  15. repne scasb — это команда, которая выполняет поиск символа пробела в строке с использованием регистра AL и счетчика CX.
  16. or ecx,ecx — это команда, которая проверяет, была ли просмотрена вся строка.
  17. jz stop — это команда, которая переходит к метке stop, если все символы были проверены.
  18. inc bx — это команда, которая увеличивает значение регистра BX на единицу, чтобы учесть текущее слово.
  19. jmp @b — это команда, которая переходит к метке @b, чтобы продолжить поиск следующего слова.
  20. stop: — это метка, которая обозначает конец строки.
  21. inc bx — это команда, которая увеличивает значение регистра BX на единицу, чтобы учесть последнее слово.
  22. mov ax,bx — это команда, которая копирует значение регистра BX в регистр AX.
  23. aam 3030h — это команда, которая делит значение регистра AX на 100 и приводит результат к типу Decimal.
  24. or ax,3030h — это команда, которая добавляет смещение в 3030h к значению регистра AX, чтобы получить ASCII-код для отображения.
  25. xchg ah,al — это команда, которая меняет местами регистры AH и AL, чтобы сохранить результат в правильном формате.
  26. mov word[buff],ax — это команда, которая сохраняет результат в переменной buff, которая является двухбайтовым буфером.
  27. invoke MessageBox,0,text,'Подсчёт слов',MB_OK — это команда, которая отображает диалоговое окно с сообщением Подсчёт слов, используя текстовые переменные.
  28. invoke ExitProcess,0 — это команда, которая завершает работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы