Поиск букв в строке - 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

Объяснение кода листинга программы

  1. Кол-во букв: введено для получения количества символов в строке, введенной пользователем. Переменная типа word, в которую будет сохранено это количество.
  2. Реже встречаются буквы - введено для вывода на экран информации о том, какие буквы встречаются реже всего.
  3. string - массив символов, в который будет скопирована строка, введенная пользователем. Массив символов, длиной в 100 элементов, каждый из которых является байтом.
  4. min - переменная типа word, в которую будет сохранено минимальное значение частоты встречаемости буквы.
  5. Freq - массив частот встречаемости букв. Каждая ячейка этого массива - это слово, содержащее количество вхождений данной буквы в строку.
  6. bx - используется как временная переменная для хранения текущего значения частоты встречаемости буквы в процессе поиска минимального значения.
  7. cx - используется как счетчик для цикла по всем символам строки в процессе поиска минимального значения частоты встречаемости буквы.
  8. si - используется как индекс для обращения к элементам массива частот встречаемости букв в процессе поиска минимального значения.
  9. ax - используется как временная переменная для хранения текущего значения частоты встречаемости буквы в процессе поиска минимального значения.
  10. dx - используется как индекс для обращения к элементам массива частот встречаемости букв в процессе вывода на экран символов.
  11. al - используется как временная переменная для хранения текущего значения символа в процессе вывода на экран символов.
  12. ah - используется как временная переменная для хранения кода символа в процессе вывода на экран символов.
  13. NextSC - метка, используется в процессе вывода на экран символов для перехода к следующему символу.
  14. NextFM - метка, используется в процессе поиска минимального значения частоты встречаемости буквы для перехода к следующей букве.
  15. ShowChars - метка, используется в процессе вывода на экран символов для перехода к выводу следующего символа.
  16. Int 21h - используется для ввода/вывода данных в процессе работы программы.
  17. Exit - метка, используется для завершения работы программы.
  18. 4c00h - код, который будет возвращен в качестве результата работы программы.
  19. word - тип данных, используемый для переменных, в которые будут сохраняться значения частоты встречаемости букв.
  20. byte - тип данных, используемый для переменных, в которые будут сохраняться значения символов.

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы