Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .stack 100h
- .data ;0123456789ABCDEF
- str1 db 'eee ;ee ', 0 ;первая строка
- db 'ra,r,r,c',0 ;вторая строка
- db ' ',0
- db ' Mama;mwwwwwwwwwwu ram rami ',0
- db 'mi mi mii bu bu', 0
- db ' erew r arf r', 0
- db 'ee rr wer;rr', 0
- db ';aa a aa yyyy',0
- db 'ramayu',0,30 ;последняя стркоа, заканчивается символом 30 - конец файла
- str2 db 1000 dup(0) ;строка с количеством слов разной длины в виде нормальной строки из числе и пробелов
- p dw 0
- max dw 0
- ww db 100 dup(0)
- .code
- .486
- mov ax, @data
- mov ds, ax
- mov es, ax
- lea si, str1 ;источник
- lea di, str2 ;приёмник
- push di
- xor dx, dx ;цикл прохода по всему тексту и замена
- mov di, si
- dec di
- mov ah, ' '
- sl: inc di
- mov al, ',' ;запятых
- cmp [di], al
- jne s2
- mov [di], ah
- s2: mov al, ';' ;точек с запятой на пробелы
- cmp [di], al
- jne s3
- mov [di], ah
- s3: mov al, 30 ;до тех пор, пока не встретим символ конца файла
- cmp [di], al
- jne sl
- pop di
- mov bl, 30
- xor ax, ax
- mov bh, ' '
- push di
- ;начало обработки очередной строки
- s12:cmp[si], bl ;проверяем наличие 30 символа - символ конца файла
- je ext
- cmp [si], bh ;проверяем наличие пробела
- jne s11 ;если не пробел - обрабатываем слово
- inc si
- jmp s12 ;иначе начинаем обрабатывать пробелы (пропускать)
- s11:cmp [si], ah
- je ex
- sw: pop di
- push di
- mov dx, si ;сохраняем исходную строку
- ns: mov al, [si]
- cmp al, bh ;проверка на пробел
- je ew
- cmp al, ah ;проверка на 0
- je ew
- cmp al, [di] ;сравниваем al с [di++]
- jne edw ;переход, елси не совпали
- inc si
- inc di
- jmp ns ;обрабатываем дальше
- ;если закончилось исходное слово, переход сюда
- ew: cmp [di], ah ;если в [di] = 0 - слова совпали
- je ewi
- cmp [di], bh ; = пробел - слова совпали - слово не подходит
- je ewi
- sp1:inc di ;анализируем следующую букву
- cmp [di], ah ;сравнили с 0 байтом
- je ewc ;если так, то больше сравнить не с чем, слово можно копировать
- cmp [di], bh ;сравнили с пробелом, если не пробел пропускаем букву, проверяем снова
- jne sp1
- ;иначе убираем пробелы
- s10:inc di
- cmp [di], ah ;если ноль-байт, то всё ок
- je ewc
- cmp [di], bh ;если пробел
- je s10 ;обрабатываем следующий пробел
- mov si, dx ;иначе - началось новое слово, загружаем начало исходного слова
- jmp ns ;переходим обратно к сравнению
- ;сюда перешли, если обнаружили несовпадение с исхожным с
- edw:cmp [di], ah ;если 0 в конце [di], то слово точно ОК
- je ewc ;переход на копирование слова
- cmp [di], bh ;если встретили пробел, то анализируем
- je sp3 ;
- sp7:inc di ;остаётся случай, когда в di не тот символ, переходим к следующему
- cmp [di], ah ;проверка на конец строки
- je ewc
- cmp [di], bh ;проверка на конец очередного слова
- je sp3 ;переход кпропуску пробелов
- jmp sp7 ;пропускаем конец старого слова
- sp3:inc di
- cmp [di], ah ;если 0, то конец, всё ОК
- je ewc
- cmp [di], bh ;если пробел - продолжаем анализ
- je sp3
- mov si, dx ;иначе загружаем обратно слово
- jmp ns ;анализируем следующее из di
- ;случай, когда слово нельзя копировать
- ewi:cmp [si], ah ;если встретили 0
- jne sp9
- mov cx, -1
- pop di
- push di
- xor ax, ax
- repne scasb ;пропускаем всю строку-приёмник
- dec di ;корректируем di
- jmp ex ;переход в конец
- sp9:mov al, ' '
- mov cx, -1
- cmp [si], al ;проверка на пробел
- jne sw ;анализируем дальше, елси пробел
- inc si ;коррект.
- jmp ewi ;анализируем следующее слово
- ;случай, когда слово можно копировать
- ewc:mov cx, -1 ;счётчик в -1
- xor ax, ax
- pop di ;заменить
- push di
- repne scasb ;пропускаем всё до конца строки
- dec di
- add cx, 2
- neg cx
- jcxz sp4
- mov [di], bh ;добавляем пробел
- inc di
- xor cx, cx
- mov si, dx ;загружаем начало слова в si
- sp4:cmp [si], ah
- je sp5
- cmp[si], bh
- je sp5
- inc cx ;считаем длину слова
- inc si
- jmp sp4
- sp5:mov si, dx
- rep movsb ;копируем слово
- sp8:cmp [si], bh ;пропсукаем пробелы в конце
- jne sp6
- inc si
- jmp sp8
- sp6:cmp [si], ah
- jne sw ;если не 0 байт, то анализируем следующее слово
- ex: mov [di], ah ;иначе помещаем ноль-байт в конец di
- inc di ;переход к следующему символу приёмника
- pop ax
- push di ;обновили в стеке значение
- xor ax, ax
- inc si ;переход к следующему символу исходного текста (следующая строка)
- jmp s12
- ext:mov[di], bl ;поместили символ 30, когда всё обработаем
- push di
- mov ah, 4ch
- int 21h
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement