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

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

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

Я пока сделала запись из исходного файла в память(но мне кажется,что есть ошибки,не могли бы вы проверить пожалуйста,а то у самой пока возможности нет),если все верно то продолжу делать уже из памяти в новый файл Спасибо за внимание
.386
dseg segment use16 
roadwas db 'h:\assembler8\read.txt',0             ; путь к первоначальному файлу 
text db 49 dup (?),'$'                            ; массив для записи символов из файла в память
mytext db 18 dup (?),0Dh,0Ah,'$'                  ; массив для записи строк из трех символов
kom2 db 0Dh,0Ah,'$'
prigl db 0Dh,0Ah,'Pokskazhite dorohy k failu:',0Dh,0Ah,'$'
vv1 db 50,51 dup (?);Для пути к файлу
str1  dw ?                                        ;счет символов
kom3 db 0Dh,0Ah,'*******Oshibka otkritiya*****','$'

dseg ends
cseg segment use16
assume cs:cseg, ds:dseg
       s5: 
;открытие файла
       mov dx,dseg
           mov ds,dx
           mov ah,9
        lea dx,prigl ;приглошение на ввод пути к файлу
        int 21h
        mov ah,0Ah
        lea dx,vv1; ввод пути файла
        int 21h
        mov ah,9
        lea dx,kom2
        int 21h 
        movzx bp, byte ptr  ds:vv1+1
        lea si,vv1
        mov byte ptr ds:[si+2+bp],0
        mov al,2
        mov ah,3Dh
        lea dx,ds:vv1+2
    mov si,0
       int 21h
       jc short error                         ; ошибка создания файла (CF=1)
       mov ah,3Dh
       mov bx,ax                              ;логич. номер файла в bx
           lea dx,ds:text[si]                            ;арес размещения байт
           mov cx,1                               ;количество считываемых байт
;считывание из файла
       r1: mov ah,3Fh                             ;функция чтения
           int 21h      
       c2: cmp ax,0                               ;проверка на конец файла
           je finish1                             ; если конец, то переход на закрытие файла   
           cmp ds:text,0Ah                        ;текущий символ равен 0a?
       jne short d1                           ;если нет, то читаем дальше
           inc si
       inc byte ptr ds:str1
           jmp short r1
 
       d1: cmp ds:str1,5
       jne short q1
       mov bp,-5
       c1: mov bl,ds:text[si+bp]
       lea di,ds:mytext
       mov ds:[di],bl
       inc di
       inc bp
       cmp bp,o
       jne short c1
       q1: inc si
       mov ds:str1,0
           jmp short c2

    error: mov ah,9
           lea dx,kom3
           int 21h
           jmp short n5
 
 finish1:    mov ah,4ch
              int 21h

       n5:    mov ah,4ch
              int 21h

           mov ah,4ch
      int 21h
 cseg ends
 end s5
а вот,то что у меня в исходном файле 123 ascxwqsa 1wasd kkk saks asssas safn ghj 888 k8j hshasj hsz
я здесь сначала все из файла в память переписываю,а затем только строчки ,в которых три символа(ну стараюсь выполнить то ,что я написала=))
я вот здесь исправила некоторые ошибки,но не понимаю,почему у меня из файла в память все в один байт записывается=(
.386
dseg segment use16 
text db 85 dup (?),'$'                            ; массив для записи символов из файла в память
mytext db 30 dup (?),0Dh,0Ah,'$'                  ; массив для записи строк из трех символов
kom2 db 0Dh,0Ah,'$'
prigl db 0Dh,0Ah,'Pokskazhite dorohy k failu:',0Dh,0Ah,'$'
vv1 db 50,51 dup (?);Для пути к файлу
str1  dw ?                                        ;счет символов
kom3 db 0Dh,0Ah,'*******Oshibka otkritiya*****','$'

dseg ends
cseg segment use16
assume cs:cseg, ds:dseg
       s5: 
;открытие файла
       mov dx,dseg
           mov ds,dx
           mov ah,9
        lea dx,prigl ;приглошение на ввод пути к файлу
        int 21h
        mov ah,0Ah
        lea dx,vv1; ввод пути файла
        int 21h
        mov ah,9
        lea dx,kom2
        int 21h 
        movzx bp, byte ptr  ds:vv1+1
        lea si,vv1
        mov byte ptr ds:[si+2+bp],0
        mov al,2
        mov ah,3Dh
        lea dx,ds:vv1+2
    mov si,0
       int 21h
       jc short error                         ; ошибка создания файла (CF=1)
       mov bx,ax                              ;логич. номер файла в bx
           lea dx,ds:text[si]                            ;арес размещения байт
           mov cx,1                               ;количество считываемых байт
;считывание из файла
       r1: mov ah,3Fh                             ;функция чтения
           int 21h      
       c2: cmp ax,0                               ;проверка на конец файла
           je finish1                             ; если конец, то переход на закрытие файла   
           cmp ds:text,0Ah                        ;текущий символ равен 0a?
       je short d1                           ;если нет, то читаем дальше
           inc si
       inc byte ptr ds:str1
           jmp short r1
 
       d1: cmp ds:str1,5
       jne short q1
       mov bp,-5
       c1: mov bl,ds:text[si+bp]
       lea di,ds:mytext
       mov ds:[di],bl
       inc di
       inc bp
       cmp bp,0
       jne short c1
       q1: inc si
       mov ds:str1,0
           jmp short r1

    error: mov ah,9
           lea dx,kom3
           int 21h
           jmp short n5
 
    finish1:mov ah,4ch
              int 21h
 
       n5:    mov ah,4ch
              int 21h

           mov ah,4ch
      int 21h
 cseg ends
 end s5
еще нашла пару ошибок , но он не как не хочет прыгать на d1 не пойму почему
.386
dseg segment use16 
text db 85 dup (?),'$'                            ; массив для записи символов из файла в память
mytext db 30 dup (?),0Dh,0Ah,'$'                  ; массив для записи строк из трех символов
kom2 db 0Dh,0Ah,'$'
prigl db 0Dh,0Ah,'Pokskazhite dorohy k failu:',0Dh,0Ah,'$'
vv1 db 50,51 dup (?);Для пути к файлу
str1  dw ?                                        ;счет символов
kom3 db 0Dh,0Ah,'*******Oshibka otkritiya*****','$'

dseg ends
cseg segment use16
assume cs:cseg, ds:dseg
       s5: 
;открытие файла
       mov dx,dseg
           mov ds,dx
           mov ah,9
        lea dx,prigl ;приглошение на ввод пути к файлу
        int 21h
        mov ah,0Ah
        lea dx,vv1; ввод пути файла
        int 21h
        mov ah,9
        lea dx,kom2
        int 21h 
        movzx bp, byte ptr  ds:vv1+1
        lea si,vv1
        mov byte ptr ds:[si+2+bp],0
        mov al,2
        mov ah,3Dh
        lea dx,ds:vv1+2
    mov si,0
       int 21h
       jc short error                         ; ошибка создания файла (CF=1)
       mov bx,ax                              ;логич. номер файла в bx
           mov cx,1                               ;количество считываемых байт
       r1: lea dx,ds:text[si]                            ;арес размещения байт
           
;считывание из файла
        mov ah,3Fh                             ;функция чтения
           int 21h      
       c2: cmp ax,0                               ;проверка на конец файла
           je finish1                             ; если конец, то переход на закрытие файла   
           cmp byte ptr ds:text[si],0Ah                        ;текущий символ равен 0a?
       je short d1                           ;если нет, то читаем дальше
           inc si
       inc byte ptr ds:str1
           jmp short r1
 
       d1: cmp ds:str1,5
       jne short q1
       mov bp,-5
       c1: mov bl,ds:text[si+bp]
       lea di,ds:mytext
       mov ds:[di],bl
       inc di
       inc bp
       cmp bp,0
       jne short c1
       q1: inc si
       mov ds:str1,0
           jmp short r1

    error: mov ah,9
           lea dx,kom3
           int 21h
           jmp short n5
 
    finish1:mov ah,4ch
              int 21h
 
       n5:    mov ah,4ch
              int 21h

           mov ah,4ch
      int 21h
 cseg ends
 end s5

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

textual
Листинг программы
.386
stk     segment para    stack
        db      1024 dup(?)
stk     ends
 
dseg    segment use16
        FileSrc db      'Source.txt', 0
        FileDst db      'Destin.txt', 0
 
        SrcHndl dw      ?
        DstHndl dw      ?
 
        text    db      1 dup (?),'$' ; массив для записи символов из файла в память
        kom2    db      0Dh,0Ah,'$'
        kom3    db      0Dh,0Ah,'*******Oshibka otkritiya*****','$'
 
        StrLen  dw      ?
 
dseg ends
 
cseg    segment use16
        assume  cs:cseg, ds:dseg
start:
        mov dx,dseg
        mov ds,dx
 
        ;открытие файла источника
        mov ah,3Dh
        mov al,2        ;режим открытия: чтение и запись
        lea dx,FileSrc
        int 21h
        jnc SrcOpenOk
        jmp error ; ошибка создания файла (CF=1)
SrcOpenOk:
        mov SrcHndl,ax ;логич. номер файла
 
        ;открытие файла результата
        mov ah,3Ch
        mov cx,0
        lea dx,FileDst
        int 21h
        jnc DstOpenOk
        jmp error ; ошибка создания файла (CF=1)
DstOpenOk:
        mov DstHndl,ax ;логич. номер файла в bx
 
NewString:
        mov StrLen, word ptr 0
 
ReadByte:
        ;считывание из файла
        mov ah,3Fh ;функция чтения
        mov cx,1 ;количество считываемых байт
        lea dx,ds:text ;адрес размещения байт
        mov bx, SrcHndl
        int 21h
        cmp ax,0
        je SrcEOF
        ;увеличиваем на 1 длину строки
        inc word ptr ds:StrLen
        ;проверяем считанный символ на признак конца строки
        cmp byte ptr ds:text,0Ah
        je short TestString
        jmp short ReadByte
 
TestString:
        cmp ds:StrLen,5
        jne short NewString
        ;переместить указатель на 5 позиций назад
        mov ah,42h
        mov cx,0ffffh
        mov dx,-5
        mov bx,SrcHndl
        int 21h
 
        mov cx,5
CopyString:
        push cx
        ;считываем байт
        mov ah,3Fh
        mov cx,1
        mov bx,SrcHndl
        lea dx,ds:text
        int 21h
        ;записываем байт
        mov ah,40h
        mov bx,DstHndl
        lea dx,ds:text
        mov cx,1
        int 21h
        pop cx
        loop CopyString
 
        jmp NewString
 
error:
        mov ah,9
        lea dx,kom3
        int 21h
        jmp short @exit
 
 
SrcEOF:
        ;закрытие файла
        mov ah,3Eh
        mov bx,SrcHndl
        int 21h
        ;закрытие файла
        mov ah,3Eh
        mov bx,DstHndl
        int 21h
 
@exit:
        mov ah,4ch
        int 21h
cseg    ends
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
Похожие ответы