Поиск букв в строке - 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 iravivod 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 - тип данных, используемый для переменных, в которые будут сохраняться значения символов.