Поиск и замена заданной последовательности символов в заданном файле - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д