Найти и удалить символ из файла, введенный с клавиатуры - Assembler
Формулировка задачи:
Необходимо найти и удалить символ из файла, введенный с клавиатуры. Помогите пожалуйста)
Листинг программы
- DATA SEGMENT
- path db "myfile.txt",0
- buf db ?
- DATA ENDS
- SSEG SEGMENT STACK
- db 200 dup(?)
- SSEG ENDS
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA, SS:SSEG
- begin:
- mov ax,DATA
- mov DS,ax
- ;îòêðûâГ*ГҐГ¬ ГґГ*éë
- mov ax,3d00h
- lea dx,path
- int 21h
- jc exit
- mov bx,ax
- xor cx,cx
- xor dx,dx
- mov ax,4200h
- int 21h
- out_str:
- mov ah,3fh
- mov cx,1
- lea dx,buf
- int 21h
- cmp ax,cx
- jnz close
- mov dl,buf
- mov ah,2
- int 21h
- jmp out_str
- close:
- mov ah,3eh
- int 21h
- exit:
- mov ah,4ch
- int 21h
- CODE ENDS
- end begin
Решение задачи: «Найти и удалить символ из файла, введенный с клавиатуры»
textual
Листинг программы
- DATA SEGMENT
- SrcFile db "myfile.txt",0
- DstFile db "Result.txt",0
- SrcHandle dw ?
- DstHandle dw ?
- BufSize equ 128
- Buffer db BufSize dup(?)
- BufLen dw ? ;реальная длина буфера после обработки
- DelChar db 'X' ;удаляемый символ
- msgGetChar db 'Enter char: ', '$'
- DATA ENDS
- SSEG SEGMENT STACK
- db 100h dup(?)
- SSEG ENDS
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA, SS:SSEG
- begin:
- mov ax,DATA
- mov DS,ax
- ;ввод удаляемого символа с клавиатуры
- mov ah, 09h
- lea dx, msgGetChar
- int 21h
- mov ah, 01h
- int 21h
- mov DelChar, al
- ;открываем файл для чтения (al=00)
- mov ax, 3d00h
- lea dx, SrcFile
- int 21h
- jnc SaveSrcHandle
- jmp exit ;выход при ошибке
- SaveSrcHandle:
- mov SrcHandle, ax ;сохраняем описатель (хэндл) файла
- ;открываем файл для записи
- mov ah,3Ch
- lea dx,DstFile
- mov cx,0
- int 21h
- jnc SaveDstHandle
- jmp CloseSrc ;выход при ошибке
- SaveDstHandle:
- mov DstHandle, ax ;сохраняем описатель (хэндл) файла
- ReadBuf:
- mov ah, 3Fh
- mov bx, SrcHandle
- lea dx, Buffer
- mov cx, BufSize
- int 21h
- jnc ProcessBuffer
- jmp CloseDst ;выход при ошибке
- ProcessBuffer:
- ;если нет ошибки чтения, то нужно анализировать
- ;содержимое ax (количество реально считанных байт)
- cmp ax, 0 ;достигнут EOF
- je Break
- ;если ax не равен 0, то в ax количество реально считанных байт
- push ax
- push cx
- mov BufLen, ax
- ;удаление заданных символов из строки
- push ds
- pop es
- mov cx, BufLen
- lea di, Buffer
- mov si, di
- mov bx, 0 ;новая длтна буфера после обработки
- cld
- jcxz @BreakWhile
- @While:
- lodsb
- cmp al, DelChar
- je @Continue
- stosb
- inc bx
- @Continue:
- loop @While
- @BreakWhile:
- mov BufLen, bx
- ;запись обработанного буфера в файл
- mov cx, BufLen
- jcxz SkipSave
- mov ah, 40h
- mov bx, DstHandle
- lea dx, Buffer
- mov cx, cx
- int 21h
- SkipSave:
- pop cx
- pop ax
- cmp ax, cx ;если это была последняя (неполная) порция считанных данных
- jne Break
- jmp ReadBuf
- Break:
- CloseDst:
- mov ah,3eh
- mov bx,DstHandle
- int 21h
- CloseSrc:
- mov ah,3eh
- mov bx,SrcHandle
- int 21h
- exit:
- mov ah,4ch
- int 21h
- CODE ENDS
- end begin
Объяснение кода листинга программы
- Вводится символ, который необходимо удалить из файла.
- Открывается исходный файл для чтения (SrcFile).
- Сохраняется дескриптор (handle) файла в переменной SrcHandle.
- Открывается целевой файл для записи (DstFile).
- Сохраняется дескриптор (handle) файла в переменной DstHandle.
- Начинается цикл чтения из исходного файла, пока не достигнут конец файла.
- В каждой итерации цикла считывается количество реально прочитанных байт.
- Если количество байт не равно нулю, то начинается цикл удаления заданных символов из строки.
- Цикл удаления символов продолжается до тех пор, пока не будет достигнут конец строки.
- Записывается обработанный буфер в целевой файл.
- Если количество байт в последней порции меньше, чем в предыдущей, то выполняется переход к следующей итерации цикла чтения.
- Закрываются исходный и целевой файлы.
- Выполняется выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д