В файле найти строки длиной 3 символа, записать их в новый файл (путь к файлу вводить вручную) - Assembler
Формулировка задачи:
Я пока сделала запись из исходного файла в память(но мне кажется,что есть ошибки,не могли бы вы проверить пожалуйста,а то у самой пока возможности нет),если все верно то продолжу делать уже из памяти в новый файл
Спасибо за внимание
а вот,то что у меня в исходном файле
123
ascxwqsa
1wasd
kkk
saks
asssas
safn
ghj
888
k8j
hshasj
hsz
Листинг программы
- .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
я здесь сначала все из файла в память переписываю,а затем только строчки ,в которых три символа(ну стараюсь выполнить то ,что я написала=))
я вот здесь исправила некоторые ошибки,но не понимаю,почему у меня из файла в память все в один байт записывается=(
Листинг программы
- .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
Объяснение кода листинга программы
- Определение сегментов и переменных:
stk
- определение сегмента стекаdseg
- определение сегмента данныхFileSrc
- переменная для хранения имени исходного файлаSource.txt
FileDst
- переменная для хранения имени файла результатаDestin.txt
SrcHndl
- переменная для хранения логического номера исходного файлаDstHndl
- переменная для хранения логического номера файла результатаtext
- массив для записи символов из файла в памятьkom2
,kom3
- переменные с текстовыми сообщениямиStrLen
- переменная для хранения длины строки
- Начало выполнения программы:
- Установка сегмента данных в
ds
для доступа к переменным.
- Установка сегмента данных в
- Открытие файлов:
- Открывается исходный файл
Source.txt
для чтения и записи. - Открывается файл результата
Destin.txt
для записи.
- Открывается исходный файл
- Чтение файла:
- Читается один байт из файла и сохраняется в массиве
text
. - Если считанный байт это конец файла, программа переходит к метке
SrcEOF
. - Иначе, увеличивается счетчик длины строки (
StrLen
), и проверяется, является ли считанный символ концом строки.
- Читается один байт из файла и сохраняется в массиве
- Проверка строки:
- Если длина строки равна 5, то программа копирует эту строку в файл результата.
- После копирования, программа переходит к метке
NewString
.
- Копирование строки:
- Считывается и записывается каждый байт строки в новый файл. Процесс повторяется для каждого символа в строке.
- Обработка ошибки:
- Если произошла ошибка при открытии файла, выводится соответствующее сообщение.
- Закрытие файлов и завершение программы:
- Закрываются открытые файлы.
- Программа завершает свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д