Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2. .stack 100h
  3.  
  4. .data
  5. buf db 200 , 200 dup('$')
  6. find db 200 , 200 dup('$');
  7. str_warning db 0dh , 0ah , "Invalid input!Try again" , 0Dh , 0Ah , '$'
  8. str_newline db 0dh, 0ah, '$'
  9. .code
  10. main:
  11.    mov ax , @data
  12.    mov es, ax
  13.    mov ds , ax
  14.    jmp read
  15. retry:
  16.    mov dx , offset str_warning
  17.    mov ah, 9h
  18.    int 21h
  19. read:
  20.    mov dx , offset buf; считываем строку в буффер
  21.    mov ah, 0Ah ; помещаем в сегмент ax номер функции dos
  22.    int 21h
  23.  
  24.    xor cx, cx ; добавить пробел и увеличить длину
  25.    add cl, [buf + 1]
  26.    mov di, offset buf + 2
  27.    add di, cx
  28.    mov ax, 0D20h
  29.    stosw
  30.    inc byte [buf]
  31.  
  32.    mov dx , offset str_newline ; перейти на новую строку
  33.    mov ah, 9h
  34.    int 21h
  35.  
  36.    mov dx , offset find; считываем строку в буффер
  37.    mov ah, 0Ah ; помещаем в сегмент ax номер функции dos
  38.    int 21h
  39.  
  40.    xor cx, cx ; добавить пробел и увеличить длину
  41.    add cl, [find + 1]
  42.    mov di, offset find + 2
  43.    add di, cx
  44.    mov ax, 0D20h
  45.    stosw
  46.    inc byte [find]
  47.  
  48. mov dl, [buf + 1]
  49. sub dl, [find + 1] ; размер для поиска
  50. inc dl
  51.  
  52. mov si, offset buf + 2 ;установка на начало строк
  53.  
  54.  
  55. search_loop: ; цикл для проверки по строке
  56.     mov di, offset find + 2 ; установка на начало строки со словом
  57.     xor cx, cx
  58.     mov cl, [find + 1]; установка размера "цикла"
  59.     repe cmpsb ; сравнить слово и слово на текущем символе исх строки
  60.     je good ; если все совпадает, то выйти из цикла
  61.     ; перейти на следующий символ исходной строки
  62.     xor bx,bx
  63.     mov bl, [find + 1]
  64.     sub si, bx ; откатиться на размер
  65.     add si, cx
  66.     inc si
  67.  
  68.  
  69.     dec dl
  70.     jnz search_loop
  71. jmp retry
  72. good:
  73.     xor bx, bx ; перейти к началу найденного слова
  74.     mov bl, [find + 1]
  75.     sub si, bx;
  76.     mov di, si
  77. find_prev:
  78.     cmp di, offset buf + 2 ; если оно первое, то к выводу
  79.     je win
  80.     sub di, 2 ; перейти на последний символ предыдущего
  81.  
  82.     mov cx, di ; искать до пробела
  83.     sub cx, offset buf + 2
  84.     mov al, ' ' ;
  85.     std
  86.     repne scasb
  87.  
  88.     cmp di, offset buf + 2 ; если вышли из цикла по сх = 0, то мы в начале строки и ничего делать не надо
  89.     je move
  90.     add di, 2 ; иначе мы прошли пробел и оказались на последнем символе слова перед удаляемым, поэтому переходим на первый символ удаляемого
  91. move:
  92.  
  93.     ;посчитать, сколько символов перемещать
  94.     mov cx, offset buf + 2
  95.     add cl, [buf + 1]
  96.     adc ch, 0 ;  если произойдет переполнение, перенести в старший разряд
  97.     sub cx, di
  98.     add cx, 2
  99.     cld
  100.     rep movsb
  101.    
  102.  
  103.     jmp win
  104.  
  105. win:
  106.     mov dx , offset str_newline
  107.     mov ah, 9h
  108.     int 21h
  109.     mov dx , offset buf + 2
  110.     mov ah, 9h
  111.     int 21h
  112.     mov ax,4C00h
  113.     int 21h
  114.  
  115. end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement