Найти в строке количество символов - 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: - конец работы программы.