Подсчёт вхождений символа в строку - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите,пожалуйста,составить программу по составленной мной блок-схеме.Задание: входные данные:адрес массива,конец массива: $,код символа-в каком-либо регистре,выходные данные:количество найденных символов

Решение задачи: «Подсчёт вхождений символа в строку»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
 
kbdBuffer       db      80, 0, 80 dup(0)
Prompt          db      'Enter string: ', 0Dh, 0Ah, '$'
Result          db      'Count: ', '$'
CrLf            db      0Dh, 0Ah, '$'
 
Count           dw      0
Char            db      '0'
String          db      80 dup(0)
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;ввод строки
        ;строка приглашения к вводу
        mov     ah,     09h
        lea     dx,     Prompt
        int     21h
        ;чтение в буфер из клавиатуры
        mov     ah,     0Ah
        lea     dx,     kbdBuffer
        int     21h
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;копирование из буфера в переменную строки
        lea     si,     kbdBuffer+2
        lea     di,     String
        mov     cx,     0
        mov     cl,     [kbdBuffer+1]
        jcxz    @@SkipCopy
        push    es
        pushf
        push    ds
        pop     es
        cld
        rep     movsb
        popf
        pop     es
@@SkipCopy:
        ;добавление признака конца строки
        mov     byte ptr [di],  '$'
 
        ;обработка строки - подсчёт количества вхождений
        ;символа в строку
        mov     Count,  0
        lea     si,     String
        cld
@@While:
        lodsb                   ;ввести элемент массива, АДРЕС+1
        cmp     al,     '$'     ;сравнить элемент с кодом "конец массива"
        je      @@Break
        cmp     al,     Char    ;проверить элемент массива на равенство искомому символу
        jne     @@While
        inc     Count           ;СЧЁТ=+1
        jmp     @@While
@@Break:
 
        ;вывод результата на экран
        mov     ah,     09h
        lea     dx,     Result
        int     21h
        mov     ax,     Count
        aam
        add     ax,     '00'
        mov     dl,     ah
        mov     dh,     al
        mov     ah,     02h
        int     21h
        mov     dl,     dh
        int     21h
 
        ;код завершения программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

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

6   голосов , оценка 4 из 5