WMmail.ru - сервис почтовых рассылок

воскресенье, 3 декабря 2017 г.

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

  
54-ФЗ, онлайн-кассы. Новое в законодательстве и в программах 1С для розницы, практика применения.
  
Subscribe.ru
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 благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
     Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать Все выпуски рассылки
 
Если выпуск не отображается, вы можете прочесть его на сайте

Это сообщение было отправлено на admin10383.deep@blogger.com потому, что вы подписались на рассылку comp.prog.assembler на subscribe.ru.
Чтобы гарантировать получение писем от нас — добавьте наш адрес в адресную книгу.

Вы можете отказаться от получения писем.

Архив рассылки Поддержка подписчиков

Комментариев нет:

Отправить комментарий