Листинг 6.3. Решение задачи.
Data segment
MESS1 db 0dh,0ah, "Введите строку:", 0dh,0ah, "$"
MESS2 db 0dh,0ah, "Введите позицию:", 0dh,0ah, "$"
MESS3 db 0dh,0ah, "Введите число удаляемых символов:", 0dh, 0ah, "$"
MESS4 db 0dh,0ah, "Строка после удаления:", 0dh,0ah, "$"
S_BUFLEN db 80 ; Максимальная длина строки
S_FACTLEN db ? ; Фактическая длина строки
S_INPBUF db 80 dup(?) ; Введённая строка
N_BUFLEN db 3 ; Максимальная длина числа при вводе
N_FACTLEN db ? ; Фактическая длина числа
N_INPBUF db 3 dup(?) ; Введённое число
POSDEL dw ? ; Позиция начала удаления
LENDEL dw ? ; Число удаляемых символов
Data ends
Code segment
Assume cs:code, ds:data
START: mov ax, data
Mov ds,ax
; Ввод строки
LOP: lea DX, MESS1
Mov ah, 09h
Int 21h ;приглашение к вводу строки
Lea DX, S_BUFLEN
Mov ah, 0Ah
Int 21h ; ввод строки
Mov AL, S_FACTLEN
Cmp al, 0 ; строка пустая?
Ja LLL0 ; нет продолжать
Jmp quit ; закончить работу
LLL0: lea bx, S_INPBUF ; получить адрес начала строки
Cbw ; получить длину в слове
Add bx, ax ; адрес конца строки
mov byte ptr [bx], "$" ; записать признак конца строки
; Ввод позиции удаления
LLL1: lea dx, MESS2
Mov ah, 09h
Int 21h ;Приглашение к вводу позиции удаления
Lea dx, N_BUFLEN
Mov ah, 0Ah
Int 21h ; ввод позиции удаления
Call VAL ; вызов процедуры перевода в число
Jc LLL1 ; ошибка, повторить ввод
Cmp al, 0 ; ноль?
Jz LLL1 ; ошибка, повторить ввод