Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов больше - Assembler
Формулировка задачи:
Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов ‘c’ или ‘d’ больше. Строку описать в сегменте данных или ввести с клавиатуры.
Листинг на асе:
все хорошо на поиск тут только одного символа, как сделать на два и сравнить их ( больше 1 сим или 2 символа?)
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Решение задачи: «Подсчитать количество символов ‘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 ; выход по-любой клавише