Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 513
∙ повысить рейтинг »
Куликов Роман Евгеньевич
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »
Козлова Ольга Александровна
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1614
Дата выхода:28.05.2016, 20:51
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:23 / 8
Вопросов / ответов:1 / 1

Консультация # 189436: Уважаемые эксперты! Пожалуйста, помогите составить программу на на assembler'e: Требуется: "Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, которые встречаются в ...

Консультация # 189436:

Уважаемые эксперты! Пожалуйста, помогите составить программу на на assembler'e:

Требуется: "Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, которые встречаются в строке не менее N раз."

Использование в emu8086 - assembler and microprocessor emulator 0.03
Желательно, делать комментарии к строкам.

Дата отправки: 18.05.2016, 20:34
Вопрос задал: haustow_2012 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, haustow_2012!
Вот Вам программа

Код (Assembler) :: выделить код
;Разработать подпрограмму, которая подсчитывает, 
;сколько раз заданный символ встречается в строке. 
;Разработать программу, которая вводит с клавиатуры 
;строку и число 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
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное