Консультация # 189436: Уважаемые эксперты! Пожалуйста, помогите составить программу на на assembler'e: Требуется: "Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, которые встречаются в ...
Уважаемые эксперты! Пожалуйста, помогите составить программу на на assembler'e:
Требуется: "Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, которые встречаются в строке не менее N раз."
Использование в emu8086 - assembler and microprocessor emulator 0.03 Желательно, делать
комментарии к строкам.
;Разработать подпрограмму, которая подсчитывает,
;сколько раз заданный символ встречается в строке.
;Разработать программу, которая вводит с клавиатуры
;строку и число N и выдаёт список символов,
;которые встречаются в строке не менее N раз
data segment
sEnterString db 0ah,"Enter string: $"
sEnterSymbol db 0ah,"Enter symbol: $"
sEnterNumber db 0ah,"Enter number: $"
sResult db 0ah,"Result: $"
;для ввода строки
max db 128 ;максимальный размер
len db 0 ;реальная длина строки
string db 128 dup(0) ;сама строка, в конце 0dh
N db 0 ;вводимое число
data ends
_stack segment stack 'stack'
dw 128 dup(?) ;стек
_stack ends
assume cs:code, ds:data, ss:_stack
code segment
start:
mov ax, data
mov ds, ax ;настроим сегмент данных
call GetNumber ;вводим число < 256
mov N, al ;сохраним
call GetString ;вводим строку
call PrintCounts ;считаем символы и выводим
mov al, 0dh ;перевод строки
int 29h
mov al, 0ah
int 29h
mov ah, 0 ;ждем нажатие на клавишу
int 16h
mov ax, 4c00h ;выход
int 21h
GetNumber: ;вводим число < 256
lea dx, sEnterNumber
mov ah, 9
int 21h ;приглашение
lea dx, max
mov ah, 0ah
int 21h ;вводим строку
mov bx, 10 ;bl = 10 - основание с.с.,
;bh = 0 - наше число
lea si, string ;введенная числовая строка
GetNumber_loop:
lodsb ;очередной символ
cmp al, 0dh ;в конце 0dh
je GetNumber_ret
sub al, '0' ;превратим символ в число
cmp al, 9
ja GetNumber ;если не цифр, то на повтор ввода!
xchg al, bh ;al = старшие разряды, bh = новый разряд
mul bl ;ax = al * 10
cmp ah, 0 ;больше 255?
jne GetNumber ;на повтор ввода
add bh, al ;bh - новое значение числа
jc GetNumber ;> 255 - на повтор ввода
jmp GetNumber_loop ;продолжаем
GetNumber_ret:
mov al, bh ;вернем число в al
ret
GetString: ;ввод строки
lea dx, sEnterString
mov ah, 9
int 21h
lea dx, max
mov ah, 0ah
int 21h
ret
SearchSymbol: ;поиск вхождения в строке string символа al
lea di, string ;адрес строки
mov ah, 0 ;счетчик
SearchSymbol_loop:
cmp byte ptr [di], 0dh ;конец строки?
je SearchSymbol_ret
cmp al, [di] ;сравниваем
jne SearchSymbol_next
inc ah ;считаем одинаковые
mov byte ptr [di], 0 ;обнулим встреченные!
;чтобы не искать еще раз!
SearchSymbol_next:
inc di ;на следующий адрес
jmp SearchSymbol_loop
SearchSymbol_ret:
ret
PrintCounts: ;поиск и вывод найденных символов
lea dx, sResult ;выведем сообщение
mov ah, 9
int 21h
lea si, string ;адрес строки
PrintCounts_loop:
lodsb ;очередной символ
cmp al, 0dh ;конец строки?
je PrintCounts_ret
cmp al, 0 ;0 пропускаем
je PrintCounts_loop
call SearchSymbol ;считаем
cmp ah, N ;сравним с числом N
jb PrintCounts_loop
int 29h ;выведем, если >= N
jmp PrintCounts_loop
PrintCounts_ret:
ret
code ends
end start
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 28.05.2016, 16:29
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!