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

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

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

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

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

textual
Листинг программы
include 'win32ax.inc'
 
.data
    ; В памяти дана строка символов, находящаяся по адресу А1
    A1  db 'HI! I''M THE XXXXXYYZ PROGRAM! NEW YORK! NEWZELAND!'
    ; и длиной N
    N   =  $ - A1
 
    buffer  rb MAX_PATH
    formatd db 'Символ X встречается: %d раз', 13, 10
        db 'Символ Y встречается: %d раз', 13, 10
        db 'Символ Z встречается: %d раз', 0
 
    ; Ячейки памяти
    NX  dd ?
    NY  dd ?
    NZ  dd ?
 
 
.code
 
  start:
    ; Ищем X
    mov BL, 'X'
    call    find_char
    ; Записываем в переменку NX
    mov [NX], eax
    ; Ищем Y
    mov BL, 'Y'
    call    find_char
    ; Записываем в переменку NY
    mov [NY], eax
    ; Ищем Z
    mov BL, 'Z'
    call    find_char
    ; Записываем в переменку NZ
    mov [NZ], eax
 
    ; Выводим результат и выходим из программы
    cinvoke wsprintf, buffer, formatd, [NX], [NY], [NZ]
    invoke  MessageBox, HWND_DESKTOP, buffer, "Задачка", MB_OK
    invoke  ExitProcess,0
 
  ; Процедура поиска символа
  find_char:
    ; Запоминаем начало строки
    mov ESI, A1
    ; Готовим регистр для счета кол-ва вхождения
    xor EAX, EAX
    ; Устанавливаем цикл до конца строки
    mov ECX, N
     for:
    ; Если символ равен некоему
    cmp byte [ESI+ECX], BL
    jne next
    ; Увеличиваем счетчик кол-ва
    inc EAX
     next:
    loop    for
    ret
 
.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
Похожие ответы