Найти и удалить символ из файла, введенный с клавиатуры - 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

Объяснение кода листинга программы

  1. Вводится символ, который необходимо удалить из файла.
  2. Открывается исходный файл для чтения (SrcFile).
  3. Сохраняется дескриптор (handle) файла в переменной SrcHandle.
  4. Открывается целевой файл для записи (DstFile).
  5. Сохраняется дескриптор (handle) файла в переменной DstHandle.
  6. Начинается цикл чтения из исходного файла, пока не достигнут конец файла.
  7. В каждой итерации цикла считывается количество реально прочитанных байт.
  8. Если количество байт не равно нулю, то начинается цикл удаления заданных символов из строки.
  9. Цикл удаления символов продолжается до тех пор, пока не будет достигнут конец строки.
  10. Записывается обработанный буфер в целевой файл.
  11. Если количество байт в последней порции меньше, чем в предыдущей, то выполняется переход к следующей итерации цикла чтения.
  12. Закрываются исходный и целевой файлы.
  13. Выполняется выход из программы.

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


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

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

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