Подсчитать сколько раз в строке встречается заданная буква - Assembler
Формулировка задачи:
Нашел код тут на форуме скоммпилировал в tasm выводит не понятно, что, а долно выводить количество заданых букв в тексте.
.model tiny
.code
.386
org 100h
start:
mov ah,10 ;ввод строки
lea dx,strBig
int 21h
mov ah,2 ;перевод строки
mov dl,10
int 21h
xor bx,bx ;очистить счетчик
xor cx,cx
mov cl,[len] ;длина строки
lea di,str ;на строку
mov al,'c' ;символ, который надо подсчитать
m1:
repne scasb ;искать символ в строке
jnz short exit ;символ не найден, выход
m2: ;найден
inc bl ;увеличить счетчик на 1
test cx,cx ;если СХ не 0, в строке есть символы,
jnz short 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
;-----------------------------------------
xor ax,ax ;ждать нажатия клавиши
int 16h
ret ;выход из программы
;--------Строка-----------
strBig db 41 ;40 символов
len db ? ;длина
str: ;строка
end start
При запуске программы выводит сразу 1 и потом при вводе символов выводить числа "1044" и т.д.
Решение задачи: «Подсчитать сколько раз в строке встречается заданная буква»
textual
Листинг программы
.model tiny .code .386 org 100h start: mov ah,10 ;ввод строки lea dx,strBig int 21h mov ah,2 ;перевод строки mov dl,10 int 21h xor bx,bx ;очистить счетчик xor cx,cx mov cl,[len+1] ;длина строки lea di,strBig ;на строку mov al,'c' ;символ, который надо подсчитать m1: repne scasb ;искать символ в строке jnz short exit ;символ не найден, выход m2: ;найден inc bl ;увеличить счетчик на 1 test cx,cx ;если СХ не 0, в строке есть символы, jnz short 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 ;----------------------------------------- xor ax,ax ;ждать нажатия клавиши int 16h ret ;выход из программы ;--------Строка----------- strBig db 41 ;40 символов len db ? ;длина ;str: ;строка end start