  | 
Ассемблер в примерах - Удалить знаки препинания в строке
- Вопрос:
 
- Ввести строку символов. Удалить знаки препинания в строке, если они там есть.
 
 
 
- Ответ:
 
- 
.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
 
 
 |   |