В файле найти строки длиной 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
.
- Копирование строки:
- Считывается и записывается каждый байт строки в новый файл. Процесс повторяется для каждого символа в строке.
- Обработка ошибки:
- Если произошла ошибка при открытии файла, выводится соответствующее сообщение.
- Закрытие файлов и завершение программы:
- Закрываются открытые файлы.
- Программа завершает свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д