Подсчитать количество символов ‘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 ; выход по-любой клавише
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д