Поиск букв в строке - Assembler
Формулировка задачи:
Доброго времени суток. Нужно ввести английское предложение. Найти каких букв в веденной строке меньше всего и сколько их. Ответ вывести синим цветом в центре экрана. Помогите пожалуйста советом или делом. Написал программку, но работает она не корректно, выбирает либо первый либо второй элемент минимальным, хотя после стоит элемент, который не встречается ни разу. Сначала делал без удаления повторяющихся символов, потом добавил удаление, чтобы символ вновь не считывался.
masm model small .stack 100h .data s1 db "Введите предложение","$" s2 db "Кол-во букв:","$" s3 db "Реже встречаются буквы","$" string db 100,100 dup (" ") min dw (?) f db 00h k db (?) c dw (?) .code assume ds:@data, es:@data include pr.asm ira: mov ax, @data mov ds, ax mov es, ax lea dx, s1 mov ah, 09h int 21h lea dx, string mov ah, 0ah int 21h mov ah, 02h mov dl, 0dh int 21h mov ah, 02h mov dl, 0ah int 21h lea di, string+2 mov cx, -1 mov al, 0dh repne scasb not cx dec cx mov c, cx cld lea di, string mov cx, c mov dx, 0h mov bx, 0h mov bp, 0h mov ax, 0h lea di, string+2 mov al, [di] mov dl, 0Fh m1: repne scas string jcxz m2 add bl, 01h jmp m1 m2: cmp bl, dl jl m3 jmp m4 m3: cmp ax, min je m4 mov min, ax mov k, bl m4: cld mov cx, [c] lea di, [string] repne scasb je del mov min, ax mov k, 0h jmp m5 del: mov si, di dec di rep movsb dec [c] mov cx,[c] m5: cmp bp, c je m6 sub di, c inc di mov al, [di] inc bp ;l+1 mov bl, 0h mov cx, c jmp m1 m6: mov bx, 0h mov bx, min lea dx, s2 mov ah, 09h int 21h vivod bh vivod bl mov ah, 02h mov dl, 0dh int 21h mov ah, 02h mov dl, 0ah int 21h mov bl, 0h mov bl, k lea dx, s3 mov ah, 09h int 21h ;vivod bh vivod bl mov ah, 02h mov dl, 0dh int 21h mov ah, 02h mov dl, 0ah int 21h exit: mov ah, 01h int 21h mov ax, 4c00h int 21h end ira
vivod macro reg mov al,reg push ax shr al,4 cmp al,10 sbb al,69h das mov dl,al mov ah,02 int 21h pop ax and al,0Fh cmp al,10 sbb al,69h das mov dl,al mov ah,02 int 21h endm
Суть алгоритма понимаю, а написать не могу(
Решение задачи: «Поиск букв в строке»
textual
Листинг программы
masm model small .stack 100h .data s1 db "Введите предложение: ","$" s2 db "Кол-во букв: ","$" s3 db "Реже встречаются буквы ","$" string db 100,100 dup (" ") min dw (?) Freq dw 128 dup(?) .code assume ds:@data, es:@data include pr.asm ira: mov ax, @data mov ds, ax mov es, ax lea dx, s1 mov ah, 09h int 21h lea dx, string mov ah, 0ah int 21h mov ah, 02h mov dl, 0dh int 21h mov ah, 02h mov dl, 0ah int 21h ;обнуление массива частот mov ax, 0 mov cx, 128 lea di, Freq cld rep stosw ;заполнение массива частот mov cx, 0 mov cl, string+1 lea si, string+2 mov ax, 0 lea bx, Freq @@FreqCount: mov al, [si] mov di, ax shl di, 1 inc word ptr [bx+di] inc si loop @@FreqCount ;поиск минимально встречающихся mov cx, 128 lea si, Freq mov ax, 0 mov al, string+1 mov bx, ax ;bx - минимальное значение cld @@FindMin: lodsw cmp ax, 0 je @@NextFM cmp ax, bx jae @@NextFM mov bx, ax @@NextFM: loop @@FindMin mov Min, bx ;вывод на экран символов mov ah, 09h lea dx, s3 int 21h mov cx, 128 lea si, Freq mov dx, 0 ;код очередного символа @@ShowChars: lodsw cmp ax, bx jne @@NextSC mov ah, 02h int 21h @@NextSC: inc dx loop @@ShowChars mov ah, 02h mov dl, 0dh int 21h mov ah, 02h mov dl, 0ah int 21h exit: mov ah, 01h int 21h mov ax, 4c00h int 21h end ira
Объяснение кода листинга программы
- Кол-во букв: введено для получения количества символов в строке, введенной пользователем. Переменная типа word, в которую будет сохранено это количество.
- Реже встречаются буквы - введено для вывода на экран информации о том, какие буквы встречаются реже всего.
- string - массив символов, в который будет скопирована строка, введенная пользователем. Массив символов, длиной в 100 элементов, каждый из которых является байтом.
- min - переменная типа word, в которую будет сохранено минимальное значение частоты встречаемости буквы.
- Freq - массив частот встречаемости букв. Каждая ячейка этого массива - это слово, содержащее количество вхождений данной буквы в строку.
- bx - используется как временная переменная для хранения текущего значения частоты встречаемости буквы в процессе поиска минимального значения.
- cx - используется как счетчик для цикла по всем символам строки в процессе поиска минимального значения частоты встречаемости буквы.
- si - используется как индекс для обращения к элементам массива частот встречаемости букв в процессе поиска минимального значения.
- ax - используется как временная переменная для хранения текущего значения частоты встречаемости буквы в процессе поиска минимального значения.
- dx - используется как индекс для обращения к элементам массива частот встречаемости букв в процессе вывода на экран символов.
- al - используется как временная переменная для хранения текущего значения символа в процессе вывода на экран символов.
- ah - используется как временная переменная для хранения кода символа в процессе вывода на экран символов.
- NextSC - метка, используется в процессе вывода на экран символов для перехода к следующему символу.
- NextFM - метка, используется в процессе поиска минимального значения частоты встречаемости буквы для перехода к следующей букве.
- ShowChars - метка, используется в процессе вывода на экран символов для перехода к выводу следующего символа.
- Int 21h - используется для ввода/вывода данных в процессе работы программы.
- Exit - метка, используется для завершения работы программы.
- 4c00h - код, который будет возвращен в качестве результата работы программы.
- word - тип данных, используемый для переменных, в которые будут сохраняться значения частоты встречаемости букв.
- byte - тип данных, используемый для переменных, в которые будут сохраняться значения символов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д