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

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


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

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

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 391
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 5-й класс
Рейтинг: 27
∙ повысить рейтинг »
quirck
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1671
Дата выхода:03.12.2017, 15:45
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:49 / 18
Вопросов / ответов:1 / 2

Консультация # 191922: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В исходную строку вставить после заданного символа все символы предшествующие ему. Оставшуюся часть оставить без изменения. Платформа ДОС. На TASM, модель памяти SMALL. Заранее спасибо)...

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

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В исходную строку вставить после заданного символа все символы предшествующие ему. Оставшуюся часть оставить без изменения. Платформа ДОС. На TASM, модель памяти SMALL. Заранее спасибо)

Дата отправки: 28.11.2017, 15:24
Вопрос задал: varinkovaalina (Посетитель)
Всего ответов: 2
Страница онлайн-консультации »


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

Здравствуйте, varinkovaalina!
Держите код. smile
Будут вопросы - обращайтесь в мини-форум smile

Код (Assembler) :: выделить код
;В исходную строку
вставить после заданного символа все символы предшествующие ему. 
;Оставшуюся часть оставить без изменения

model small 
stack 100h 

	.data 
MaxLen 	equ 	79 
Prompt1 	db 	'stroka: ',13,10,36 
Prompt2 	db 	13,10,'char: ',36 
Result 		db	13,10,'result: $' 
sNotFound	db	13,10,'Symbol not found$' 
Buffer 		db 	MaxLen + 1 
LenStr 		db 	? 
String 		db 	MaxLen + 1 dup (?) 

	.code 
main proc 
	mov 	AX,@data 	;настройка сегментных 
	mov 	DS,AX 		;регистров на 
	mov 	ES,AX 		;сегмент данных 
	mov 	ah,9 
	lea 	dx,Prompt1 	;загружаем адрес строки 
	int 	21h 
	inc 	ah 		;ah=0ah
	lea 	dx,Buffer 	;загружаем адрес строки 
	int 	21h 
	dec 	ah 		;ah=9
	lea 	dx,Prompt2 
	int 	21h 
	mov 	ah,1 
	int 	21h
	mov	dl,al		;введенный символ
	
	mov 	cl,LenStr 	;длина введенной строки  
	xor 	ch,ch
	mov	bx,cx		;сохраним длину строки
	lea 	di,String 	;кладем в Di адрес строки(index) 
	lea	si,[bx+di-1]	;адрес последнего символа в строке
FindLoop:			;цикл поиска символа dl в строке
	mov	al, [di]	;очередной символ
	inc	di		;инкремент адреса
	cmp	al,dl		;сравниваем
	je	Found		;если равно, то нашли
	loop	FindLoop	;циклим столько, чему равна длина строки
	jmp	NotFound	;прошли всю строку и не нашли

Found:				;символ найден
;скопируем символы строки за найденным, сместив их на количество символов перед найденным
;тем самым освободив место, чтобы скопировать символы перед сразу за найденным
	dec	cx		;количество символов за найденным
	sub	bx, cx		;количество до и сам символ
	mov	byte ptr [bx+si], '$' ;bx+si - адрес за последним символом новой строки. Закроем строку для вывода
	cmp	bx, 1		;если найден первый символ
	je	PrintResult	; то вставлять нечего! Сразу на вывод результата!
	
	jcxz	CopyHead	;если найден последний символ, то на копирование передних за найденным

CopyTailLoop:			;собственно, копируем символы строки за найденным в конец новой строки
				;освобождая тем самым место для передних символов
	mov	al,[si]		;идем с хвоста старой строки
	dec	si		;смещаемся к началу
	mov	[bx+si],al	;bx+si адрес хвоста новой строки
	loop	CopyTailLoop	;по всем символам за найденным

CopyHead:			;копируем символы перед найденным сразу за ним в освободившееся место
	mov	cx, bx		;количество до найденного плюс сам символ
	dec	cx		;исключим сам символ в количестве копируемых
				;продолжаем копировать с хвоста
CopyHeadLoop:
	dec	si		;начинаем с уменьшения адреса, чтобы обойти сам символ
	mov	al,[si]		;читаем очередной
	mov	[bx+si],al	;и копируем на новое место
	loop	CopyHeadLoop	;по всем символам спереди найденного
	
PrintResult:			;вывод результата
	lea	dx,Result
	mov	ah,9
	int	21h
	
	lea	dx,String	;новая строка
print:				;вывод, в том числе и сообщения о том, что символ не найден
	mov	ah,9
	int	21h
	
	xor	ax,ax		;ждем нажатия на клавишу
	int	16h
	
	mov	ax, 4c00h
	int	21h
	
NotFound:
	lea	dx, sNotFound
	jmp	print
endp main
end main

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

5
Спасибо, Вам, огромное! Все работает!
-----
Дата оценки: 28.11.2017, 19:16

Рейтинг ответа:

НЕ одобряю +1 одобряю!


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, varinkovaalina!

Строковые команды.
smile
Добавлен ещё один случай, пользователь ввел пустую строку.

Код (Assembler) :: выделить код
model	small
szStr	equ	250
data
dbInpStr	db	10,13,'Enter string:$'
dbInpSim	db	10,13,'Enter simbol:$'
dbRes		db	10,13,'Result:$'
dbErr		db	10,13,'String not found$'
dbNot		db	10,13,'Simbol not found$'
dbMax	db	szStr
dblen	db	?
dbStr	db	2*szStr dup(?)
stack	256
code
;настариваем сегментные регистры
begin:	mov	ax,@data
	mov	ds,ax
	mov	es,ax
;просим ввести строку
	mov	ah,9
	lea	dx,dbInpStr
	int	21h
;вводим
	mov	ah,10
	lea	dx,dbMax
	int	21h
;просим ввести символ
	mov	ah,9
	lea	dx,dbInpSim
	int	21h
;вводим
	mov	ah,1
	int	21h
;читаем длину введенной строки
	xor	ch,ch
	mov	cl,dbLen
	lea	si,dbStr
	mov	bx,cx
;для функции вывода строки
	mov	byte ptr [bx+si],'$'
;пустая стока
	lea	dx,dbErr
	jcxz	outStr
;начнем работу со строковыми командами
	mov	di,si
	cld
	repne	scasb
;нет символа в строке
	lea	dx,dbNot
	or	cx,cx
	jz	outStr
;начинаем копирование
	mov	dx,si
	push	di
	push	cx
	add	si,bx;в конец строки
	mov	di,si
	add	di,bx;освобождаем свободное место
	dec	di;адресация с нуля - коррекция
	sub	di,cx
	inc	cx;кооректируем адресацию с нуля
;копируем строку
	std
	rep	movsb;
;востанавливаем параметры поиска
	pop	cx
	pop	si
	dec	si;корректируем от куда копируем
	sub	bx,cx;считаем количество копируемых символов
	mov	cx,bx
;копируем начальнуе символы
	rep	movsb
;выводим результат
outStr:	push	dx
	mov	ah,9
	lea	dx,dbRes
	int	21h
	mov	ah,9
	pop	dx
	int	21h
	xor	ax,ax
	int	16h
	mov	ax,4C00h
	int	21h
	end	begin

Удачи!

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 28.11.2017, 19:45

5
нет комментария
-----
Дата оценки: 29.11.2017, 19:50

Рейтинг ответа:

НЕ одобряю +1 одобряю!


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

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

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


В избранное