Подсчитать сколько раз в строке встречается заданная буква - 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

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы