Найти и удалить символ из файла, введенный с клавиатуры - Assembler

Узнай цену своей работы

Формулировка задачи:

Необходимо найти и удалить символ из файла, введенный с клавиатуры. Помогите пожалуйста)
Листинг программы
  1. DATA SEGMENT
  2. path db "myfile.txt",0
  3. buf db ?
  4. DATA ENDS
  5. SSEG SEGMENT STACK
  6. db 200 dup(?)
  7. SSEG ENDS
  8. CODE SEGMENT
  9. ASSUME CS:CODE, DS:DATA, SS:SSEG
  10. begin:
  11. mov ax,DATA
  12. mov DS,ax
  13. ;îòêðûâГ*ГҐГ¬ ГґГ*éë
  14. mov ax,3d00h
  15. lea dx,path
  16. int 21h
  17. jc exit
  18. mov bx,ax
  19. xor cx,cx
  20. xor dx,dx
  21. mov ax,4200h
  22. int 21h
  23. out_str:
  24. mov ah,3fh
  25. mov cx,1
  26. lea dx,buf
  27. int 21h
  28. cmp ax,cx
  29. jnz close
  30. mov dl,buf
  31. mov ah,2
  32. int 21h
  33. jmp out_str
  34. close:
  35. mov ah,3eh
  36. int 21h
  37. exit:
  38. mov ah,4ch
  39. int 21h
  40. CODE ENDS
  41. end begin

Решение задачи: «Найти и удалить символ из файла, введенный с клавиатуры»

textual
Листинг программы
  1. DATA SEGMENT
  2.  SrcFile        db "myfile.txt",0
  3.  DstFile        db "Result.txt",0
  4.  SrcHandle      dw ?
  5.  DstHandle      dw ?
  6.  BufSize        equ 128
  7.  Buffer         db BufSize dup(?)
  8.  BufLen         dw ?            ;реальная длина буфера после обработки
  9.  DelChar        db 'X'          ;удаляемый символ
  10.  msgGetChar db 'Enter char: ', '$'
  11. DATA ENDS
  12.  
  13. SSEG SEGMENT STACK
  14.       db 100h dup(?)
  15. SSEG ENDS
  16.  
  17. CODE SEGMENT
  18.  ASSUME CS:CODE, DS:DATA, SS:SSEG
  19.   begin:
  20.     mov ax,DATA
  21.     mov DS,ax
  22.  
  23.     ;ввод удаляемого символа с клавиатуры
  24.     mov ah, 09h
  25.     lea dx, msgGetChar
  26.     int 21h
  27.     mov ah, 01h
  28.     int 21h
  29.     mov DelChar, al
  30.  
  31.     ;открываем файл для чтения (al=00)
  32.     mov ax, 3d00h
  33.     lea dx, SrcFile
  34.     int 21h
  35.     jnc SaveSrcHandle
  36.     jmp exit            ;выход при ошибке
  37. SaveSrcHandle:
  38.     mov SrcHandle, ax   ;сохраняем описатель (хэндл) файла
  39.  
  40.     ;открываем файл для записи
  41.     mov ah,3Ch
  42.     lea dx,DstFile
  43.     mov cx,0
  44.     int 21h
  45.     jnc SaveDstHandle
  46.     jmp CloseSrc        ;выход при ошибке
  47. SaveDstHandle:
  48.     mov DstHandle, ax   ;сохраняем описатель (хэндл) файла
  49.  
  50. ReadBuf:
  51.     mov ah, 3Fh
  52.     mov bx, SrcHandle
  53.     lea dx, Buffer
  54.     mov cx, BufSize
  55.     int 21h
  56.     jnc ProcessBuffer
  57.     jmp CloseDst        ;выход при ошибке
  58. ProcessBuffer:
  59.     ;если нет ошибки чтения, то нужно анализировать
  60.     ;содержимое ax (количество реально считанных байт)
  61.     cmp ax, 0   ;достигнут EOF
  62.     je  Break
  63.     ;если ax не равен 0, то в ax количество реально считанных байт
  64.  
  65.     push ax
  66.     push cx
  67.  
  68.     mov BufLen, ax
  69.  
  70.     ;удаление заданных символов из строки
  71.     push    ds
  72.     pop     es
  73.     mov     cx,     BufLen
  74.     lea     di,     Buffer
  75.     mov     si,     di
  76.     mov     bx,     0           ;новая длтна буфера после обработки
  77.     cld
  78.     jcxz    @BreakWhile
  79. @While:
  80.     lodsb
  81.     cmp     al,     DelChar
  82.     je      @Continue
  83.     stosb
  84.     inc     bx
  85. @Continue:
  86.     loop    @While
  87. @BreakWhile:
  88.     mov     BufLen, bx
  89.  
  90.     ;запись обработанного буфера в файл
  91.     mov cx, BufLen
  92.     jcxz SkipSave
  93.     mov ah, 40h
  94.     mov bx, DstHandle
  95.     lea dx, Buffer
  96.     mov cx, cx
  97.     int 21h
  98. SkipSave:
  99.  
  100.     pop cx
  101.     pop ax
  102.     cmp ax, cx  ;если это была последняя (неполная) порция считанных данных
  103.     jne Break
  104.  
  105.     jmp ReadBuf
  106. Break:
  107.  
  108. CloseDst:
  109.     mov ah,3eh
  110.     mov bx,DstHandle
  111.     int 21h
  112. CloseSrc:
  113.     mov ah,3eh
  114.     mov bx,SrcHandle
  115.     int 21h
  116. exit:
  117.     mov ah,4ch
  118.     int 21h
  119. CODE ENDS
  120.   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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы