В файле найти строки длиной 3 символа, записать их в новый файл (путь к файлу вводить вручную) - Assembler

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

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

Я пока сделала запись из исходного файла в память(но мне кажется,что есть ошибки,не могли бы вы проверить пожалуйста,а то у самой пока возможности нет),если все верно то продолжу делать уже из памяти в новый файл Спасибо за внимание
Листинг программы
  1. .386
  2. dseg segment use16
  3. roadwas db 'h:\assembler8\read.txt',0 ; путь к первоначальному файлу
  4. text db 49 dup (?),'$' ; массив для записи символов из файла в память
  5. mytext db 18 dup (?),0Dh,0Ah,'$' ; массив для записи строк из трех символов
  6. kom2 db 0Dh,0Ah,'$'
  7. prigl db 0Dh,0Ah,'Pokskazhite dorohy k failu:',0Dh,0Ah,'$'
  8. vv1 db 50,51 dup (?);Для пути к файлу
  9. str1 dw ? ;счет символов
  10. kom3 db 0Dh,0Ah,'*******Oshibka otkritiya*****','$'
  11.  
  12. dseg ends
  13. cseg segment use16
  14. assume cs:cseg, ds:dseg
  15. s5:
  16. ;открытие файла
  17. mov dx,dseg
  18. mov ds,dx
  19. mov ah,9
  20. lea dx,prigl ;приглошение на ввод пути к файлу
  21. int 21h
  22. mov ah,0Ah
  23. lea dx,vv1; ввод пути файла
  24. int 21h
  25. mov ah,9
  26. lea dx,kom2
  27. int 21h
  28. movzx bp, byte ptr ds:vv1+1
  29. lea si,vv1
  30. mov byte ptr ds:[si+2+bp],0
  31. mov al,2
  32. mov ah,3Dh
  33. lea dx,ds:vv1+2
  34. mov si,0
  35. int 21h
  36. jc short error ; ошибка создания файла (CF=1)
  37. mov ah,3Dh
  38. mov bx,ax ;логич. номер файла в bx
  39. lea dx,ds:text[si] ;арес размещения байт
  40. mov cx,1 ;количество считываемых байт
  41. ;считывание из файла
  42. r1: mov ah,3Fh ;функция чтения
  43. int 21h
  44. c2: cmp ax,0 ;проверка на конец файла
  45. je finish1 ; если конец, то переход на закрытие файла
  46. cmp ds:text,0Ah ;текущий символ равен 0a?
  47. jne short d1 ;если нет, то читаем дальше
  48. inc si
  49. inc byte ptr ds:str1
  50. jmp short r1
  51. d1: cmp ds:str1,5
  52. jne short q1
  53. mov bp,-5
  54. c1: mov bl,ds:text[si+bp]
  55. lea di,ds:mytext
  56. mov ds:[di],bl
  57. inc di
  58. inc bp
  59. cmp bp,o
  60. jne short c1
  61. q1: inc si
  62. mov ds:str1,0
  63. jmp short c2
  64.  
  65. error: mov ah,9
  66. lea dx,kom3
  67. int 21h
  68. jmp short n5
  69. finish1: mov ah,4ch
  70. int 21h
  71.  
  72. n5: mov ah,4ch
  73. int 21h
  74.  
  75. mov ah,4ch
  76. int 21h
  77. cseg ends
  78. end s5
а вот,то что у меня в исходном файле 123 ascxwqsa 1wasd kkk saks asssas safn ghj 888 k8j hshasj hsz
я здесь сначала все из файла в память переписываю,а затем только строчки ,в которых три символа(ну стараюсь выполнить то ,что я написала=))
я вот здесь исправила некоторые ошибки,но не понимаю,почему у меня из файла в память все в один байт записывается=(
Листинг программы
  1. .386
  2. dseg segment use16
  3. text db 85 dup (?),'$' ; массив для записи символов из файла в память
  4. mytext db 30 dup (?),0Dh,0Ah,'$' ; массив для записи строк из трех символов
  5. kom2 db 0Dh,0Ah,'$'
  6. prigl db 0Dh,0Ah,'Pokskazhite dorohy k failu:',0Dh,0Ah,'$'
  7. vv1 db 50,51 dup (?);Для пути к файлу
  8. str1 dw ? ;счет символов
  9. kom3 db 0Dh,0Ah,'*******Oshibka otkritiya*****','$'
  10.  
  11. dseg ends
  12. cseg segment use16
  13. assume cs:cseg, ds:dseg
  14. s5:
  15. ;открытие файла
  16. mov dx,dseg
  17. mov ds,dx
  18. mov ah,9
  19. lea dx,prigl ;приглошение на ввод пути к файлу
  20. int 21h
  21. mov ah,0Ah
  22. lea dx,vv1; ввод пути файла
  23. int 21h
  24. mov ah,9
  25. lea dx,kom2
  26. int 21h
  27. movzx bp, byte ptr ds:vv1+1
  28. lea si,vv1
  29. mov byte ptr ds:[si+2+bp],0
  30. mov al,2
  31. mov ah,3Dh
  32. lea dx,ds:vv1+2
  33. mov si,0
  34. int 21h
  35. jc short error ; ошибка создания файла (CF=1)
  36. mov bx,ax ;логич. номер файла в bx
  37. lea dx,ds:text[si] ;арес размещения байт
  38. mov cx,1 ;количество считываемых байт
  39. ;считывание из файла
  40. r1: mov ah,3Fh ;функция чтения
  41. int 21h
  42. c2: cmp ax,0 ;проверка на конец файла
  43. je finish1 ; если конец, то переход на закрытие файла
  44. cmp ds:text,0Ah ;текущий символ равен 0a?
  45. je short d1 ;если нет, то читаем дальше
  46. inc si
  47. inc byte ptr ds:str1
  48. jmp short r1
  49. d1: cmp ds:str1,5
  50. jne short q1
  51. mov bp,-5
  52. c1: mov bl,ds:text[si+bp]
  53. lea di,ds:mytext
  54. mov ds:[di],bl
  55. inc di
  56. inc bp
  57. cmp bp,0
  58. jne short c1
  59. q1: inc si
  60. mov ds:str1,0
  61. jmp short r1
  62.  
  63. error: mov ah,9
  64. lea dx,kom3
  65. int 21h
  66. jmp short n5
  67. finish1:mov ah,4ch
  68. int 21h
  69. n5: mov ah,4ch
  70. int 21h
  71.  
  72. mov ah,4ch
  73. int 21h
  74. cseg ends
  75. end s5
еще нашла пару ошибок , но он не как не хочет прыгать на d1 не пойму почему
Листинг программы
  1. .386
  2. dseg segment use16
  3. text db 85 dup (?),'$' ; массив для записи символов из файла в память
  4. mytext db 30 dup (?),0Dh,0Ah,'$' ; массив для записи строк из трех символов
  5. kom2 db 0Dh,0Ah,'$'
  6. prigl db 0Dh,0Ah,'Pokskazhite dorohy k failu:',0Dh,0Ah,'$'
  7. vv1 db 50,51 dup (?);Для пути к файлу
  8. str1 dw ? ;счет символов
  9. kom3 db 0Dh,0Ah,'*******Oshibka otkritiya*****','$'
  10.  
  11. dseg ends
  12. cseg segment use16
  13. assume cs:cseg, ds:dseg
  14. s5:
  15. ;открытие файла
  16. mov dx,dseg
  17. mov ds,dx
  18. mov ah,9
  19. lea dx,prigl ;приглошение на ввод пути к файлу
  20. int 21h
  21. mov ah,0Ah
  22. lea dx,vv1; ввод пути файла
  23. int 21h
  24. mov ah,9
  25. lea dx,kom2
  26. int 21h
  27. movzx bp, byte ptr ds:vv1+1
  28. lea si,vv1
  29. mov byte ptr ds:[si+2+bp],0
  30. mov al,2
  31. mov ah,3Dh
  32. lea dx,ds:vv1+2
  33. mov si,0
  34. int 21h
  35. jc short error ; ошибка создания файла (CF=1)
  36. mov bx,ax ;логич. номер файла в bx
  37. mov cx,1 ;количество считываемых байт
  38. r1: lea dx,ds:text[si] ;арес размещения байт
  39. ;считывание из файла
  40. mov ah,3Fh ;функция чтения
  41. int 21h
  42. c2: cmp ax,0 ;проверка на конец файла
  43. je finish1 ; если конец, то переход на закрытие файла
  44. cmp byte ptr ds:text[si],0Ah ;текущий символ равен 0a?
  45. je short d1 ;если нет, то читаем дальше
  46. inc si
  47. inc byte ptr ds:str1
  48. jmp short r1
  49. d1: cmp ds:str1,5
  50. jne short q1
  51. mov bp,-5
  52. c1: mov bl,ds:text[si+bp]
  53. lea di,ds:mytext
  54. mov ds:[di],bl
  55. inc di
  56. inc bp
  57. cmp bp,0
  58. jne short c1
  59. q1: inc si
  60. mov ds:str1,0
  61. jmp short r1
  62.  
  63. error: mov ah,9
  64. lea dx,kom3
  65. int 21h
  66. jmp short n5
  67. finish1:mov ah,4ch
  68. int 21h
  69. n5: mov ah,4ch
  70. int 21h
  71.  
  72. mov ah,4ch
  73. int 21h
  74. cseg ends
  75. end s5

Решение задачи: «В файле найти строки длиной 3 символа, записать их в новый файл (путь к файлу вводить вручную)»

textual
Листинг программы
  1. .386
  2. stk     segment para    stack
  3.         db      1024 dup(?)
  4. stk     ends
  5.  
  6. dseg    segment use16
  7.         FileSrc db      'Source.txt', 0
  8.         FileDst db      'Destin.txt', 0
  9.  
  10.         SrcHndl dw      ?
  11.         DstHndl dw      ?
  12.  
  13.         text    db      1 dup (?),'$' ; массив для записи символов из файла в память
  14.         kom2    db      0Dh,0Ah,'$'
  15.         kom3    db      0Dh,0Ah,'*******Oshibka otkritiya*****','$'
  16.  
  17.         StrLen  dw      ?
  18.  
  19. dseg ends
  20.  
  21. cseg    segment use16
  22.         assume  cs:cseg, ds:dseg
  23. start:
  24.         mov dx,dseg
  25.         mov ds,dx
  26.  
  27.         ;открытие файла источника
  28.         mov ah,3Dh
  29.         mov al,2        ;режим открытия: чтение и запись
  30.         lea dx,FileSrc
  31.         int 21h
  32.         jnc SrcOpenOk
  33.         jmp error ; ошибка создания файла (CF=1)
  34. SrcOpenOk:
  35.         mov SrcHndl,ax ;логич. номер файла
  36.  
  37.         ;открытие файла результата
  38.         mov ah,3Ch
  39.         mov cx,0
  40.         lea dx,FileDst
  41.         int 21h
  42.         jnc DstOpenOk
  43.         jmp error ; ошибка создания файла (CF=1)
  44. DstOpenOk:
  45.         mov DstHndl,ax ;логич. номер файла в bx
  46.  
  47. NewString:
  48.         mov StrLen, word ptr 0
  49.  
  50. ReadByte:
  51.         ;считывание из файла
  52.         mov ah,3Fh ;функция чтения
  53.         mov cx,1 ;количество считываемых байт
  54.         lea dx,ds:text ;адрес размещения байт
  55.         mov bx, SrcHndl
  56.         int 21h
  57.         cmp ax,0
  58.         je SrcEOF
  59.         ;увеличиваем на 1 длину строки
  60.         inc word ptr ds:StrLen
  61.         ;проверяем считанный символ на признак конца строки
  62.         cmp byte ptr ds:text,0Ah
  63.         je short TestString
  64.         jmp short ReadByte
  65.  
  66. TestString:
  67.         cmp ds:StrLen,5
  68.         jne short NewString
  69.         ;переместить указатель на 5 позиций назад
  70.         mov ah,42h
  71.         mov cx,0ffffh
  72.         mov dx,-5
  73.         mov bx,SrcHndl
  74.         int 21h
  75.  
  76.         mov cx,5
  77. CopyString:
  78.         push cx
  79.         ;считываем байт
  80.         mov ah,3Fh
  81.         mov cx,1
  82.         mov bx,SrcHndl
  83.         lea dx,ds:text
  84.         int 21h
  85.         ;записываем байт
  86.         mov ah,40h
  87.         mov bx,DstHndl
  88.         lea dx,ds:text
  89.         mov cx,1
  90.         int 21h
  91.         pop cx
  92.         loop CopyString
  93.  
  94.         jmp NewString
  95.  
  96. error:
  97.         mov ah,9
  98.         lea dx,kom3
  99.         int 21h
  100.         jmp short @exit
  101.  
  102.  
  103. SrcEOF:
  104.         ;закрытие файла
  105.         mov ah,3Eh
  106.         mov bx,SrcHndl
  107.         int 21h
  108.         ;закрытие файла
  109.         mov ah,3Eh
  110.         mov bx,DstHndl
  111.         int 21h
  112.  
  113. @exit:
  114.         mov ah,4ch
  115.         int 21h
  116. cseg    ends
  117. end     start

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

  1. Определение сегментов и переменных:
    • stk - определение сегмента стека
    • dseg - определение сегмента данных
    • FileSrc - переменная для хранения имени исходного файла Source.txt
    • FileDst - переменная для хранения имени файла результата Destin.txt
    • SrcHndl - переменная для хранения логического номера исходного файла
    • DstHndl - переменная для хранения логического номера файла результата
    • text - массив для записи символов из файла в память
    • kom2, kom3 - переменные с текстовыми сообщениями
    • StrLen - переменная для хранения длины строки
  2. Начало выполнения программы:
    • Установка сегмента данных в ds для доступа к переменным.
  3. Открытие файлов:
    • Открывается исходный файл Source.txt для чтения и записи.
    • Открывается файл результата Destin.txt для записи.
  4. Чтение файла:
    • Читается один байт из файла и сохраняется в массиве text.
    • Если считанный байт это конец файла, программа переходит к метке SrcEOF.
    • Иначе, увеличивается счетчик длины строки (StrLen), и проверяется, является ли считанный символ концом строки.
  5. Проверка строки:
    • Если длина строки равна 5, то программа копирует эту строку в файл результата.
    • После копирования, программа переходит к метке NewString.
  6. Копирование строки:
    • Считывается и записывается каждый байт строки в новый файл. Процесс повторяется для каждого символа в строке.
  7. Обработка ошибки:
    • Если произошла ошибка при открытии файла, выводится соответствующее сообщение.
  8. Закрытие файлов и завершение программы:
    • Закрываются открытые файлы.
    • Программа завершает свою работу.

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


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

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

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

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

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

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