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

Ассемблер в примерах - Удалить знаки препинания в строке

Вопрос:
Ввести строку символов. Удалить знаки препинания в строке, если они там есть.

Ответ:
.Model TINY
.286

.Data

delim db ' .,:;"', 39, '/?[]{}`~!@#$%^&*()-+=\|'
str db 254, 0, 254 dup (?)

.Code

lea dx, str
mov ah, 0ah
int 21h

xor ax, ax

mov si, dx
inc si
lodsb
inc si

xchg ax, cx

push si si
pop di dx

lea bx, delim
lea bp, str - 1

@loop:
lodsb

xchg di, bx
push bp
xchg cx, bp

repne scasb
xchg bx, di

jz @next

stosb

@next:
pop cx

xchg cx, bp

loop @loop



mov ah, 9
int 21h

ret

end.


Вариант №2 с комментариями:
; Делаем 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$'
sSepar	db	9,' ,.;:'	;строка разделителей-знаков препинания (при желании, можно подправить)
len_sep	equ	$-sSepar	;длина строки разделителей

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	; адрес строки
	call	DelSepar

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

	mov	ax, 4c00h
	int	21h

;обработка строки по адресу в si
;строка заканчивается 0dh
;результат будет по тому же адресу,
;в конце строки будет записан символ '$' (для ф-и 9 прерывания 21)
DelSepar	proc
	mov	bx, si		;адрес, куда будем писать
MLoop:
	lodsb			; очередной
	cmp	al, 0dh		; введенная строка заканчивается кодом 0dh
	je	return		; на запись в конце символа '$'
	lea	di, sSepar	;адрес строки разделителей 
	mov	cx, len_sep	;длина
	repne	scasb		;ищем в строке [di], пока не равно
	je	MLoop		;нашли - пропускаем и идем на чтение следующего символа
	mov	[bx], al	;запишем 
	inc	bx		;и проинкрементируем адрес
	jmp	MLoop		;на повтор
return:
	mov	byte ptr [bx], '$';закроем строку
	ret
DelSepar	endp

	end


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