Поиск и замена заданной последовательности символов в заданном файле - 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

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы