Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Замена последовательности одинаковых символов одним

Вопрос:
Ввести строку символов. Заменить одинаковые символы, стоящие рядом (сколько бы их не было) на один такой символ.

Ответ:
Введенная строка проверяется с помощью индексных регистров SI и DI. Первый указывает на проверяемый символ, второй на последний удовлетворяющий условию.
;
model tiny
.186
.code
org	100h
;переходим в текстовый режим
begin:	mov	ax,3
	int	10h
;выводим приглашение к вводу
	mov	ah,09h
	mov	dx,offset dbEnter
	int	21h
;вводим строку
	mov	ah,0ah
	mov	dx,offset dbStringMax
	int	21h
;настраиваем индексные регистры
	mov	si,offset dbString
	mov	di,si
	lodsb
;определяем длину введенной строки
	mov	cl,dbStringSize
	xor	ch,ch
;считываем очередной символ
isLoop:	lodsb
	cmp	al,[di]
	jz	noSave
;записываем не оинаковый символ
	inc	di
	mov	[di],al
noSave:
	loop	isLoop
;записываем маркер конца строки
	mov	al,'$'
	stosb
;записываем пробелы
	mov	al,20h
	mov	dbStringMax,al
	mov	dbStringSize,al
;выводим результат
	mov	ah,09;
	mov	dx,offset dbResult
	int	21h
;ожидаем любую клавишу
	xor	ax,ax
	int	16h
;выход в дос
	ret
dbResult	db	10,13,'Result:'
dbStringMax	db	200
dbStringSize	db	?
dbString	db	200 dup(?)
dbEnter		db	10,13,'Enter string:$'
end	begin	
еще один вариант. Отличие то, что символы выводятся на экран сразу, и предыдущий символ хранится в DH
; Делаем COM-файл:
; tasm name.asm
; tlink name /t

	.model	tiny

	.data
sInput	db	'Enter string:  $'
sResult	db	0dh, 0ah, 'Result string: $'
sPress	db	0dh, 0ah, 'Press any key$'

buf	label	byte		; буфер для приема строки с клавиатуры (по ф-и 0ah)
max	db	128		; максимальная длина строки
len	db	0		; реальная длина введенной строки
string	db	128 dup (?)	; сама строка

	.code
	.startup

	lea	dx, sInput
	mov	ah, 9
	int	21h		; приглашение на экран

	lea	dx, buf
	mov	ah, 0ah
	int	21h		; вводим строку

	lea	dx, sResult
	mov	ah, 9
	int	21h		; Result string

	lea	si, string	; адрес строки
	mov	dh, 0		; предыдущий символ
MLoop:
	lodsb			; очередной
	cmp	al, 0dh		; введенная строка заканчивается кодом 0dh
	je	exit
	cmp	al, dh		; совпадает с предыдущим?
	je	MLoop
	mov	dh, al		; сохраним
	int	29h		; и выведем
	jmp	MLoop

exit:
	lea	dx, sPress
	mov	ah, 9
	int	21h		; press any key
	
	mov	ah, 0		; ждем нажатие клавиши, чтобы не ушло сразу
	int	16h

	mov	ax, 4c00h
	int	21h

	end


   Вперёд
   Содержание