В файле найти строки длиной 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.txtFileDst- переменная для хранения имени файла результатаDestin.txtSrcHndl- переменная для хранения логического номера исходного файлаDstHndl- переменная для хранения логического номера файла результатаtext- массив для записи символов из файла в памятьkom2,kom3- переменные с текстовыми сообщениямиStrLen- переменная для хранения длины строки
- Начало выполнения программы:
- Установка сегмента данных в
dsдля доступа к переменным.
- Установка сегмента данных в
- Открытие файлов:
- Открывается исходный файл
Source.txtдля чтения и записи. - Открывается файл результата
Destin.txtдля записи.
- Открывается исходный файл
- Чтение файла:
- Читается один байт из файла и сохраняется в массиве
text. - Если считанный байт это конец файла, программа переходит к метке
SrcEOF. - Иначе, увеличивается счетчик длины строки (
StrLen), и проверяется, является ли считанный символ концом строки.
- Читается один байт из файла и сохраняется в массиве
- Проверка строки:
- Если длина строки равна 5, то программа копирует эту строку в файл результата.
- После копирования, программа переходит к метке
NewString.
- Копирование строки:
- Считывается и записывается каждый байт строки в новый файл. Процесс повторяется для каждого символа в строке.
- Обработка ошибки:
- Если произошла ошибка при открытии файла, выводится соответствующее сообщение.
- Закрытие файлов и завершение программы:
- Закрываются открытые файлы.
- Программа завершает свою работу.