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