Здравствуйте, varinkovaalina!
Держите код.
Будут вопросы - обращайтесь в мини-форум
[code lang=asm h=200];В исходную строку вставить после заданного символа все символы предшествующие ему.
;Оставшуюся часть оставить без изменения
.model small
.stack 100h
.data
MaxLen equ 79
Prompt1 db 'stroka: ',13,10,36
Prompt2 db 13,10,'char: ',36
Result db 13,10,'result: $'
sNotFound db 13,10,'Symbol not found$'
Buffer db MaxLen + 1
LenStr db ?
String db MaxLen + 1 dup (?)
.code
main proc
mov AX,@data ;настройка сегментных
mov DS,AX ;регистров на
mov ES,AX ;сегмент данных
mov ah,9
lea dx,Prompt1 ;загружаем адрес строки
int 21h
inc ah ;ah=0ah
lea dx,Buffer ;загружаем адрес строки
int 21h
dec ah ;ah=9
lea dx,Prompt2
int 21h
mov ah,1
int 21h
mov dl,al ;введенный символ
mov cl,LenStr ;длина введенной строки
xor ch,ch
mov bx,cx ;сохраним длину строки
lea di,String ;кладем в Di адрес строки(index)
lea si,[bx+di-1] ;адрес последнего символа в строке
FindLoop: ;цикл поиска символа dl в строке
mov al, [di] ;очередной символ
inc di ;инкремент адреса
cmp al,dl ;сравниваем
je Found ;если равно, то нашли
loop FindLoop ;циклим столько, чему равна длина строки
jmp NotFound ;прошли всю строку и не нашли
Found: ;символ найден
;скопируем символы строки за найденным, сместив их на количество символов перед найденным
;тем самым освободив место, чтобы скопировать символы перед сразу за найденным
dec cx ;количество символов за найденным
sub bx, cx ;количество до и сам символ
mov byte ptr [bx+si], '$' ;bx+si - адрес за последним символом новой строки. Закроем строку для вывода
cmp bx, 1 ;если найден первый символ
je PrintResult ; то вставлять нечего! Сразу на вывод результата!
jcxz CopyHead ;если найден последний символ, то на копирование передних за найденным
CopyTailLoop: ;собственно, копируем символы строки за найденным в конец новой строки
;освобождая тем самым место для передних символов
mov al,[si] ;идем с хвоста старой строки
dec si ;смещаемся к началу
mov [bx+si],al ;bx+si адрес хвоста новой строки
loop CopyTailLoop ;по всем символам за найденным
CopyHead: ;копируем символы перед найденным сразу за ним в освободившееся место
mov cx, bx ;количество до найденного плюс сам символ
dec cx ;исключим сам символ в количестве копируемых
;продолжаем копировать с хвоста
CopyHeadLoop:
dec si ;начинаем с уменьшения адреса, чтобы обойти сам символ
mov al,[si] ;читаем очередной
mov [bx+si],al ;и копируем на новое место
loop CopyHeadLoop ;по всем символам спереди найденного
PrintResult: ;вывод результата
lea dx,Result
mov ah,9
int 21h
lea dx,String ;новая строка
print: ;вывод, в том числе и сообщения о том, что символ не найден
mov ah,9
int 21h
xor ax,ax ;ждем нажатия на клавишу
int 16h
mov ax, 4c00h
int 21h
NotFound:
lea dx, sNotFound
jmp print
endp main
end main[/code]