Поиск букв в строке - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Нужно ввести английское предложение. Найти каких букв в веденной строке меньше всего и сколько их. Ответ вывести синим цветом в центре экрана. Помогите пожалуйста советом или делом. Написал программку, но работает она не корректно, выбирает либо первый либо второй элемент минимальным, хотя после стоит элемент, который не встречается ни разу. Сначала делал без удаления повторяющихся символов, потом добавил удаление, чтобы символ вновь не считывался.
Листинг программы
  1. masm
  2. model small
  3. .stack 100h
  4. .data
  5. s1 db "Введите предложение","$"
  6. s2 db "Кол-во букв:","$"
  7. s3 db "Реже встречаются буквы","$"
  8. string db 100,100 dup (" ")
  9. min dw (?)
  10. f db 00h
  11. k db (?)
  12. c dw (?)
  13. .code
  14. assume ds:@data, es:@data
  15. include pr.asm
  16. ira:
  17. mov ax, @data
  18. mov ds, ax
  19. mov es, ax
  20. lea dx, s1
  21. mov ah, 09h
  22. int 21h
  23. lea dx, string
  24. mov ah, 0ah
  25. int 21h
  26. mov ah, 02h
  27. mov dl, 0dh
  28. int 21h
  29. mov ah, 02h
  30. mov dl, 0ah
  31. int 21h
  32.  
  33. lea di, string+2
  34. mov cx, -1
  35. mov al, 0dh
  36. repne scasb
  37. not cx
  38. dec cx
  39. mov c, cx
  40. cld
  41. lea di, string
  42. mov cx, c
  43. mov dx, 0h
  44. mov bx, 0h
  45. mov bp, 0h
  46. mov ax, 0h
  47. lea di, string+2
  48. mov al, [di]
  49. mov dl, 0Fh
  50. m1:
  51. repne scas string
  52. jcxz m2
  53. add bl, 01h
  54. jmp m1
  55. m2:
  56. cmp bl, dl
  57. jl m3
  58. jmp m4
  59. m3:
  60. cmp ax, min
  61. je m4
  62. mov min, ax
  63. mov k, bl
  64. m4:
  65. cld
  66. mov cx, [c]
  67. lea di, [string]
  68. repne scasb
  69. je del
  70. mov min, ax
  71. mov k, 0h
  72. jmp m5
  73. del:
  74. mov si, di
  75. dec di
  76. rep movsb
  77. dec [c]
  78. mov cx,[c]
  79. m5:
  80. cmp bp, c
  81. je m6
  82. sub di, c
  83. inc di
  84. mov al, [di]
  85. inc bp ;l+1
  86. mov bl, 0h
  87. mov cx, c
  88. jmp m1
  89. m6:
  90. mov bx, 0h
  91. mov bx, min
  92.  
  93. lea dx, s2
  94. mov ah, 09h
  95. int 21h
  96. vivod bh
  97. vivod bl
  98. mov ah, 02h
  99. mov dl, 0dh
  100. int 21h
  101. mov ah, 02h
  102. mov dl, 0ah
  103. int 21h
  104. mov bl, 0h
  105. mov bl, k
  106. lea dx, s3
  107. mov ah, 09h
  108. int 21h
  109. ;vivod bh
  110. vivod bl
  111. mov ah, 02h
  112. mov dl, 0dh
  113. int 21h
  114. mov ah, 02h
  115. mov dl, 0ah
  116. int 21h
  117.  
  118. exit:
  119. mov ah, 01h
  120. int 21h
  121. mov ax, 4c00h
  122. int 21h
  123. end ira
Листинг программы
  1. vivod macro reg
  2. mov al,reg
  3. push ax
  4. shr al,4
  5. cmp al,10
  6. sbb al,69h
  7. das
  8.  
  9. mov dl,al
  10. mov ah,02
  11. int 21h
  12. pop ax
  13. and al,0Fh
  14. cmp al,10
  15. sbb al,69h
  16. das
  17. mov dl,al
  18. mov ah,02
  19. int 21h
  20. endm
Суть алгоритма понимаю, а написать не могу(

Решение задачи: «Поиск букв в строке»

textual
Листинг программы
  1. masm
  2. model small
  3. .stack 100h
  4. .data
  5.         s1      db      "Введите предложение: ","$"
  6.         s2      db      "Кол-во букв: ","$"
  7.         s3      db      "Реже встречаются буквы ","$"
  8.         string  db      100,100 dup (" ")
  9.         min     dw      (?)
  10.         Freq    dw      128 dup(?)
  11.  
  12. .code
  13. assume ds:@data, es:@data
  14. include pr.asm
  15. ira:
  16.  
  17.         mov ax, @data
  18.         mov ds, ax
  19.         mov es, ax
  20.  
  21.         lea dx, s1
  22.         mov ah, 09h
  23.         int 21h
  24.  
  25.         lea dx, string
  26.         mov ah, 0ah
  27.         int 21h
  28.  
  29.         mov ah, 02h
  30.         mov dl, 0dh
  31.         int 21h
  32.         mov ah, 02h
  33.         mov dl, 0ah
  34.         int 21h
  35.  
  36.         ;обнуление массива частот
  37.         mov     ax,     0
  38.         mov     cx,     128
  39.         lea     di,     Freq
  40.         cld
  41.         rep     stosw
  42.  
  43.         ;заполнение массива частот
  44.         mov     cx,     0
  45.         mov     cl,     string+1
  46.         lea     si,     string+2
  47.         mov     ax,     0
  48.         lea     bx,     Freq
  49. @@FreqCount:
  50.         mov     al,     [si]
  51.         mov     di,     ax
  52.         shl     di,     1
  53.         inc     word ptr [bx+di]
  54.  
  55.         inc     si
  56.         loop    @@FreqCount
  57.  
  58.         ;поиск минимально встречающихся
  59.         mov     cx,     128
  60.         lea     si,     Freq
  61.         mov     ax,     0
  62.         mov     al,     string+1
  63.         mov     bx,     ax      ;bx - минимальное значение
  64.         cld
  65. @@FindMin:
  66.         lodsw
  67.         cmp     ax,     0
  68.         je      @@NextFM
  69.         cmp     ax,     bx
  70.         jae     @@NextFM
  71.         mov     bx,     ax
  72. @@NextFM:
  73.         loop    @@FindMin
  74.  
  75.         mov     Min,    bx
  76.  
  77.         ;вывод на экран символов
  78.         mov     ah,     09h
  79.         lea     dx,     s3
  80.         int     21h
  81.  
  82.         mov     cx,     128
  83.         lea     si,     Freq
  84.         mov     dx,     0       ;код очередного символа
  85. @@ShowChars:
  86.         lodsw
  87.         cmp     ax,     bx
  88.         jne     @@NextSC
  89.         mov     ah,     02h
  90.         int     21h
  91. @@NextSC:
  92.         inc     dx
  93.         loop    @@ShowChars
  94.  
  95.         mov ah, 02h
  96.         mov dl, 0dh
  97.         int 21h
  98.         mov ah, 02h
  99.         mov dl, 0ah
  100.         int 21h
  101.  
  102. exit:
  103.         mov ah, 01h
  104.         int 21h
  105.         mov ax, 4c00h
  106.         int 21h
  107. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы