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