Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .stack 100h
- .data
- buf db 200 , 200 dup('$')
- find db 200 , 200 dup('$');
- str_warning db 0dh , 0ah , "Invalid input!Try again" , 0Dh , 0Ah , '$'
- str_newline db 0dh, 0ah, '$'
- .code
- main:
- mov ax , @data
- mov es, ax
- mov ds , ax
- jmp read
- retry:
- mov dx , offset str_warning
- mov ah, 9h
- int 21h
- read:
- mov dx , offset buf; считываем строку в буффер
- mov ah, 0Ah ; помещаем в сегмент ax номер функции dos
- int 21h
- xor cx, cx ; добавить пробел и увеличить длину
- add cl, [buf + 1]
- mov di, offset buf + 2
- add di, cx
- mov ax, 0D20h
- stosw
- inc byte [buf]
- mov dx , offset str_newline ; перейти на новую строку
- mov ah, 9h
- int 21h
- mov dx , offset find; считываем строку в буффер
- mov ah, 0Ah ; помещаем в сегмент ax номер функции dos
- int 21h
- xor cx, cx ; добавить пробел и увеличить длину
- add cl, [find + 1]
- mov di, offset find + 2
- add di, cx
- mov ax, 0D20h
- stosw
- inc byte [find]
- mov dl, [buf + 1]
- sub dl, [find + 1] ; размер для поиска
- inc dl
- mov si, offset buf + 2 ;установка на начало строк
- search_loop: ; цикл для проверки по строке
- mov di, offset find + 2 ; установка на начало строки со словом
- xor cx, cx
- mov cl, [find + 1]; установка размера "цикла"
- repe cmpsb ; сравнить слово и слово на текущем символе исх строки
- je good ; если все совпадает, то выйти из цикла
- ; перейти на следующий символ исходной строки
- xor bx,bx
- mov bl, [find + 1]
- sub si, bx ; откатиться на размер
- add si, cx
- inc si
- dec dl
- jnz search_loop
- jmp retry
- good:
- xor bx, bx ; перейти к началу найденного слова
- mov bl, [find + 1]
- sub si, bx;
- mov di, si
- find_prev:
- cmp di, offset buf + 2 ; если оно первое, то к выводу
- je win
- sub di, 2 ; перейти на последний символ предыдущего
- mov cx, di ; искать до пробела
- sub cx, offset buf + 2
- mov al, ' ' ;
- std
- repne scasb
- cmp di, offset buf + 2 ; если вышли из цикла по сх = 0, то мы в начале строки и ничего делать не надо
- je move
- add di, 2 ; иначе мы прошли пробел и оказались на последнем символе слова перед удаляемым, поэтому переходим на первый символ удаляемого
- move:
- ;посчитать, сколько символов перемещать
- mov cx, offset buf + 2
- add cl, [buf + 1]
- adc ch, 0 ; если произойдет переполнение, перенести в старший разряд
- sub cx, di
- add cx, 2
- cld
- rep movsb
- jmp win
- win:
- mov dx , offset str_newline
- mov ah, 9h
- int 21h
- mov dx , offset buf + 2
- mov ah, 9h
- int 21h
- mov ax,4C00h
- int 21h
- end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement