Найти в строке количество символов - 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: - конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д