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

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

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

Дана строка. Найти в ней количество символов. Я задала строку Hellco worldcc. Ищу количество символов "с". Что не так?
.model small
.stack 200h
.data
str1 db 'Hellco worldcc$'  
len db ?    ;длина
next_str db 13d, 10d, '$'
Print_STRING MACRO message
        mov ah,9
        lea dx, message
        int 21h
endm
 
.code
.startup
start:
   Print_STRING str1
   Print_STRING next_str
 
    xor bx,bx   ;очистить счетчик
    xor cx,cx
    mov cl,[len]    ;длина строки
    lea si,str1  ;на строку
   
    mov al,'c'  ;символ, который надо подсчитать
m1:
    repne scasb ;искать символ в строке
    jnz  exit  ;символ не найден, выход
m2:         ;найден
    inc bl      ;увеличить счетчик на 1
    test cx,cx  ;если СХ не 0, в строке есть символы,
    jnz  m1    ; продолжить поиск
 
exit:
;----------Вывод на экран---------
    mov ax,bx
;вывод на экран
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
    xor     dx,dx
    div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
    push    dx
    inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
    test    ax, ax
    jnz     oi2
; Теперь приступим к выводу.
    mov     ah, 02h
oi3:
    pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
    add     dl, '0'
    int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
    loop    oi3
;-----------------------------------------
    
 .exit(0)

    end

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

textual
Листинг программы
    xor bx,bx   ;очистить счетчик
    xor cx,cx
    mov cl,[len]    ;длина строки
    lea di,str1  ;на строку указывает es:di
    mov ax,ds
    mov es,ax
    cld     ;выбрать направление перебора - вперёд
    mov al,'c'  ;символ, который надо подсчитать
 
m1:
    repne scasb ;искать символ в строке
    jnz  exit  ;символ не найден, выход
m2:         ;найден
    inc bl      ;увеличить счетчик на 1
    test cx,cx  ;если СХ не 0, в строке есть символы,
    jnz  m1    ; продолжить поиск
 
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
Похожие ответы