Поиск и замена заданной последовательности символов в заданном файле - Assembler

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

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

Программа должна выполнять поиск заданной последовательности символов в заданном файле, менять ее на другую заданную последовательность (того же размера) и измененный текст вводить в другой файл. Моя программа работает только для небольших файлов, так как считывает буфером только один раз и ищет в нем. Необходимо чтобы программа работала и для больших файлов, то есть считывала текст в цикле. Ни как не получается добавить цикл, прошу помогите!
Листинг программы
  1. code_seg segment
  2. assume cs:code_seg, ds:code_seg
  3. .386
  4. org 100h
  5. start:
  6. FileNamePrint:
  7. mov ah,09h
  8. mov dx,offset msg1
  9. int 21h
  10. mov AH, 0Ah
  11. mov DX, offset FileName
  12. int 21h
  13. xor BH, BH
  14. mov BL, FileName[1]
  15. mov FileName[BX+2], 0
  16. lea dx, ent ;Перенос каретки
  17. mov ah, 9
  18. int 21h
  19. OpenFile:
  20. mov ax, 3D02h
  21. mov dx, offset filename + 2
  22. int 21h
  23. jc OpenError
  24. mov handle, ax
  25. mov ah,09h
  26. mov dx,offset msg4
  27. int 21h
  28. lea dx, ent ;Перенос каретки
  29. mov ah, 9
  30. int 21h
  31. InputOne: ;Ввод первой строки
  32. mov ah,09h
  33. mov dx, offset msg2
  34. int 21h
  35. mov ah,0ah
  36. mov dx, offset string
  37. int 21h
  38. lea dx, ent ;Перенос каретки
  39. mov ah, 9
  40. int 21h
  41. InputTwo: ; строка на которую заменять
  42. mov ah,09h
  43. mov dx, offset msg3
  44. int 21h
  45. mov ah,0ah
  46. mov dx, offset newstr
  47. int 21h
  48. lea dx, ent ;Перенос каретки
  49. mov ah, 9
  50. int 21h
  51.  
  52. ReadFromFile:
  53. mov ah,3fh
  54. lea dx,buffer
  55. mov bx,handle
  56. mov cx,60000
  57. int 21h
  58. jc Error_Read
  59. lea di,buffer
  60. Inspection: ;сравнение строк
  61. mov cx,60000
  62. mov al,string + 2
  63. repne scasb ;Сравнить байт по адресу ES:(E)DI с AL(пока !=)
  64. je Found ;Условие перехода:ZF=1
  65. jmp Failed
  66. Found: ;замена подстроки если нашлось
  67. push ax
  68. mov al, string + 1
  69. dec di
  70. lea si,string + 2
  71. mov cx, ax
  72. repe cmpsb
  73. pushf ; значения флагов в стек
  74. dec di
  75. popf
  76. jne Inspection
  77. mov cx, ax
  78. sub di,cx
  79. inc di
  80. lea si,newstr + 2
  81. rep movsb ;Переслать байт из строки в строку
  82. pop ax
  83.  
  84. FileName2Print:
  85. mov ah,09h
  86. mov dx,offset msg7
  87. int 21h
  88. mov AH, 0Ah
  89. mov DX, offset FileName2
  90. int 21h
  91. xor BH, BH
  92. mov BL, FileName2[1]
  93. mov FileName2[BX+2], 0
  94. lea dx, ent ;Перенос каретки
  95. mov ah, 9
  96. int 21h
  97. OpenFile2:
  98.  
  99. mov ax, 3D02h
  100. mov dx, offset filename2 + 2
  101. int 21h
  102. jc OpenError
  103. mov handle2, ax
  104. mov ah,09h
  105. mov dx,offset msg4
  106. int 21h
  107. lea dx, ent ;Перенос каретки
  108. mov ah, 9
  109. int 21h
  110. File2Pointer:
  111. ; DOS Fn 42H: установить указатель файла -- LSEEK.
  112. ; output: AX = код ошибки если CF установлен.
  113. ; DX:AX = новая позиция указателя файла.
  114. mov cx,0
  115. mov dx,0 ; CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX
  116. mov bx,handle2 ; BX = описатель файла.
  117. mov ax,4200h ; AL = 0 переместить к началу файла + CX:DX.
  118. int 21h
  119. WriteToFile2:
  120. mov ah,40h
  121. lea dx,buffer
  122. mov bx,handle2
  123. mov cx, 60000
  124. int 21h
  125. jmp CloseFile2
  126. ;------------------Errors--------------------;
  127. OpenError:
  128. mov ah,09h
  129. lea dx,error_msg1
  130. int 21h
  131. jmp Exit
  132. Failed:
  133. mov ah,09h
  134. lea dx,msg5
  135. int 21h
  136. jmp CloseFile
  137. Error_Read:
  138. mov ah,09h
  139. lea dx,error_msg2
  140. int 21h
  141. jmp CloseFile
  142. CloseFile:
  143. mov ah,3Eh
  144. mov bx,handle
  145. int 21h
  146. CloseFile2:
  147. mov ah,3Eh
  148. mov bx,handle2
  149. int 21h
  150. Exit:
  151. mov ah, 1
  152. int 21h
  153. mov ax,4c00h
  154. int 21h
  155. ;------------------Data---------------------;
  156. FileName DB 14,0,14 dup (0)
  157. FileName2 DB 14,0,14 dup (0)
  158. msg1 db 'Enter FileName $'
  159. msg2 db 'Enter word you want to replace: $'
  160. msg3 db 'Enter second word: $'
  161. msg4 db 'File was open.$'
  162. msg5 db 'Not found$'
  163. msg7 db 'Enter FileName to write $'
  164. ;msg db 'Word found$'
  165. error_msg1 db 'File wasnt open.$'
  166. error_msg2 db 'Cant read from file.$'
  167. buffer db 60010 dup (?)
  168. string db 200 dup ('$')
  169. newstr db 200 dup ('$')
  170. strlen db ?
  171. handle dw 0
  172. handle2 dw 0
  173. ent db 10, 13, '$'
  174. ret
  175. code_seg ends
  176. end start
Вот так пытался сделать цикл: ===================================================
Листинг программы
  1. code_seg segment
  2. assume cs:code_seg, ds:code_seg
  3. .386
  4. org 100h
  5. start:
  6. FileNamePrint:
  7. mov ah,09h
  8. mov dx,offset msg1
  9. int 21h
  10. mov AH, 0Ah
  11. mov DX, offset FileName
  12. int 21h
  13. xor BH, BH
  14. mov BL, FileName[1]
  15. mov FileName[BX+2], 0
  16. lea dx, ent ;Перенос каретки
  17. mov ah, 9
  18. int 21h
  19. OpenFile:
  20. mov ax, 3D02h
  21. mov dx, offset filename + 2
  22. int 21h
  23. jc OpenError
  24. mov handle, ax
  25. mov ah,09h
  26. mov dx,offset msg4
  27. int 21h
  28. lea dx, ent ;Перенос каретки
  29. mov ah, 9
  30. int 21h
  31. InputOne:
  32. mov ah,09h
  33. mov dx, offset msg2
  34. int 21h
  35. mov ah,0ah
  36. mov dx, offset string
  37. int 21h
  38. lea dx, ent ;Перенос каретки
  39. mov ah, 9
  40. int 21h
  41. InputTwo:
  42. mov ah,09h
  43. mov dx, offset msg3
  44. int 21h
  45. mov ah,0ah
  46. mov dx, offset newstr
  47. int 21h
  48. lea dx, ent ;Перенос каретки
  49. mov ah, 9
  50. int 21h
  51. FileName2Print:
  52. mov ah,09h
  53. mov dx,offset msg7
  54. int 21h
  55. mov AH, 0Ah
  56. mov DX, offset FileName2
  57. int 21h
  58. xor BH, BH
  59. mov BL, FileName2[1]
  60. mov FileName2[BX+2], 0
  61. lea dx, ent ;Перенос каретки
  62. mov ah, 9
  63. int 21h
  64. OpenFile2:
  65.  
  66. mov ax, 3D02h
  67. mov dx, offset filename2 + 2
  68. int 21h
  69. jc OpenError
  70. mov handle2, ax
  71. mov ah,09h
  72. mov dx,offset msg4
  73. int 21h
  74. lea dx, ent ;Перенос каретки
  75. mov ah, 9
  76. int 21h
  77. File2Pointer:
  78. mov cx,0
  79. mov dx,0 ; CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX
  80. mov bx,handle2 ; BX = описатель файла.
  81. mov ax,4200h ; AL = 0 переместить к началу файла + CX:DX.
  82. int 21h
  83. FilePointer:
  84. mov cx,0
  85. mov dx,0 ; CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX
  86. mov bx,handle ; BX = описатель файла.
  87. mov ax,4200h ; AL = 0 переместить к началу файла + CX:DX.
  88. int 21h
  89. metka:
  90. mov ah,09h
  91. mov dx,offset msg10
  92. int 21h
  93. ReadFromFile:
  94. mov ah,3fh
  95. lea dx,buffer
  96. mov bx,handle
  97. mov cx,10
  98. int 21h
  99. jc Error_Read
  100. push ax
  101.  
  102. lea di,buffer
  103.  
  104. Inspection:
  105. mov cx,10
  106. mov al,string + 2
  107. repne scasb ;Сравнить байт по адресу ES:(E)DI с AL(пока !=)
  108. je Found ;Условие перехода:ZF=1
  109. jmp WriteToFile2
  110. Found:
  111. mov ah,09h
  112. mov dx,offset msg11
  113. int 21h
  114.  
  115. mov al, string + 1
  116. dec di
  117. lea si,string + 2
  118. mov cx, ax
  119. repe cmpsb
  120. pushf ; значения флагов в стек
  121. dec di
  122. popf
  123. jne Inspection
  124. mov cx, ax
  125. sub di,cx
  126. inc di
  127. lea si,newstr + 2
  128. rep movsb ;Переслать байт из строки в строку
  129.  
  130. WriteToFile2:
  131. mov ah,40h
  132. lea dx,buffer
  133. mov bx,handle2
  134. mov cx, 10
  135. int 21h
  136. mov ah,09h
  137. mov dx,offset msg13
  138. int 21h
  139.  
  140. Looper:
  141. ;mov cx, 1
  142. pop ax
  143. cmp ax, 0
  144. jne metka
  145. ;loop metka
  146. mov ah,09h
  147. mov dx,offset msg12
  148. int 21h
  149. jmp CloseFile2
  150. ;------------------Errors--------------------;
  151. OpenError:
  152. mov ah,09h
  153. lea dx,error_msg1
  154. int 21h
  155. jmp Exit
  156. Failed:
  157. mov ah,09h
  158. lea dx,msg5
  159. int 21h
  160. jmp CloseFile
  161. Error_Read:
  162. mov ah,09h
  163. lea dx,error_msg2
  164. int 21h
  165. jmp CloseFile
  166. CloseFile:
  167. mov ah,3Eh
  168. mov bx,handle
  169. int 21h
  170. jmp Exit
  171. CloseFile2:
  172. mov ah,3Eh
  173. mov bx,handle2
  174. int 21h
  175. jmp CloseFile
  176. Exit:
  177. mov ah, 1
  178. int 21h
  179. mov ax,4c00h
  180. int 21h
  181. ;------------------Data---------------------;
  182. FileName DB 14,0,14 dup (0)
  183. FileName2 DB 14,0,14 dup (0)
  184. msg1 db 'Enter FileName $'
  185. msg2 db 'Enter word you want to replace: $'
  186. msg3 db 'Enter second word: $'
  187. msg4 db 'File was open.$'
  188. msg5 db 'Not found$'
  189. msg7 db 'Enter FileName to write $'
  190. ;msg db 'Word found$'
  191. msg10 db ' cycle $'
  192. msg11 db ' found $'
  193. msg12 db ' vyhod $'
  194. msg13 db ' write $'
  195. error_msg1 db 'File wasnt open.$'
  196. error_msg2 db 'Cant read from file.$'
  197. buffer db 11 dup (?)
  198. string db 200 dup ('$')
  199. newstr db 200 dup ('$')
  200. strlen db ?
  201. handle dw 0
  202. handle2 dw 0
  203. ent db 10, 13, '$'
  204. ret
  205. code_seg ends
  206. end start

Решение задачи: «Поиск и замена заданной последовательности символов в заданном файле»

textual
Листинг программы
  1. call getchar
  2. jc EndOfFile
  3. . . .
  4. getchar proc
  5.   . . .
  6.   clc  ; сбросить флаг CF
  7.   ret
  8.   . . .
  9.   stc  ; установить флаг CF
  10.   ret
  11. getchar endp

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


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

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

6   голосов , оценка 3.333 из 5

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

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

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