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