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