В файле найти строки длиной 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 Добавлено через 9 минут я здесь сначала все из файла в память переписываю,а затем только строчки ,в которых три символа(ну стараюсь выполнить то ,что я написала=)) Добавлено через 1 час 53 минуты я вот здесь исправила некоторые ошибки,но не понимаю,почему у меня из файла в память все в один байт записывается=(
.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
Добавлено через 29 минут еще нашла пару ошибок , но он не как не хочет прыгать на 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 символа, записать их в новый файл (путь к файлу вводить вручную) - Assembler»

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

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


СОХРАНИТЬ ССЫЛКУ