Advertisement
Sailein

4_3

May 21st, 2019
1,503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2. .stack 100h
  3. .data       ;0123456789ABCDEF
  4.     str1 db 'eee  ;ee  ', 0                 ;первая строка
  5.     db 'ra,r,r,c',0                         ;вторая строка
  6.     db '  ',0
  7.     db ' Mama;mwwwwwwwwwwu  ram rami  ',0
  8.     db 'mi mi mii bu bu', 0
  9.     db '  erew  r arf r', 0
  10.     db 'ee rr wer;rr', 0
  11.     db ';aa a aa yyyy',0
  12.     db 'ramayu',0,30                ;последняя стркоа, заканчивается символом 30 - конец файла
  13.     str2 db 1000 dup(0)             ;строка с количеством слов разной длины в виде нормальной строки из числе и пробелов
  14.     p dw 0
  15.     max dw 0
  16.     ww db 100 dup(0)
  17. .code
  18. .486
  19.     mov ax, @data
  20.     mov ds, ax
  21.     mov es, ax
  22.  
  23.     lea si, str1                ;источник
  24.     lea di, str2                ;приёмник
  25.    
  26.     push di
  27.    
  28.     xor dx, dx      ;цикл прохода по всему тексту и замена
  29.     mov di, si
  30.     dec di
  31.     mov ah, ' '
  32. sl: inc di
  33.     mov al, ','     ;запятых
  34.     cmp [di], al
  35.     jne s2
  36.     mov [di], ah
  37. s2: mov al, ';'     ;точек с запятой на пробелы
  38.     cmp [di], al
  39.     jne s3
  40.     mov [di], ah
  41. s3: mov al, 30      ;до тех пор, пока не встретим символ конца файла
  42.     cmp [di], al
  43.     jne sl
  44.  
  45.     pop di
  46.  
  47.  
  48.     mov bl, 30
  49.     xor ax, ax
  50.     mov bh, ' '
  51.     push di
  52.  
  53.     ;начало обработки очередной строки
  54. s12:cmp[si], bl                 ;проверяем наличие 30 символа - символ конца файла
  55.     je ext
  56.     cmp [si], bh                ;проверяем наличие пробела
  57.     jne s11                     ;если не пробел - обрабатываем слово
  58.     inc si
  59.     jmp s12                     ;иначе начинаем обрабатывать пробелы (пропускать)
  60. s11:cmp [si], ah
  61.     je ex
  62.  
  63.  
  64.  
  65.     sw: pop di
  66.         push di
  67.         mov dx, si              ;сохраняем исходную строку
  68.     ns: mov al, [si]
  69.         cmp al, bh              ;проверка на пробел
  70.         je ew
  71.         cmp al, ah              ;проверка на 0
  72.         je ew
  73.         cmp al, [di]            ;сравниваем al с [di++]
  74.         jne edw                 ;переход, елси не совпали
  75.         inc si
  76.         inc di
  77.         jmp ns                  ;обрабатываем дальше
  78.  
  79.         ;если закончилось исходное слово, переход сюда
  80.     ew: cmp [di], ah            ;если в [di] = 0 - слова совпали
  81.         je ewi
  82.         cmp [di], bh            ; = пробел - слова совпали - слово не подходит
  83.         je ewi
  84.     sp1:inc di                  ;анализируем следующую букву
  85.         cmp [di], ah            ;сравнили с 0 байтом
  86.         je ewc                  ;если так, то больше сравнить не с чем, слово можно копировать
  87.         cmp [di], bh            ;сравнили с пробелом, если не пробел пропускаем букву, проверяем снова
  88.         jne sp1
  89.         ;иначе убираем пробелы
  90.     s10:inc di
  91.         cmp [di], ah            ;если ноль-байт, то всё ок
  92.         je ewc
  93.         cmp [di], bh            ;если пробел
  94.         je s10                  ;обрабатываем следующий пробел
  95.         mov si, dx              ;иначе - началось новое слово, загружаем начало исходного слова
  96.         jmp ns                  ;переходим обратно к сравнению
  97.  
  98.         ;сюда перешли, если обнаружили несовпадение с исхожным с
  99.     edw:cmp [di], ah            ;если 0 в конце [di], то слово точно ОК
  100.         je ewc                  ;переход на копирование слова
  101.         cmp [di], bh            ;если встретили пробел, то анализируем
  102.         je sp3                  ;
  103.     sp7:inc di                  ;остаётся случай, когда в di не тот символ, переходим к следующему
  104.         cmp [di], ah            ;проверка на конец строки
  105.         je ewc
  106.         cmp [di], bh            ;проверка на конец очередного слова
  107.         je sp3                  ;переход кпропуску пробелов
  108.         jmp sp7                 ;пропускаем конец старого слова
  109.  
  110.     sp3:inc di
  111.         cmp [di], ah            ;если 0, то конец, всё ОК
  112.         je ewc
  113.         cmp [di], bh            ;если пробел - продолжаем анализ
  114.         je sp3
  115.         mov si, dx              ;иначе загружаем обратно слово
  116.         jmp ns                  ;анализируем следующее из di
  117.         ;случай, когда слово нельзя копировать
  118.     ewi:cmp [si], ah            ;если встретили 0
  119.         jne sp9
  120.         mov cx, -1
  121.         pop di
  122.         push di
  123.         xor ax, ax
  124.         repne scasb             ;пропускаем всю строку-приёмник
  125.         dec di                  ;корректируем di
  126.         jmp ex                  ;переход в конец
  127.     sp9:mov al, ' '
  128.         mov cx, -1
  129.         cmp [si], al            ;проверка на пробел
  130.         jne sw                  ;анализируем дальше, елси пробел
  131.         inc si                  ;коррект.
  132.         jmp ewi                 ;анализируем следующее слово
  133.  
  134.         ;случай, когда слово можно копировать
  135.     ewc:mov cx, -1              ;счётчик в -1
  136.         xor ax, ax
  137.         pop di                  ;заменить
  138.         push di
  139.         repne scasb             ;пропускаем всё до конца строки
  140.         dec di
  141.         add cx, 2
  142.         neg cx
  143.         jcxz sp4
  144.         mov [di], bh            ;добавляем пробел
  145.         inc di
  146.  
  147.         xor cx, cx
  148.         mov si, dx              ;загружаем начало слова в si
  149.     sp4:cmp [si], ah
  150.         je sp5
  151.         cmp[si], bh
  152.         je sp5
  153.         inc cx                  ;считаем длину слова
  154.         inc si
  155.         jmp sp4
  156.  
  157.     sp5:mov si, dx
  158.         rep movsb               ;копируем слово
  159.  
  160.  
  161.     sp8:cmp [si], bh            ;пропсукаем пробелы в конце
  162.         jne sp6
  163.         inc si
  164.         jmp sp8
  165.     sp6:cmp [si], ah
  166.         jne sw                  ;если не 0 байт, то анализируем следующее слово
  167.     ex: mov [di], ah            ;иначе помещаем ноль-байт в конец di
  168.         inc di                  ;переход к следующему символу приёмника
  169.         pop ax
  170.         push di                 ;обновили в стеке значение
  171.         xor ax, ax
  172.         inc si                  ;переход к следующему символу исходного текста (следующая строка)
  173.         jmp s12
  174.  
  175.  
  176.  
  177. ext:mov[di], bl             ;поместили символ 30, когда всё обработаем
  178.     push di
  179.     mov ah, 4ch
  180.     int 21h
  181. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement