Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов больше - Assembler

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

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

Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов ‘c’ или ‘d’ больше. Строку описать в сегменте данных или ввести с клавиатуры. Листинг на асе:
model small
.stack 100h
.data
mes1 db "Vvedite stroky: $"
mes3 db 0ah,0dh,"Kol-vo povtoreniy vvedennogo simvola: $"
mes4 db 0ah,0dh,"Vvedite proizvonuy simvol dlya sravneniya: $"
mes5 db 0ah,0dh,"Simvol nekorrekten: $"
string db 10 dup ("$")
    len_string = $ - string
    adr_string dd string
.code
main:
    mov ax,@data
    mov ds,ax
    xor ax,ax
    mov ah,09h ;заносим в ah 09h
    lea dx,mes1 ;в dx смещение строки mes1
    int 21h ;вызов прерывания DOS для вывода строки
    mov cx,len_string ;в cx заносим длину строки
    dec cx ;уменьшить на* 1 счётчик cx
    les di,adr_string ;в di смещение, в es сегментный адресс
m1:
    mov ah,01h ;в ah заносим 01h
    int 21h ;в AL - символ, полученный из станлартного ввода*
    cmp al,0dh ;проверяем нажатие Enter
    je prov ;если равно прыгаем на метку prov
    cmp al,0 ;сравниваем al с нулём
    jne m2 ;если не равно прыгаем на метку m2
    jmp prov ;прыгаем на метку prov
m2:
    stosb ;переписываем содержимое AL в ячейку памяти с адрессом ES: (E)DI, после чего прибовляем единицу к (E)DI.
    
    loop m1 ;выполняем m1, пока* cx не станет равным нулю
prov:
    mov cx,len_string ;в cx заносим длину строки
    dec cx ;уменьшаем cx на единицу
    mov si,0 ;переводим сегментный регистор si **в начало строки
exit:
    
    lea dx,mes4
    mov ah,09h
    int 21h
    mov ah,01h
    int 21h
    cmp al,0
    je not2
go:
    cmp string[si],al
    jne go1
    inc bh
go1:
    inc si
    loop go
lea dx,mes3
mov ah,09h
int 21h
add bh,"0"
mov dl,bh
mov ah,02h
int 21h
jmp ex
not2:
    lea dx,mes5
    mov ah,09h
    int 21h
ex:
    mov ax,4c00h
    mov ah,10h
    
mov ah,0
int 16h
все хорошо на поиск тут только одного символа, как сделать на два и сравнить их ( больше 1 сим или 2 символа?)

Решение задачи: «Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов больше»

textual
Листинг программы
org 100h
jmp start
 
mes1  db  13,10,'Vvedite stroky. . .: $'
mes2  db  13,10,'Simvolov "C". . . .: $'
mes3  db  13,10,'Simvolov "D". . . .: $'
mes4  db  13,10,'-------------------------'
      db  13,10,'Simvolov ',0,' bolshe!$'     ; по-адресу(0) вставим букву
buff  db  60 dup(0)
 
start:
   mov   ah,9                 ; мессага
   mov   dx,mes1              ;
   int   21h                  ;
 
   mov   di,buff              ; DI для STOSB
   loop  $                    ; CX = 0
   xor   ax,ax                ; AX = 0
   inc   ah                   ; AH = 1 (ввод с эхо)
@@:                           ;
   int   21h                  ; вводим символ..
   cmp   al,13                ; Enter заканчивает ввод
   je    next                 ;
   and   al,11011111b         ; переводим символ в верхний регистр
   stosb                      ; запись в буфер
   inc   cx                   ; считаем длину строки..
   jmp   @b                   ;
 
next:                         ; строка в буфере!
   inc   cx                   ; захватим последний символ
   mov   dx,cx                ; DX/CX = длина строки
   sub   bx,bx                ; ВХ = 0 (счётчик найденных)
   mov   di,buff              ; DI для SCASB
   mov   al,'D'               ; символ для поиска
@@:                           ;
   repne scasb                ; ищем символ в строке,
   or    cx,cx                ;    ..пока СХ не станет нуль
   jz    find_c               ;
   inc   bx                   ; счётчик(D) +1
   jmp   @b                   ;
 
find_c:                       ;
   push  bx                   ; сохраняем кол-во "D"
   sub   bx,bx                ; сбрасываем счётчик,
   xchg  cx,dx                ;    ..восстанавливаем длину,
   sub   di,cx                ;         ..и маркер начала строки
   dec   al                   ; символ для поиска "С"
@@:                           ;
   repne scasb                ;
   or    cx,cx                ;
   jz    compare              ;
   inc   bx                   ; счётчик(C) +1
   jmp   @b                   ;
 
compare:                      ;
   push  bx                   ; сохраняем кол-во "C"
   mov   ah,9                 ;
   mov   dx,mes2              ;
   int   21h                  ;
   pop   ax                   ;
   mov   bh,al                ; BH = количество(С)
   add   al,30h               ;
   int   29h                  ; выводим цифру на экран!
 
   mov   ah,9                 ;
   mov   dx,mes3              ;
   int   21h                  ;
   pop   ax                   ;
   mov   bl,al                ; BL = количество(D)
   add   al,30h               ;
   int   29h                  ; выводим цифру на экран!
 
   mov   ah,9                 ;
   mov   dx,mes4              ;
   cmp   bh,bl                ; поиск наибольшего
   jbe   change               ;
   mov   byte[mes4+38],'C'    ;
   jmp   print                ;
change:                       ;
   mov   byte[mes4+38],'D'    ;
print:                        ;
   int   21h                  ; выводим мессагу на экран
 
exit:
   xor   ax,ax                ;
   int   16h                  ;
   int   20h                  ; выход по-любой клавише

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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