.model tiny
.386
JUMPS
.code
org 100h
start:
mov ax, 3
int 10h
lea dx, msg_input
mov ah, 9
int 21h
lea dx, buf
mov ah, 0Ah
int 21h
; запишем в DХ фактическую длину ввода
lea si, buf
inc si
mov dl, [si]
xor dh, dh
inc si
add si, cx ; в конец запишем 0 = индикатор конца строки. Там сейчас 13 = ENTER
mov byte ptr [si], 0
dec cx ; последний символ обрабатывать не надо
or dx, dx
jz @@_exit
mov al, 13 ; переход на новую строку
int 29h
mov al, 10
int 29h
; собственно, удаление
lea si, buf
add si, 2
cld
@@1:
lodsb
or al, al
jz @@_show
@@2:
cmp al, [si] ; SI теперь указывает на следующий символ
jne @@3
; вот оно удаление - нас самом деле сдвиг влево на один символ
push si ; сохраняем то, что будет изменено
mov cx, dx
; REP изменит СХ, так что его нужно обновлять
mov di, si
inc si
REP MOVSB
pop si
jmp @@2
@@3:
dec dx
jmp @@1
@@_show:
; покажем новую строку
lea si, buf
add si, 2 ; пропустили байты длины
cld ; буду использовать строковые инструкции - установим флаг направления
@@_next:
lodsb
or al, al
jz @@_exit
int 29h ; это прерывание умеет делать только одно: выводить содержимое AL на экран
jmp @@_next
@@_exit:
lea dx, msg_press
mov ah, 9
int 21h
xor ax, ax
int 16h
int 20h
msg_input db 'Введите строку символов длиной не более 80:',13,10,'$'
msg_press db 13,10,'Press any key ...$'
buf db 80, 80 dup (?) ; место для строки
end start
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.