Жанр: Учеба

Ассемблер и программирование для IBM PC

сторінка №20

айла в это поле.

Все поля в каталоге диска, превышающие один байт, записываются в
обратной последовательности байтов.

ТАБЛИЦА РАСПРЕДЕЛЕНИЯ ФАЙЛОВ
________________________________________________________________

Назначение таблицы распределения файлов (FAT - File Allocation Table)
- распределение дискового пространства для файлов. Если вы создаете новый
файл или изменяете существующий, то DOS меняет элементы таблицы файлов в
соответствии с расположением файла на диске. Запись начальной загрузки
находится на секторе 1, далее на секторе 2 начинается FAT. FAT содержит
элементы для каждого кластера, длина элементов FAT зависит от устройства
дисковой памяти. Кластер для односторонних дискет представляет собой один
сектор, для двухсторонних дискет - смежную пару секторов. Одно и то же
число элементов в FAT определяет в два раза больше данных для
двухсторонних дискет, чем для односторонних.
Первые байты FAT определяют тип устройства:

FE Односторонняя на 8 секторов
FC Односторонняя на 9 секторов
FF Двухсторонняя на 8 секторов
FD Двухсторонняя на 9 секторов
F9 Повышенная емкость (1,2 мегабайта)
F8 Твердый диск

Второй и третий байты пока содержат FFFF. В следующей таблице
показана организация данных для нескольких типов устройств (приведены
начальные и конечные номера секторов). Колонка "Кластер" представляет
число секторов в кластере:

Устройство диска Запись FAT Каталог Кластер
нач.загр.
Односторонний, 8 секторов 1 2-3 4-7 1
Односторонний, 9 секторов 1 2-5 6-9 1
Двухсторонний, 8 секторов 1 2-3 4-10 2
Двухсторонний, 9 секторов 1 2-5 6-12 2
Повышенная емкость (1,2 М) 1 2-15 16-29 1
Твердый диск XT 1 2-17 18-49 8
Твердый диск AT 1 2-838 4-115 4

Начиная с четвертого байта, элементы FAT определяют сектора. Каждый
такой элемент имеет длину 12 битов. (В версии DOS 3 и старше элементы FAT
для твердого диска могут иметь длину 16 битов). Два первых элемента FAT,
известные как относительные сектора 000 и 001, соответственно, указывают
на два последних сектора оглавления, определяя его размер и формат. Первый
файл данных начинается на относительном секторе 002. Каждый элемент FAT
состоит из трех шест.цифр (12 битов), которые указывают на характер
использования конкретного сектора:

000 свободный кластер,
nnn относительный номер следующего кластера для файла,
FF7 неиспользуемый кластер (сбойная дорожка),
FFF последний кластер файла.

Предположим, например, что дискета содержит только один файл с именем
PAYROLL.ASM, занимающий относительные сектора 002, 003 и 004. Элемент
оглавления для этого файла содержит имя файла PAYROLL, тип - ASM, шест.00
для обычного файла, дату создания, 002 - номер первого относительного
сектора файла и размер файла в битах. Таблица FAT в этом случае может
выглядеть следующим образом (кроме того, что в каждой паре байты в
обратной последовательности):

Элемент FAT: |FDF|FFF|003|004|FFF|000|000|...|000|
Относительн.сектор: 0 1 2 3 4 5 6 ...конец

Первые два элемента FAT указывают расположение каталога на
относительных секторах 000 и 001. Для ввода рассматриваемого файла в
память, система выполняет следующие действия:

1. DOS получает доступ к дискете и ищет в каталоге имя PAYROLL и
тип ASM.
2. Затем DOS определяет по каталогу положение первого
относительного сектора файла (002) и загружает содержимое этого
сектора в буферную область в основной памяти.

3. Номер второго сектора DOS получает из элемента FAT,
соответствующего относительному сектору 002. Из диаграммы,
приведенной выше, видно, что этот элемент содержит 003. Это
обозначает, что файл продолжается в относительном секторе 003. DOS
загружает содержимое этого сектора в буфер в основной памяти.
4. Номер третьего сектора DOS получает из элемента FAT,
соответствующего относительному сектору 003. Этот элемент содержит
004, значит файл продолжается в относительном секторе 004. DOS
загружает содержимое этого сектора в буфер в основной памяти.
5. Элемент FAT для относительного сектора 004 содержит шест.FFF,
что свидетельствует о том, что больше нет данных для этого файла.

Элемент каталога содержит номер начального кластера для каждого
файла, а FAT - шест.трехзначные элементы, указывающие на расположение
каждого дополнительного кластера, если он имеется. Для того, чтобы
указать, например, что файл содержит все записи только в первом кластере,
таблица FAT должна содержать шест.FFF в элементе, представляющем первый
относительный кластер.
В качестве простого примера рассмотрим элемент каталога, указывающий,
что некоторый файл начинается в относительном кластере 15. Для локализации
первого элемента таблицы FAT необходимо:

- Умножить 15 на 1,5, получим 22,5.
- Выполнить выборку содержимого байтов 22 и 23 из FAT.
Предположим, что они содержат F*FF.
- Переставить байты: FFF*.
- Так как номер 15-нечетный, то первые три цифры - FFF указывают
на отсутствие других кластеров для данного файла.

Теперь рассмотрим файл, который занимает четыре кластера,
начинающихся с номера 15. Таблица FAT, начиная с байта 22 и далее, в этот
раз показана в правильной обратной последовательности байтов в парах:

6* 01 17 80 01 FF*F

Для того, чтобы найти первый элемент FAT, необходимо умножить 15 на 1,5,
получим 22,5, и выбрать содержимое байтов 22 и 23, как в предыдущем
примере. В этот раз эти байты содержат 6*01, что после перестановки байт
даст 016*. Так как 15-число нечетное, то используются первые три цифры
016. Второй кластер для файла, следовательно, имеет номер 016.
Для того, чтобы найти третий кластер, необходимо умножить 16 на 1,5
получим 24. Затем следует выбрать содержимое байтов 24 и 25 таблицы FAT.
Значение 1780 после перестановки байтов даст 8017. Так как число 16
четное, то используются последние три цифры 017. Третий кластер для файла
имеет номер 017.
Для того, чтобы найти четвертый кластер, необходимо умножить 17 на
1,5, получим 25.5. Затем следует выбрать содержимое байтов 25 и 26 таблицы
FAT. Значение 8001 после перестановки байтов даст 0180. Так как число 17
нечетное, то используются первые три цифры 018. Четвертый кластер для
файла имеет номер 018.
При использовании этой же процедуры для локализации содержимого
следующего элемента FAT по относительным адресам 27 и 28, получим FF*F,
что после перестановки даст *FFF. Так как число 18 четное, используются
последние три цифры FFF, что обозначает последний элемент.
Как было ранее сказано, все файлы начинаются на границе кластера.
Кроме того, совсем не обязательно файл должен храниться в соседних
кластерах, он может быть разбросан на диске по разным секторам.
Если в программе необходимо определить тип установленного диска, то
можно обратиться к таблице FAT непосредственно, или, что предпочтительней,
использовать функцию DOS 1BH или 1CH.

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________

- Независимо от размеров все файлы начинаются на границе кластера.

- Оглавление (каталог) содержит для каждого файл на диске элементы,
определяющие имя, тип, атрибуты, дату, начальный сектор и размер файла.

- Таблица распределения файлов (FAT) содержит один элемент для
каждого кластера в каждом файле.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________

15.1. Какую длину в байтах имеет стандартный сектор?

15.2. Где расположена запись начальной загрузки?

15.3. Как обозначаются в оглавлении удаленные файлы?

15.4. Какие дополнительные действия выполняются при форматизации
дискеты по команде DOS FORMAT /S?

15.5. Где и каким образом обозначается в таблице FAT, что устройством
является твердый диск?

15.6. Имеется файл размером 2890 (десятичное) байтов: а) Где хранит
система размер файла? б) Как выражается этот размер в шестнадцатиричном
формате? в) Покажите значение в том виде, как оно записывается системой.

ГЛАВА 16 Дисковая память II: Функции базовой версии DOS


__________________________________________________________________________

Ц е л ь: Раскрыть основные требования к программированию функций
базовой версии DOS для обработки дисковых файлов.

ВВЕДЕНИЕ
________________________________________________________________

В начале данной главы рассматриваются функции базовой версии DOS,
определяющие блок управления файлом (FCB), а затем будут показаны
возможности создания и обработки дисковых файлов последовательным и прямым
доступом. Все рассматриваемые операции были введены в первых версиях DOS и
возможны во всех последующих версиях.
Обработка дисковых файлов в базовой DOS включает определение блока
управления файлом (FCB - file control block), который описывает файл и его
записи. Передача адреса блока FCB в DOS обязательна для всех дисковых
операций ввода-вывода. Новых команд ассемблера в данной главе не
потребуется.
Управление вводом и выводом осуществляется специальными прерываниями.
Запись файла на диск требует, чтобы прежде он был "создан" и DOS смогла
сгенерировать соответствующий элемент в оглавлении. Когда все записи файла
будут записаны, программа должна "закрыть" файл, так, чтобы DOS завершила
обработку оглавления. Чтение файла требует, чтобы он был сначала "открыт"
для того, чтобы убедиться в его существовании. Так как записи имеют
фиксированную длину и в силу соответствующей организации оглавления,
обработка записей дискового файла может осуществляться как
последовательно, так и произвольно.
Метод доступа к дисковой памяти, поддерживающий использование
оглавления, "блокирование" и "разблокирование" записей, обеспечивается
прерыванием DOS 21H. Более низкий уровень, обеспечивающий абсолютную
адресацию дисковых секторов, также через DOS, выполняется посредством
прерываний 25H и 26H. Самый низкий уровень обеспечивается прерыванием BIOS
13H, которое позволяет выполнить произвольную адресацию в дисковой памяти
по номеру дорожки и сектора. Методы DOS осуществляют некоторую
предварительную обработку до передачи управления в BIOS. В гл.17
объясняется применение предпочтительных функций расширенного DOS 2, а
гл.18 представляет основные дисковые операции в BIOS. Напоминание: Термин
кластер определяет один или более секторов с данными в зависимости от
дискового устройства.

БЛОК УПРАВЛЕНИЯ ФАЙЛОМ (FCB)
________________________________________________________________

Для выполнения операций ввода-вывода на диске в базовой DOS
необходимо в области данных определить блок FCB. Блок FCB не поддерживает
путь доступа к файлу, поэтому он используется главным образом для
обработки файлов в текущей директории. Блок FCB содержит описание файла и
его записей в приведенном ниже формате. Пользователь должен
инициализировать байты 0-15 и 32-36, байты 16-31 устанавливаются DOS:

Байты Назначение

0 Указывает дисковод: 01 для дисковода A, 02 для B и т.д.
1-8 Имя файла, выравненное по левой границе с конечными пробелами,
если имя меньше 8 байт. Поле может содержать зарезервированные
имена, например, LPT1 для принтера.
9-11 Тип файла для дополнительной идентификации, например, DTA или
ASM. Если тип файла меньше трех байт, то он должен быть выравнен
по левой границе и дополнен конечными пробелами. DOS хранит имя
и тип файла в оглавлении.

12-13 Номер текущего блока. Блок содержит 128 записей. Для локализации
конкретной записи используется номер текущего блока и номер
текущей записи (байт 32). Первый блок файла имеет номер 0,
второй - 1 и т.д. Операция открытия файла устанавливает в данном
поле 0.
14-15 Логический размер записи. Операция открытия инициализирует
размер записи значением 128 (шест.80). После открытия и перед
любой операцией чтения или записи можно устанавливать в данном
поле любое требуемое значение длины записи.
16-19 Размер файла. При создании файла DOS вычисляет и записывает это
значение (произведение числа записей на размер записей) в
оглавление. Операция открытия выбирает размер файла из
оглавления и заносит его в данное поле. Программа может читать
это поле, но не может менять его.
20-21 Дата. При создании или последней модификации файла DOS
записывает дату в оглавление. Операция открытия выбирает дату из
оглавления и заносит в данное поле.
22-31 Зарезервировано для DOS.
32 Текущий номер записи. Данное поле содержит текущий номер записи
(0-127) в текущем блоке (см. байты 12-13). Система использует
текущие значения блока и записи для локализации записи в
дисковом файле. Обычно номер начальной записи в данном поле - 0,
но его можно заменить для начала последовательной обработки на
любое значение от 0 до 127.
33-36 Относительный номер записи. Для произвольного доступа при
операциях чтения или записи данное поле должно содержать
относительный номер записи. Например, для произвольного чтения
записи номер 25 (шест.19), необходимо установить в данном поле
шест.19000000. Произвольный доступ характеризуется тем, что
система автоматически преобразует относительный номер записи в
текущие значения блока и записи. Ввиду ограничения на
максимальный размер файла (1.073.741.824 байтов), файл с
короткими записями может содержать больше записей и иметь
больший относительный номер записи. Если размер записи больше
64, то байт 36 всегда содержит 00.

Помните, что числовые значения в словах и двойных словах записываются
в обратной последовательности байтов.
Блоку FCB предшествует необязательное семибайтовое расширение,
которое можно использовать для обработки файлов со специальными
атрибутами. Для использования расширения необходимо закодировать в первом
байте шест.FF, во втором - атрибут файла, а в остальных пяти байтах
шест. нули.

ИСПОЛЬЗОВАНИЕ БЛОКА FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ
________________________________________________________________

Для ссылки на каждый дисковый файл программа должна содержать
правильно составленный блок управления файлом. Операции ввода-вывода на
диск требуют установки адреса блока FCB в регистре DX. Доступ к полям
блока FCB осуществляются по этому адресу с помощью регистровой пары DS:DX.
Для создания нового файла программа использует функцию шест.16 в
прерывании DOS INT 21H следующим образом:

MOV AH,16H ;Создание
LEA DX,FCBname ; дискового файла
INT 21H ;Вызов DOS

DOS осуществляет поиск имени файла и тип файла, взятого из
соответствующих полей FCB, в оглавлении. Если элемент оглавления,
содержащий необходимое имя (и тип), будет найдено, то DOS очищает
найденный элемент для нового использования, если такой элемент не будет
найден, то DOS ищет свободный элемент. Затем операция устанавливает размер
файла в 0 и "открывает" файл. На этапе открытия происходит проверка
доступного дискового пространства, результат такой проверки
устанавливается в регистре AL:

00 На диске есть свободное пространство
FF На диске нет свободного пространства.

При открытии также устанавливается в блок FCB номер текущего блока -
0 и размер записей (по умолчанию) - 128 (шест.80) байтов. Прежде, чем
начать запись файла, можно заменить это значение по умолчанию на требуемый
размер записей.
Для определения выводной записи необходимо прежде обеспечить
начальный адрес этой записи в область передачи данных (DTA - disk trausfer
area). Так как блок FCB содержит размер записей, то в DTA не требуется
устанавливать ограничитель конца записи. Затем с помощью функции шест.1A
необходимо сообщить DOS адрес DTA. В любой момент времени может быть
активен только один DTA. В следующем примере инициализируется адрес DTA:

MOV AH,1AH ;Установка адреса
LEA DX,DTAname ; DTA
INT 21H ;Вызов DOS

Если программа обрабатывает только один дисковой файл, то должна быть
только одна установка адреса DTA для всего выполнения. При обработке
нескольких файлов программа должна устанавливать соответствующий адрес DTA
непосредственно перед каждой операцией чтения или записи.
Для последовательной записи на диск существует функция шест.15:

MOV AH,15 ;Последовательная
LEA DX,FCBname ; запись
INT 21H ;Вызов DOS

Операция записи использует информацию из блока FCB и адрес текущего
буфера DTA. Если длина записи равна размеру сектора, то запись заносится
на диск. В противном случае записи заполняют буфер по длине сектора и
затем буфер записывается на диск. Например, если длина каждой записи
составляет 128 байтов, то буфер заполняется четырьмя записями (4*128=512)
и затем буфер записывается в дисковой сектор.
После успешного занесения записи на диск DOS увеличивает в блоке FCB
размер файла на размер записи и текущий номер записи на 1. Когда номер
текущей записи достигает 128, происходит сброс этого значения в 0 и в FCB
увеличивается номер текущего блока на 1. Операция возвращает в регистре AL
следующие коды:

00 Успешная запись.
01 Диск полный.
02 В области DTA нет места для одной записи.

Когда запись файла завершена, можно, хотя и не всегда обязательно,
записать маркер конца файла (шест.1A). Для закрытия файла используется
функция шест.10:

MOV AH,10H ;Закрыть
LEA DX,FCBname ; файл
INT 21H ;Вызов DOS

Эта операция записывает на диск данные, которые еще остались в дисковом
буфере DOS и изменяет в соответствующем элементе оглавления, дату и размер
файла. В регистре AL возвращаются следующие значения:

00 Успешная запись.
FF Описание файла оказалось в неправильном элементе
оглавления (возможно в результате смены дискеты).

ПРОГРАММА: ИСПОЛЬЗОВАНИЕ FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ
________________________________________________________________

__________________________________________________________________________

page 60,132
TITLE FCBCREAT (EXE) Использование FCB для создания файла
;----------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 80 DUP(?)
STACKSG ENDS
;----------------------------------------------------------
DATASG SEGMENT PARA 'Data'
RECLEN EQU 32
NAMEPAR LABEL BYTE ;Список параметров:
MAXLEN DB RECLEN ; макс.длина имени
NAMELEN DB ? ; число введенных символов
NAMEDTA DB RECLEN DUP(' ') ; область передачи (DTA)

FCBREC LABEL BYTE ;FCB для дискового файла
FCBDRIV DB 04 ; дисковод D
FCBNAME DB 'NAMEFILE' ; имя файла
FCBEXT DB 'DAT' ; тип файла
FCBBLK DW 0000 ; номер текущего блока
FCBRCSZ DW ? ; размер логической записи
FCBFLSZ DD ? ; размер файла (DOS)
DW ? ; дата (DOS)
DT ? ; зарезервировано (DOS)
FCBSQRC DB 00 ; номер текущей записи
DD ? ; относительный номер

CRLF DB 13,10,'$'
ERRCDE DB 00
PROMPT DB 'Name? ','$'
ROW DB 01
OPNMSG DB '*** Open error ***', '$'
WRTMSG DB '*** Write error ***', '$'
DATASG ENDS
; ---------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV ES,AX
MOV AX,0600H
CALL Q10SCR ;Очистить экран
CALL Q20CURS ;Установить курсор
CALL C10OPEN ;Открыть, установить DTA
CMP ERRCDE,00 ;Есть место на диске?
JZ A20LOOP ; да - продолжить,
RET ; нет - вернуться в DOS
A20LOOP:
CALL D10PROC
CMP NAMELEN,00 ;Конец ввода?
JNE A20LOOP ; нет - продолжить,
CALL G10CLSE ; да - закрыть файл
RET ; и вернуться в DOS
BEGIN ENDP
; Открытие дискового файла:
; ------------------------
C10OPEN PROC NEAR
MOV AH,16H ;Функция создания файла
LEA DX,FCBREC
INT 21H
CMP AL,00 ;Есть место на диске?
JNZ C20 ; нет - ошибка

MOV FCBRCSZ,RECLEN ;Размер записи (EQU)
LEA DX,NAMEDTA ;Загрузить адрес DTA
MOV AH,1AH
INT 21AH
RET
C20:
LEA DX,OPNMSG ;Сообщение об ошибке
CALL X10ERR
RET
C10OPEN ENDP
; Ввод с клавиатуры:
; -----------------
D10PROC PROC NEAR
MOV AH,09 ;Функция вывода на экран
LEA DX,PROMPT ;Выдать запрос
INT 21H

MOV AH,0AH ;Функция ввода
LEA DX,NAMEPAR ;Ввести имя файла
INT 21H
CALL E10DISP ;Прокрутка на экране

CMP NAMELEN,00 ;Имя введено?
JNE D20 ; да - продолжить,
RET ; нет - выйти
D20:
MOV BH,00 ;Заменить символ Return
MOV BL,NAMELEN
MOV NAMEDTA[BX],' ' ;Записать пробел
CALL F10WRIT ;Вызвать
; подпрограмму записи
CLD
LEA DI,NAMEDTA ;Очистить
MOV CX,RECLEN / 2 ; поле
MOV AX,2020H ; имени
REP STOSW
RET ;Выйти
D10PROC ENDP
; Прокрутка и установка курсора:
; -----------------------------
E10DISP PROC NEAR
MOV AH,09 ;Функция вывода на экран
LEA DX,CRLF ;CR/LF
INT 21H ;Вызов DOS
CMP ROW,18 ;Последняя строка экрана?

JAE E20 ; да - обойти,
INC ROW ; нет - увеличить строку
RET
E20:
MOV AX,0601H ;Прокрутка на 1 строку
CALL Q10SCR
CALL Q20CURS ;Установить курсор
RET
E10DISP ENDP
; Запись на диск:
; --------------
F10WRIT PROC NEAR
MOV AH,15H ;Функция записи
LEA DX,FCBREC
INT 21H
CMP AL,00 ;Запись без ошибок?
JZ F20 ; да
LEA DX,WRTMSG ; нет -
CALL X10ERR ; выдать сообщение
MOV NAMELEN,00
F20: RET
F10WRIT ENDP
; Закрытие дискового файла:
; ------------------------
G10CLSE PROC NEAR
MOV NAMEDTA,1AH ;Установить EOF
CALL F10WRIT
MOV AH,10H ;Функция закрытия
LEA DX,FCBREC
INT 21H
RET
G10CLSE ENDP
; Прокрутка экрана:
; ----------------
Q10SCR PROC NEAR ;AX уже установлен
MOV BH,1EH ;Цвет желтый на синем
MOV CX,0000
MOV DX,184FH
INT 10H ;Прокрутка
RET
Q10SCR ENDP
; Установка курсора:
; -----------------
Q20CURS PROC NEAR
MOV AH,02
MOV BH,00
MOV DL,00
MOV DH,ROW ;Установить курсор
INT 10H
RET
Q20CURS ENDP
; Вывод сообщения об ошибке на диске:
; ----------------------------------
X10ERR PROC NEAR
MOV AH,09 ;DX содержит
INT 21H ; адрес сообщения
MOV ERRCDE,01 ;Установить код ошибки
RET
X10ERR ENDP

CODESG ENDS
END BEGIN
__________________________________________________________________________

Рис.16.1. Создание дискового файла.

Программа, приведенная на рис.16.1, создает дисковый файл по имени,
которое вводится пользователем с клавиатуры. Блок FCB (FCBREC) в данной
программе содержит следующие поля:

FCBDRIV Программа должна создать файл на диске в дисководе 4 (или D).
FCBNAME Имя файла - NAMEFILE.
FCBEXT Тип файла - DAT.
FCBBLK Начальное значение номера текущего блока - 0.
FCBRCSZ Размер записей неопределен, так как операция открытия
устанавливает в данном поле значение 128.

FCBSQRC Начальное значение номера текущей записи - 0.

В программе организованы следующие процедуры:

BEGIN Инициализирует сегментные регистры, вызывает C10OPEN для
создания файла и установки адреса DTA для DOS, вызывает D10PROC
для ввода имени файла. Если ввод пустой, то происходит вызов
G10PROC для завершения программы.
C10OPEN Создает для файла элемент в директории, устанавливает размер
записей - 32 (шест.20) и инициализирует адрес буфера DTA для
DOS.
D10PROC Выдает запрос на ввод имен, вводит имена с клавиатуры и
вызывает процедуру F10WRIT для записи вводимых имен на диск
E10DISP Управляет прокруткой и установкой курсора.
F10WRIT Записывает имена в дисковой файл.
G10CLSE Записывает маркер конца файла и закрывает файл.
X10ERR Выдает на экран сообщение об ошибке в случае не корректной
операции создания файла или записи данных.

Каждая операция записи автоматически добавляет 1 к FCBSGRC (номер
текущей записи) и шест

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.