Посчитать сколько раз встречаются символы - 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
Объяснение кода листинга программы
- Включаем файл 'win32ax.inc'.
- Задаем строку символов, находящуюся по адресу A1 и длиной N.
- Создаем буфер для вывода результатов.
- Создаем формат строки для вывода результатов.
- Создаем ячейки памяти NX, NY, NZ для хранения количества вхождений символов X, Y, Z.
- Запускаем программу.
- Программа ищет символ X, сохраняет количество его вхождений в переменную NX.
- Программа ищет символ Y, сохраняет количество его вхождений в переменную NY.
- Программа ищет символ Z, сохраняет количество его вхождений в переменную NZ.
- Программа выводит результаты на экран.
- Программа завершается.
- Создаем процедуру поиска символа.
- Процедура ищет символ, начиная с начала строки.
- Процедура устанавливает цикл до конца строки.
- В цикле проверяет, равен ли текущий символ искомому.
- Если символы не равны, увеличивает счетчик количества вхождений.
- После цикла возвращает 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д