Посчитать количество повторений каждого символа в строке, введенной с клавиатуры - Assembler

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

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

Посчитать количество повторений каждого символа в строке, введенной с клавиатуры

Решение задачи: «Посчитать количество повторений каждого символа в строке, введенной с клавиатуры»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf            db      0Dh, 0Ah, '$'
  9.         msgInString     db      'Input string: ', 0Dh, 0Ah, '$'
  10.         msgThisChar     db      'Символ "', '$'
  11.         msgCountChar    db      '" встретился ', '$'
  12.         kbdBuf          db      50, 0, 51 dup(0)      ;max,len,string,CR(0dh)
  13.         Freq            dw      256 dup(0)
  14.  
  15.         A               dw      ?
  16.         B               dw      ?
  17.         C               dw      ?
  18.  
  19. .code
  20.  
  21. main    proc
  22.         mov     ax,     @data
  23.         mov     ds,     ax
  24.  
  25.         ;ввод строки
  26.         mov     ah,     09h
  27.         lea     dx,     msgInString
  28.         int     21h
  29.         mov     ah,     0Ah             ; ввод числа с клавиатуры (строки)
  30.         lea     dx,     kbdBuf
  31.         int     21h
  32.         mov     ah,     09h             ; перевод строки (на новую строку)
  33.         lea     dx,     CrLf
  34.         int     21h
  35.  
  36.         ;обработка строки
  37.         lea     si,     kbdBuf+2
  38.         mov     cx,     0
  39.         mov     cl,     kbdBuf+1
  40.         lea     di,     Freq
  41.         cld
  42. @@ForCount:
  43.         lodsb
  44.         mov     bl,     al
  45.         mov     bh,     0
  46.         shl     bx,     1
  47.         inc     word ptr [bx+di]
  48.         loop    @@ForCount
  49.  
  50.         ;вывод результатов
  51.         mov     cx,     256
  52.         lea     di,     Freq
  53.         mov     bx,     0
  54. @@ForResult:
  55.         cmp     word ptr[di+bx],        0
  56.         jz      @@Next
  57.         mov     ah,     09h
  58.         lea     dx,     msgThisChar
  59.         int     21h
  60.         mov     ah,     02h
  61.         mov     dl,     bl
  62.         shr     dl,     1
  63.         int     21h
  64.         mov     ah,     09h
  65.         lea     dx,     msgCountChar
  66.         int     21h
  67.         mov     ax,     [di+bx]
  68.         call    Show_AX
  69.         mov     ah,     09h
  70.         lea     dx,     CrLf
  71.         int     21h
  72. @@Next:
  73.         add     bx,     2
  74.         loop    @@ForResult
  75.  
  76.         mov     ax,     4C00h
  77.         int     21h
  78. main    endp
  79.  
  80. ; выводит число из регистра AX на экран
  81. ; входные данные:
  82. ; ax - число для отображения
  83. Show_AX proc
  84.         push    ax
  85.         push    bx
  86.         push    cx
  87.         push    dx
  88.         push    di
  89.  
  90.         mov     cx, 10
  91.         xor     di, di          ; di - кол. цифр в числе
  92.  
  93.         ; если число в ax отрицательное, то
  94.         ;1) напечатать '-'
  95.         ;2) сделать ax положительным
  96.         or      ax, ax
  97.         jns     @@Conv
  98.         push    ax
  99.         mov     dx, '-'
  100.         mov     ah, 2           ; ah - функция вывода символа на экран
  101.         int     21h
  102.         pop     ax
  103.  
  104.         neg     ax
  105.  
  106. @@Conv:
  107.         xor     dx, dx
  108.         div     cx              ; dl = num mod 10
  109.         add     dl, '0'         ; перевод в символьный формат
  110.         inc     di
  111.         push    dx              ; складываем в стэк
  112.         or      ax, ax
  113.         jnz     @@Conv
  114.         ; выводим из стэка на экран
  115. @@Show:
  116.         pop     dx              ; dl = очередной символ
  117.         mov     ah, 2           ; ah - функция вывода символа на экран
  118.         int     21h
  119.         dec     di              ; повторяем пока di<>0
  120.         jnz     @@Show
  121.  
  122.         pop     di
  123.         pop     dx
  124.         pop     cx
  125.         pop     bx
  126.         pop     ax
  127.         ret
  128. Show_AX endp
  129.  
  130. end     main

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

  1. Создание переменных и сообщений:
    • CrLf - последовательность перехода на новую строку
    • msgInString - сообщение Input string: с последовательностью перехода на новую строку
    • msgThisChar - сообщение Символ
    • msgCountChar - сообщение встретился
    • kbdBuf - буфер для ввода строки с клавиатуры
    • Freq - массив для подсчета частоты появления символов
    • A, B, C - переменные для временного хранения данных
  2. Инициализация программы:
    • Загрузка сегмента данных в регистр ax и установка ds
    • Ввод строки с клавиатуры с помощью прерывания 21h
    • Обработка введенной строки для подсчета частоты повторения символов
    • Вывод результата подсчета на экран
  3. Процедура вывода числа на экран:
    • Преобразование числа из регистра ax в символьный формат
    • Вывод очередной символ на экран с помощью прерывания 21h
  4. Завершение программы:
    • Вызов прерывания 21h для завершения программы Данный код предположительно реализует ввод строки с клавиатуры, подсчет количества повторений каждого символа в строке и вывод результатов на экран.

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


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

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

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

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

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

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