Поиск и замена заданной последовательности символов в заданном файле - Assembler
Формулировка задачи:
Программа должна выполнять поиск заданной последовательности символов в заданном файле, менять ее на другую заданную последовательность (того же размера) и измененный текст вводить в другой файл. Моя программа работает только для небольших файлов, так как считывает буфером только один раз и ищет в нем. Необходимо чтобы программа работала и для больших файлов, то есть считывала текст в цикле. Ни как не получается добавить цикл, прошу помогите!
Вот так пытался сделать цикл: ===================================================
code_seg segment assume cs:code_seg, ds:code_seg .386 org 100h start: FileNamePrint: mov ah,09h mov dx,offset msg1 int 21h mov AH, 0Ah mov DX, offset FileName int 21h xor BH, BH mov BL, FileName[1] mov FileName[BX+2], 0 lea dx, ent ;Перенос каретки mov ah, 9 int 21h OpenFile: mov ax, 3D02h mov dx, offset filename + 2 int 21h jc OpenError mov handle, ax mov ah,09h mov dx,offset msg4 int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h InputOne: ;Ввод первой строки mov ah,09h mov dx, offset msg2 int 21h mov ah,0ah mov dx, offset string int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h InputTwo: ; строка на которую заменять mov ah,09h mov dx, offset msg3 int 21h mov ah,0ah mov dx, offset newstr int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h ReadFromFile: mov ah,3fh lea dx,buffer mov bx,handle mov cx,60000 int 21h jc Error_Read lea di,buffer Inspection: ;сравнение строк mov cx,60000 mov al,string + 2 repne scasb ;Сравнить байт по адресу ES:(E)DI с AL(пока !=) je Found ;Условие перехода:ZF=1 jmp Failed Found: ;замена подстроки если нашлось push ax mov al, string + 1 dec di lea si,string + 2 mov cx, ax repe cmpsb pushf ; значения флагов в стек dec di popf jne Inspection mov cx, ax sub di,cx inc di lea si,newstr + 2 rep movsb ;Переслать байт из строки в строку pop ax FileName2Print: mov ah,09h mov dx,offset msg7 int 21h mov AH, 0Ah mov DX, offset FileName2 int 21h xor BH, BH mov BL, FileName2[1] mov FileName2[BX+2], 0 lea dx, ent ;Перенос каретки mov ah, 9 int 21h OpenFile2: mov ax, 3D02h mov dx, offset filename2 + 2 int 21h jc OpenError mov handle2, ax mov ah,09h mov dx,offset msg4 int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h File2Pointer: ; DOS Fn 42H: установить указатель файла -- LSEEK. ; output: AX = код ошибки если CF установлен. ; DX:AX = новая позиция указателя файла. mov cx,0 mov dx,0 ; CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX mov bx,handle2 ; BX = описатель файла. mov ax,4200h ; AL = 0 переместить к началу файла + CX:DX. int 21h WriteToFile2: mov ah,40h lea dx,buffer mov bx,handle2 mov cx, 60000 int 21h jmp CloseFile2 ;------------------Errors--------------------; OpenError: mov ah,09h lea dx,error_msg1 int 21h jmp Exit Failed: mov ah,09h lea dx,msg5 int 21h jmp CloseFile Error_Read: mov ah,09h lea dx,error_msg2 int 21h jmp CloseFile CloseFile: mov ah,3Eh mov bx,handle int 21h CloseFile2: mov ah,3Eh mov bx,handle2 int 21h Exit: mov ah, 1 int 21h mov ax,4c00h int 21h ;------------------Data---------------------; FileName DB 14,0,14 dup (0) FileName2 DB 14,0,14 dup (0) msg1 db 'Enter FileName $' msg2 db 'Enter word you want to replace: $' msg3 db 'Enter second word: $' msg4 db 'File was open.$' msg5 db 'Not found$' msg7 db 'Enter FileName to write $' ;msg db 'Word found$' error_msg1 db 'File wasnt open.$' error_msg2 db 'Cant read from file.$' buffer db 60010 dup (?) string db 200 dup ('$') newstr db 200 dup ('$') strlen db ? handle dw 0 handle2 dw 0 ent db 10, 13, '$' ret code_seg ends end start
code_seg segment assume cs:code_seg, ds:code_seg .386 org 100h start: FileNamePrint: mov ah,09h mov dx,offset msg1 int 21h mov AH, 0Ah mov DX, offset FileName int 21h xor BH, BH mov BL, FileName[1] mov FileName[BX+2], 0 lea dx, ent ;Перенос каретки mov ah, 9 int 21h OpenFile: mov ax, 3D02h mov dx, offset filename + 2 int 21h jc OpenError mov handle, ax mov ah,09h mov dx,offset msg4 int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h InputOne: mov ah,09h mov dx, offset msg2 int 21h mov ah,0ah mov dx, offset string int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h InputTwo: mov ah,09h mov dx, offset msg3 int 21h mov ah,0ah mov dx, offset newstr int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h FileName2Print: mov ah,09h mov dx,offset msg7 int 21h mov AH, 0Ah mov DX, offset FileName2 int 21h xor BH, BH mov BL, FileName2[1] mov FileName2[BX+2], 0 lea dx, ent ;Перенос каретки mov ah, 9 int 21h OpenFile2: mov ax, 3D02h mov dx, offset filename2 + 2 int 21h jc OpenError mov handle2, ax mov ah,09h mov dx,offset msg4 int 21h lea dx, ent ;Перенос каретки mov ah, 9 int 21h File2Pointer: mov cx,0 mov dx,0 ; CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX mov bx,handle2 ; BX = описатель файла. mov ax,4200h ; AL = 0 переместить к началу файла + CX:DX. int 21h FilePointer: mov cx,0 mov dx,0 ; CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX mov bx,handle ; BX = описатель файла. mov ax,4200h ; AL = 0 переместить к началу файла + CX:DX. int 21h metka: mov ah,09h mov dx,offset msg10 int 21h ReadFromFile: mov ah,3fh lea dx,buffer mov bx,handle mov cx,10 int 21h jc Error_Read push ax lea di,buffer Inspection: mov cx,10 mov al,string + 2 repne scasb ;Сравнить байт по адресу ES:(E)DI с AL(пока !=) je Found ;Условие перехода:ZF=1 jmp WriteToFile2 Found: mov ah,09h mov dx,offset msg11 int 21h mov al, string + 1 dec di lea si,string + 2 mov cx, ax repe cmpsb pushf ; значения флагов в стек dec di popf jne Inspection mov cx, ax sub di,cx inc di lea si,newstr + 2 rep movsb ;Переслать байт из строки в строку WriteToFile2: mov ah,40h lea dx,buffer mov bx,handle2 mov cx, 10 int 21h mov ah,09h mov dx,offset msg13 int 21h Looper: ;mov cx, 1 pop ax cmp ax, 0 jne metka ;loop metka mov ah,09h mov dx,offset msg12 int 21h jmp CloseFile2 ;------------------Errors--------------------; OpenError: mov ah,09h lea dx,error_msg1 int 21h jmp Exit Failed: mov ah,09h lea dx,msg5 int 21h jmp CloseFile Error_Read: mov ah,09h lea dx,error_msg2 int 21h jmp CloseFile CloseFile: mov ah,3Eh mov bx,handle int 21h jmp Exit CloseFile2: mov ah,3Eh mov bx,handle2 int 21h jmp CloseFile Exit: mov ah, 1 int 21h mov ax,4c00h int 21h ;------------------Data---------------------; FileName DB 14,0,14 dup (0) FileName2 DB 14,0,14 dup (0) msg1 db 'Enter FileName $' msg2 db 'Enter word you want to replace: $' msg3 db 'Enter second word: $' msg4 db 'File was open.$' msg5 db 'Not found$' msg7 db 'Enter FileName to write $' ;msg db 'Word found$' msg10 db ' cycle $' msg11 db ' found $' msg12 db ' vyhod $' msg13 db ' write $' error_msg1 db 'File wasnt open.$' error_msg2 db 'Cant read from file.$' buffer db 11 dup (?) string db 200 dup ('$') newstr db 200 dup ('$') strlen db ? handle dw 0 handle2 dw 0 ent db 10, 13, '$' ret code_seg ends end start
Решение задачи: «Поиск и замена заданной последовательности символов в заданном файле»
textual
Листинг программы
call getchar jc EndOfFile . . . getchar proc . . . clc ; сбросить флаг CF ret . . . stc ; установить флаг CF ret getchar endp
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д