Найти в каждой заданной строке количество символов "5" - Assembler

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

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

Задать с клавиатуры две строки десятичных чисел,одна стока приемник,вторая-источник.Найти в каждой строке количество символов со знаком "5".Вывести на экран найденное количество "5" в каждой строке

Решение задачи: «Найти в каждой заданной строке количество символов "5"»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
MaxLen          equ     20
s1              db      MaxLen dup(0)
s2              db      MaxLen dup(0)
kbdBuffer       db      MaxLen+1, 0, (MaxLen+1) dup(0)
PromptS1        db      'Input first string: ', '$'
PromptS2        db      'Input second string: ', '$'
msgInFirst      db      'In first string: ', '$'
msgInSecond     db      'In second string: ', '$'
CrLf            db      0Dh, 0Ah, '$'
Count1          dw      0
Count2          dw      0
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;обработка первой строки
        mov     ah,     09h
        lea     dx,     PromptS1
        int     21h
        lea     dx,     s1
        call    Process
        mov     Count1, ax
        ;обработка второй строки
        mov     ah,     09h
        lea     dx,     PromptS2
        int     21h
        lea     dx,     s2
        call    Process
        mov     Count2, ax
        ;вывод результата
        mov     ah,     09h
        lea     dx,     msgInFirst
        int     21h
        mov     ax,     Count1
        call    OutInt
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;вывод результата
        mov     ah,     09h
        lea     dx,     msgInSecond
        int     21h
        mov     ax,     Count2
        call    OutInt
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
;обработка строки
;на входе
;ds:dx - адрес строки
;на выходе
;ax - количество символов '5' в строке
Process proc
        ;push   ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        call    ReadStr
 
        mov     si,     dx      ;адрес начала строки
        mov     bx,     0       ;количество символов '5' в строке
@@While:
        mov     al,     [si]    ;чтение очередного символа
        cmp     al,     '$'
        je      @@Break         ;если это символ - признак конца строки - выйти
        cmp     al,     '5'     ;если это символ '5',
        jne     @@Next
        inc     bx              ;то увеличить счётчик
@@Next:
        add     si,     1       ;перейти к следующему элементу строки
        jmp     @@While
@@Break:
        mov     ax,     bx      ;запись результата в регистр ax
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ;pop    ax
        ret
Process endp
 
;чтение строки с клавиатуры
;на входе
;ds:dx - адрес строки
ReadStr proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        ;сохранение адреса введённой строки
        mov     di,     dx
        ;чтение в буфер из клавиатуры
        mov     ah,     0Ah
        lea     dx,     kbdBuffer
        int     21h
        ;копирование из буфера в переменную строки
        mov     cx,     0
        mov     cl,     [kbdBuffer+1]
        jcxz    @@SkipCopy
        push    es
        pushf
        push    ds
        pop     es
        lea     si,     kbdBuffer+2
        mov     di,     di
        cld
        rep     movsb
        popf
        pop     es
        ;добавление признака конца строки
        mov     byte ptr [di],  '$'
@@SkipCopy:
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ReadStr endp
 
OutInt  proc
        push    ax
        push    dx
        aam
        add     ax,     '00'
        mov     dl,     ah
        mov     dh,     al
        mov     ah,     02
        int     21h
        mov     dl,dh
        int     21h
        pop     dx
        pop     ax
        ret
OutInt  endp
 
end     main

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

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