Найти в строке количество символов - Assembler

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

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

Дана строка. Найти в ней количество символов. Я задала строку Hellco worldcc. Ищу количество символов "с". Что не так?
Листинг программы
  1. .model small
  2. .stack 200h
  3. .data
  4. str1 db 'Hellco worldcc$'
  5. len db ? ;длина
  6. next_str db 13d, 10d, '$'
  7. Print_STRING MACRO message
  8. mov ah,9
  9. lea dx, message
  10. int 21h
  11. endm
  12. .code
  13. .startup
  14. start:
  15. Print_STRING str1
  16. Print_STRING next_str
  17. xor bx,bx ;очистить счетчик
  18. xor cx,cx
  19. mov cl,[len] ;длина строки
  20. lea si,str1 ;на строку
  21. mov al,'c' ;символ, который надо подсчитать
  22. m1:
  23. repne scasb ;искать символ в строке
  24. jnz exit ;символ не найден, выход
  25. m2: ;найден
  26. inc bl ;увеличить счетчик на 1
  27. test cx,cx ;если СХ не 0, в строке есть символы,
  28. jnz m1 ; продолжить поиск
  29. exit:
  30. ;----------Вывод на экран---------
  31. mov ax,bx
  32. ;вывод на экран
  33. xor cx, cx
  34. mov bx, 10 ; основание сс. 10 для десятеричной и т.п.
  35. oi2:
  36. xor dx,dx
  37. div bx
  38. ; Делим число на основание сс. В остатке получается последняя цифра.
  39. ; Сразу выводить её нельзя, поэтому сохраним её в стэке.
  40. push dx
  41. inc cx
  42. ; А с частным повторяем то же самое, отделяя от него очередную
  43. ; цифру справа, пока не останется ноль, что значит, что дальше
  44. ; слева только нули.
  45. test ax, ax
  46. jnz oi2
  47. ; Теперь приступим к выводу.
  48. mov ah, 02h
  49. oi3:
  50. pop dx
  51. ; Извлекаем очередную цифру, переводим её в символ и выводим.
  52. add dl, '0'
  53. int 21h
  54. ; Повторим ровно столько раз, сколько цифр насчитали.
  55. loop oi3
  56. ;-----------------------------------------
  57. .exit(0)
  58.  
  59. end

Решение задачи: «Найти в строке количество символов»

textual
Листинг программы
  1.     xor bx,bx   ;очистить счетчик
  2.     xor cx,cx
  3.     mov cl,[len]    ;длина строки
  4.     lea di,str1  ;на строку указывает es:di
  5.     mov ax,ds
  6.     mov es,ax
  7.     cld     ;выбрать направление перебора - вперёд
  8.     mov al,'c'  ;символ, который надо подсчитать
  9.  
  10. m1:
  11.     repne scasb ;искать символ в строке
  12.     jnz  exit  ;символ не найден, выход
  13. m2:         ;найден
  14.     inc bl      ;увеличить счетчик на 1
  15.     test cx,cx  ;если СХ не 0, в строке есть символы,
  16.     jnz  m1    ; продолжить поиск
  17.  
  18. exit:

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

  1. xor bx,bx - очистить счетчик.
  2. xor cx,cx - используется в качестве регистра-счетчика.
  3. mov cl,[len] - длина строки записывается в регистр cx.
  4. lea di,str1 - указатель на строку.
  5. mov ax,ds - регистр ax содержит сегмент данных.
  6. mov es,ax - регистр es содержит сегмент строки.
  7. cld - указывает направление перебора - вперёд.
  8. mov al,'c' - символ, который необходимо подсчитать.
  9. repne scasb - поиск символа в строке.
  10. jnz exit - если символ не найден, выход.
  11. m2: - найден символ.
  12. inc bl - увеличение счетчика на 1.
  13. test cx,cx - проверка, не равен ли 0 счетчик cx.
  14. jnz m1 - продолжить поиск.
  15. exit: - конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

5   голосов , оценка 4.6 из 5

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

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

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