Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Primer_kontr._raboty_208_FGOS_.doc
Скачиваний:
12
Добавлен:
16.11.2019
Размер:
318.98 Кб
Скачать

Тема №6 «Работа с файлами в языке Assembler»

Условие задачи

Отсортировать строки файла по количеству одинаковых букв

Исходный текст программы

masm

model small

JUMPS ; Разрешаем дальние переходы

.stack 100h

.data

message db 13,10,"Введите имя обрабатываемого файла: $"

message1 db 13,10,"Введите имя создаваемого файла: $"

nameFile db 13 dup(?)

message2 db 10,"Содержимое файла до обработки: ",13,10,'$'

message3 db 10,"Содержимое файла после обработки: ",13,10,'$'

fileStr db 255 dup(?)

MessageErrorOpen db 10,'Ошибка при открытии файла!!!$'

MessageErrorRead db 10,'Ошибка при чтении исходного файла!!!$'

nameFileAfter db 13 dup (?) ; Имя создаваемого файла

handle1 dw 0 ; Дескриптор первого файла

handle2 dw 0 ; Дескриптор второго файла

lengthStr dw 0 ; Длина считанной строки

flagEndFile db 0 ; Флаг для обозначения конца исходного файла

bufStr db '$$' ; Буфер для вывода полученного файла

kolvo db 0

flagOut db 0

.code

start:

mov ax,@data

mov ds,ax ; настройка ds на сегмент данных

mov es,ax

mov ah,9h ; вывод приглашения к вводу

int 21h

cld ; направление работы со строками - прямое

lea di,nameFile ; в di - смещение формируемой строки

mov cl,0FEh

input:

mov ah,1

int 21h ; ввод символа с клавиатуры

cmp al,13 ; проверка на нажатие Enter

je endInput ; если нажат Enter конец ввода

stosb ; записываем введеный символ в цепочку

loop input

endInput:

mov al,0 ; формируем окончание цепочки

stosb

mov al,'$'

stosb

mov ah,9h ; вывод приглашения к вводу

lea dx,message1

int 21h

cld ; направление работы со строками - прямое

lea di,nameFileAfter; в di - смещение формируемой строки

mov cl,0FEh

input2:

mov ah,1

int 21h ; ввод символа с клавиатуры

cmp al,13 ; проверка на нажатие Enter

je endInput2 ; если нажат Enter конец ввода

stosb ; записываем введеный символ в цепочку

loop input2

endInput2:

mov al,0 ; формируем окончание цепочки

stosb

mov al,'$'

stosb

mov ax,3D00h ; Открытие файла

mov dx,offset nameFile

int 21h

jc ErrorOpenFile

mov handle1,ax ; Сохраняем дескриптор

mov ah,3Ch ; Создаем файл

xor cx,cx

mov dx,offset nameFileAfter

int 21h

mov handle2,ax

mov ah,9

lea dx,message2

int 21h

mov kolvo,0 ; Обнуляем текущую длину

working1:

mov ah,42h

mov al,0

mov bx,handle1

mov cx,0

mov dx,0

int 21h

mov flagEndFile,0 ; Перемещаем указатель на начало файла

working: ; Часть программы, в которой происходит прочитываение строки из исходного файла и запись в результирующий файл

lea dx,FileStr

mov bx,handle1

mov cx,1

readString:

mov ah,3Fh

int 21h ; Читаем символ

jc ErrorReadFile ; Проверяем на ошибку при чтении файла

cmp ax,cx

je read ; Был ли прочитан символ?

mov flagEndFile,1 ; Если нет, устанавливаем флаг

dec dx

jmp endRead

read: ; Если символ был прочитан

mov si,dx ; Высчитываем его положение в строке

sub si,offset FileStr

cmp FileStr[si],13 ; Переход, если код - 13

je endRead1

inc dx

jmp readString

endRead1:

inc dx

mov ah,3Fh ; Считываем следующий символ

int 21h

mov si,dx

sub si,offset FileStr

cmp FileStr[si],10 ; Сравниваем с кодом 10

je endRead

jmp readString

endRead:

inc dx

mov si,dx

sub si,offset FileStr

mov FileStr[si],'$' ; Обозначаем конец строки

mov lengthStr,si ; Сохраняем длину строки

cmp flagOut,1

je CmpLetters

lea dx,FileStr

mov ah,9

int 21h ; Выводим строку на экран

CmpLetters:

mov bx,0

mov al,0

FindLetters1:

mov dl,FileStr[bx] ; считываем текущий символ из строки

mov si,bx

inc si

FindLetters2:

mov dh,FileStr[si]

jne NotE

inc al ; если находим, увеличиваем счетчик

NotE:

inc si

cmp si,lengthStr

jb FindLetters2

inc bx

cmp bx,lengthStr

jb FindLetters1

cmp al,kolvo ; Проверяем равенство количества одинаковых букв со счетчиком

jne CheckEndWork

endCreateStr: ; Если длины равны

mov ah,40h

mov bx,handle2 ; Запись во второй файл

mov cx,lengthStr

lea dx,FileStr

int 21h ; запись строки

CheckEndWork:

cmp flagEndFile,1 ; Если был установлен флаг конца файла, окончиваем работу внутреннего цикла

jne working

EndWorking:

mov flagOut,1

inc kolvo ; Увеличиваем счетчик количества букв

mov al,kolvo

cmp al,255

jb working1 ; Если счетчик превысил максимальное возможное количество букв, завершаем работу

endWork: ; Вывод полученного файла

mov ah,9

lea dx,message3

int 21h

mov ax,4200h

mov bx,handle2

xor cx,cx

xor dx,dx

int 21h ; Позиционируем

inc cx

lea dx,bufStr

readBuf:

mov ah,3Fh

int 21h ; Читаем посимвольно

jc ErrorReadFile

cmp ax,cx

jne closeFiles

mov ah,9h

int 21h ; И выводим на экран

jmp readBuf

closeFiles: ; Закрытие файлов

mov ah,3Eh

mov bx,handle1

int 21h

mov bx,handle2

int 21h

exit: ; Выход из программы

mov ah,10h

int 16h

mov ah,4ch

int 21h

ErrorOpenFile: ; Ошибка при открытии файла

mov ah,9

lea dx,MessageErrorOpen

jmp closeFiles

ErrorReadFile: ; Ошибка при чтении файла

mov ah,9

lea dx,MessageErrorRead

int 21h

jmp closeFiles

end start

Результат работы программы

Исходный файл:

Выровнять все строки в файле по правому краю

Выровнять все строки в файле по центру

Выровнять все строки в файле по левому краю

Отформатировать файл таким образом, чтобы длина каждой строки не превышала заданного пользователем значения

Отсортировать строки файла по длинам

Отсортировать строки файла по количеству гласных букв

Отсортировать строки файла по алфавиту по первым трем буквам

Отсортировать строки файла по количеству одинаковых букв

Найти в каждой строке файла заданную пользователем последовательность символов и заменить на введенное слово

Полученный файл:

Выровнять все строки в файле по центру

Отсортировать строки файла по длинам

Выровнять все строки в файле по левому краю

Выровнять все строки в файле по правому краю

Отформатировать файл таким образом, чтобы длина каждой строки не превышала заданного пользователем значения

Отсортировать строки файла по количеству гласных букв

Отсортировать строки файла по количеству одинаковых букв

Найти в каждой строке файла заданную пользователем последовательность символов и заменить на введенное слово

Отсортировать строки файла по алфавиту по первым трем буквам

25

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]