Найти в строке количество символов - Assembler
Формулировка задачи:
Дана строка. Найти в ней количество символов.
Я задала строку Hellco worldcc. Ищу количество символов "с". Что не так?
.model small .stack 200h .data str1 db 'Hellco worldcc$' len db ? ;длина next_str db 13d, 10d, '$' Print_STRING MACRO message mov ah,9 lea dx, message int 21h endm .code .startup start: Print_STRING str1 Print_STRING next_str xor bx,bx ;очистить счетчик xor cx,cx mov cl,[len] ;длина строки lea si,str1 ;на строку mov al,'c' ;символ, который надо подсчитать m1: repne scasb ;искать символ в строке jnz exit ;символ не найден, выход m2: ;найден inc bl ;увеличить счетчик на 1 test cx,cx ;если СХ не 0, в строке есть символы, jnz m1 ; продолжить поиск exit: ;----------Вывод на экран--------- mov ax,bx ;вывод на экран xor cx, cx mov bx, 10 ; основание сс. 10 для десятеричной и т.п. oi2: xor dx,dx div bx ; Делим число на основание сс. В остатке получается последняя цифра. ; Сразу выводить её нельзя, поэтому сохраним её в стэке. push dx inc cx ; А с частным повторяем то же самое, отделяя от него очередную ; цифру справа, пока не останется ноль, что значит, что дальше ; слева только нули. test ax, ax jnz oi2 ; Теперь приступим к выводу. mov ah, 02h oi3: pop dx ; Извлекаем очередную цифру, переводим её в символ и выводим. add dl, '0' int 21h ; Повторим ровно столько раз, сколько цифр насчитали. loop oi3 ;----------------------------------------- .exit(0) end
Решение задачи: «Найти в строке количество символов»
textual
Листинг программы
xor bx,bx ;очистить счетчик xor cx,cx mov cl,[len] ;длина строки lea di,str1 ;на строку указывает es:di mov ax,ds mov es,ax cld ;выбрать направление перебора - вперёд mov al,'c' ;символ, который надо подсчитать m1: repne scasb ;искать символ в строке jnz exit ;символ не найден, выход m2: ;найден inc bl ;увеличить счетчик на 1 test cx,cx ;если СХ не 0, в строке есть символы, jnz m1 ; продолжить поиск exit:
Объяснение кода листинга программы
- xor bx,bx - очистить счетчик.
- xor cx,cx - используется в качестве регистра-счетчика.
- mov cl,[len] - длина строки записывается в регистр cx.
- lea di,str1 - указатель на строку.
- mov ax,ds - регистр ax содержит сегмент данных.
- mov es,ax - регистр es содержит сегмент строки.
- cld - указывает направление перебора - вперёд.
- mov al,'c' - символ, который необходимо подсчитать.
- repne scasb - поиск символа в строке.
- jnz exit - если символ не найден, выход.
- m2: - найден символ.
- inc bl - увеличение счетчика на 1.
- test cx,cx - проверка, не равен ли 0 счетчик cx.
- jnz m1 - продолжить поиск.
- exit: - конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д