Посчитать сколько раз встречаются символы - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите, пожалуйста, решить задачу, для неё используется отладчик AFDP. Сама задача: В памяти дана строка символов, находящаяся по адресу А1 и длиной N. Посчитать сколько раз встречаются символы "x", "y" и "z". Результат записать в три смежные ячейки памяти. Есть в качестве примера часть кода, но на FASM. Из-под отладчика будет ругаться.
Листинг программы
  1. mov si,a; Запоминаем начало строки
  2. xor ax,ax; Готовим регистр для счета кол-ва вхождения
  3. mov cx,n; Устанавливаем цикл до конца строки
  4. for:
  5. cmp byte [si+cx],'z' ;Если символ равен некоему
  6. jne next;
  7. inc ax; Увеличиваем счетчик кол-ва
  8. next:
  9. loop for
  10. mov z,ax; А потом запоминаем его в переменку

Решение задачи: «Посчитать сколько раз встречаются символы»

textual
Листинг программы
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.     ; В памяти дана строка символов, находящаяся по адресу А1
  5.     A1  db 'HI! I''M THE XXXXXYYZ PROGRAM! NEW YORK! NEWZELAND!'
  6.     ; и длиной N
  7.     N   =  $ - A1
  8.  
  9.     buffer  rb MAX_PATH
  10.     formatd db 'Символ X встречается: %d раз', 13, 10
  11.         db 'Символ Y встречается: %d раз', 13, 10
  12.         db 'Символ Z встречается: %d раз', 0
  13.  
  14.     ; Ячейки памяти
  15.     NX  dd ?
  16.     NY  dd ?
  17.     NZ  dd ?
  18.  
  19.  
  20. .code
  21.  
  22.   start:
  23.     ; Ищем X
  24.     mov BL, 'X'
  25.     call    find_char
  26.     ; Записываем в переменку NX
  27.     mov [NX], eax
  28.     ; Ищем Y
  29.     mov BL, 'Y'
  30.     call    find_char
  31.     ; Записываем в переменку NY
  32.     mov [NY], eax
  33.     ; Ищем Z
  34.     mov BL, 'Z'
  35.     call    find_char
  36.     ; Записываем в переменку NZ
  37.     mov [NZ], eax
  38.  
  39.     ; Выводим результат и выходим из программы
  40.     cinvoke wsprintf, buffer, formatd, [NX], [NY], [NZ]
  41.     invoke  MessageBox, HWND_DESKTOP, buffer, "Задачка", MB_OK
  42.     invoke  ExitProcess,0
  43.  
  44.   ; Процедура поиска символа
  45.   find_char:
  46.     ; Запоминаем начало строки
  47.     mov ESI, A1
  48.     ; Готовим регистр для счета кол-ва вхождения
  49.     xor EAX, EAX
  50.     ; Устанавливаем цикл до конца строки
  51.     mov ECX, N
  52.      for:
  53.     ; Если символ равен некоему
  54.     cmp byte [ESI+ECX], BL
  55.     jne next
  56.     ; Увеличиваем счетчик кол-ва
  57.     inc EAX
  58.      next:
  59.     loop    for
  60.     ret
  61.  
  62. .end start

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

  1. Включаем файл 'win32ax.inc'.
  2. Задаем строку символов, находящуюся по адресу A1 и длиной N.
  3. Создаем буфер для вывода результатов.
  4. Создаем формат строки для вывода результатов.
  5. Создаем ячейки памяти NX, NY, NZ для хранения количества вхождений символов X, Y, Z.
  6. Запускаем программу.
  7. Программа ищет символ X, сохраняет количество его вхождений в переменную NX.
  8. Программа ищет символ Y, сохраняет количество его вхождений в переменную NY.
  9. Программа ищет символ Z, сохраняет количество его вхождений в переменную NZ.
  10. Программа выводит результаты на экран.
  11. Программа завершается.
  12. Создаем процедуру поиска символа.
  13. Процедура ищет символ, начиная с начала строки.
  14. Процедура устанавливает цикл до конца строки.
  15. В цикле проверяет, равен ли текущий символ искомому.
  16. Если символы не равны, увеличивает счетчик количества вхождений.
  17. После цикла возвращает 0.

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


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

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

12   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы