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