Посчитать количество повторений каждого символа в строке, введенной с клавиатуры - Assembler
Формулировка задачи:
Посчитать количество повторений каждого символа в строке, введенной с клавиатуры
Решение задачи: «Посчитать количество повторений каждого символа в строке, введенной с клавиатуры»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- CrLf db 0Dh, 0Ah, '$'
- msgInString db 'Input string: ', 0Dh, 0Ah, '$'
- msgThisChar db 'Символ "', '$'
- msgCountChar db '" встретился ', '$'
- kbdBuf db 50, 0, 51 dup(0) ;max,len,string,CR(0dh)
- Freq dw 256 dup(0)
- A dw ?
- B dw ?
- C dw ?
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;ввод строки
- mov ah, 09h
- lea dx, msgInString
- int 21h
- mov ah, 0Ah ; ввод числа с клавиатуры (строки)
- lea dx, kbdBuf
- int 21h
- mov ah, 09h ; перевод строки (на новую строку)
- lea dx, CrLf
- int 21h
- ;обработка строки
- lea si, kbdBuf+2
- mov cx, 0
- mov cl, kbdBuf+1
- lea di, Freq
- cld
- @@ForCount:
- lodsb
- mov bl, al
- mov bh, 0
- shl bx, 1
- inc word ptr [bx+di]
- loop @@ForCount
- ;вывод результатов
- mov cx, 256
- lea di, Freq
- mov bx, 0
- @@ForResult:
- cmp word ptr[di+bx], 0
- jz @@Next
- mov ah, 09h
- lea dx, msgThisChar
- int 21h
- mov ah, 02h
- mov dl, bl
- shr dl, 1
- int 21h
- mov ah, 09h
- lea dx, msgCountChar
- int 21h
- mov ax, [di+bx]
- call Show_AX
- mov ah, 09h
- lea dx, CrLf
- int 21h
- @@Next:
- add bx, 2
- loop @@ForResult
- mov ax, 4C00h
- int 21h
- main endp
- ; выводит число из регистра AX на экран
- ; входные данные:
- ; ax - число для отображения
- Show_AX proc
- push ax
- push bx
- push cx
- push dx
- push di
- mov cx, 10
- xor di, di ; di - кол. цифр в числе
- ; если число в ax отрицательное, то
- ;1) напечатать '-'
- ;2) сделать ax положительным
- or ax, ax
- jns @@Conv
- push ax
- mov dx, '-'
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- pop ax
- neg ax
- @@Conv:
- xor dx, dx
- div cx ; dl = num mod 10
- add dl, '0' ; перевод в символьный формат
- inc di
- push dx ; складываем в стэк
- or ax, ax
- jnz @@Conv
- ; выводим из стэка на экран
- @@Show:
- pop dx ; dl = очередной символ
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- dec di ; повторяем пока di<>0
- jnz @@Show
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- Show_AX endp
- end main
Объяснение кода листинга программы
- Создание переменных и сообщений:
CrLf
- последовательность перехода на новую строкуmsgInString
- сообщениеInput string:
с последовательностью перехода на новую строкуmsgThisChar
- сообщениеСимвол
msgCountChar
- сообщениевстретился
kbdBuf
- буфер для ввода строки с клавиатурыFreq
- массив для подсчета частоты появления символовA
,B
,C
- переменные для временного хранения данных
- Инициализация программы:
- Загрузка сегмента данных в регистр ax и установка ds
- Ввод строки с клавиатуры с помощью прерывания 21h
- Обработка введенной строки для подсчета частоты повторения символов
- Вывод результата подсчета на экран
- Процедура вывода числа на экран:
- Преобразование числа из регистра ax в символьный формат
- Вывод очередной символ на экран с помощью прерывания 21h
- Завершение программы:
- Вызов прерывания 21h для завершения программы Данный код предположительно реализует ввод строки с клавиатуры, подсчет количества повторений каждого символа в строке и вывод результатов на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д