Заменить слово / подстроку в файле - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, делаю задание где нужно заменить определенное слово в текстовом файле на другое, написал пока что вывод содержимого файла в буффер, теперь не могу понять как сделать замену слова. Помогите пожалуйста составить алгоритм действий.
.model small
.stack 100h
 
.data
filename    db  'texttt.txt',0
msg1        db  'File was open.$'
msg2        db  10,13,'Enter word you want to replace: $'
msg3        db  10,13,'Enter second word: $'
msg4        db  10,13,'String in file: $' 
error_msg   db  'File wasnt open.$'
error_msg2  db  10,13,'Cant read from file.$'
str1        db  254, 0, 255 dup (0)
str2        db  254, 0, 255 dup (0)
buffer      db  254 dup (0)
handle      dw  0
 
.code
main:
    mov ax,@data
    mov ds,ax 
OpenFile:        
    mov ax,3D02h
    lea dx,filename
    int 21h
    jc ErrorOpen
    mov handle,ax
    mov bx,handle
    mov ah,09h
    lea dx,msg1
    int 21h
    xor cx,cx
    xor dx,dx
    mov ax,4200h
    int 21h
    mov ah,09h
    lea dx,msg4
    int 21h
    mov si,0
ReadFromFile:
    lea dx,buffer[si]
    mov cx,1
    mov ah,3fh
    int 21h
    cmp ax,cx
    jnz FirstInput
    mov dl,buffer[si]
    mov ah,02h
    int 21h
    inc si
    jmp ReadFromFile
FirstInput:    
    mov ah,09h
    lea dx,msg2
    int 21h
    mov ah,0ah
    lea dx,str1
    int 21h
SecondInput:
    mov ah,09h
    lea dx,msg3
    int 21h
    mov ah,0ah
    lea dx,str2
    int 21h
    mov cx,si
    
CloseFile:
    mov ah,3Eh
    mov bx,handle
    int 21h
    jmp Exit
ErrorOpen:
    mov ah,09h
    lea dx,error_msg
    int 21h
    jmp Exit
ErrorRead:
    mov ah,09h
    lea dx,error_msg2
    int 21h
    jmp CloseFile
Exit:
    mov ax,4c00h
    int 21h
end main

Решение задачи: «Заменить слово / подстроку в файле»

textual
Листинг программы
.model small
.stack 100h
 
.data
filename    db  'Lab3txtFile.txt',0
msg1        db  'File was open.$' 
msg2        db  'Found$'
msg3        db  'Not found$'
error_msg1  db  'File wasnt open.$'
error_msg2  db  'Cant read from file.$'
buffer      db  79,80   dup (?)
string      db  'asd'
newstr      db  'nvm'
strlen       =  3
handle      dw  0
 
.code
Main:
      mov    ax,text
      mov    ds,ax
      mov    es,ax
 
OpenFile:
    ; DOS Fn 3dH: открыть описатель файла.
    ; output: AX = код ошибки если CF установлен и описатель файла если нет ошибки.
      mov    ax,3D02h        ; AL = режим открытия.
      lea    dx,filename     ; DS:DX = адрес строки ASCIIZ с именем файла.
      int    21h
      jc     Error_Open
 
      mov    handle,ax
 
      mov    ah,09h
      lea    dx,msg1
      int    21h
 
ReadFromFile:
      ; DOS Fn 3fH: читать файл через описатель.
      ; output: AX = код ошибки если CF установлен или число действительно прочитанных байт.
      mov    ah,3fh
      lea    dx,buffer  ; DS:DX = адрес буфера для чтения данных.
      mov    bx,handle  ; BX = описатель файла.
      mov    cx,20        ; CX = число считываемых байт.
      int    21h
      jc     Error_Read
 
;First:
      lea    di,buffer
First:
      mov    cx,20
      mov    al,string
      repne  scasb
      je     Found
      jmp    Failed
 
Found:
      dec    di
      lea    si,string
      mov    cx,strlen
      repe   cmpsb
      pushf
      dec    di
      popf
      jne    First
 
      mov    cx,strlen
      sub    di,cx
      inc    di
      lea    si,newstr
      rep    movsb
 
      ; DOS Fn 42H: установить указатель файла -- LSEEK.
      ; output: AX = код ошибки если CF установлен.
      ;         DX:AX = новая позиция указателя файла (если нет ошибки).
      mov    cx,0         ; 
      mov    dx,0         ; CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX 
      mov    bx,handle   ; BX = описатель файла.
      mov    ax,4200h     ; AL = 0 переместить к началу файла + CX:DX.
      int    21h
 
    ; DOS Fn 40H: писать в файл через описатель.
    ; output: AX = код ошибки если CF установлен
    ;         AL = число реально считанных байт (лучший тест для ошибок).
      mov    ah,40h
      lea    dx,buffer    ; DS:DX = адрес буфера, содержащего записываемые данные.
      mov    bx,handle    ; BX = описатель файла.
      mov    cx,20        ; CX = число записываемых байт.
      int    21h
      jmp    CloseFile
 
Failed:
      mov    ah,09h
      lea    dx,msg3
      int    21h
      jmp    CloseFile
 
Error_Open:
      mov    ah,09h
      lea    dx,error_msg1
      int    21h
      jmp    Exit
 
Error_Read:
      mov    ah,09h
      lea    dx,error_msg2
      int    21h
      jmp    CloseFile
 
CloseFile:
    ; DOS Fn 3eH: Закрыть описатель файла.
    ; output: AX = код ошибки если CF установлен.
    ;         AL = число реально считанных байт (лучший тест для ошибок).
      mov    ah,3Eh
      mov    bx,handle    ; BX = описатель файла.
      int    21h
Exit:
      mov    ah, 1
      int    21h
      mov    ax,4c00h
      int    21h
end Main

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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