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