Посчитать количество повторений каждого символа в строке, введенной с клавиатуры - 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 для завершения программы Данный код предположительно реализует ввод строки с клавиатуры, подсчет количества повторений каждого символа в строке и вывод результатов на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д