Разделы презентаций


ОБРАЩЕНИЕ К ФУНКЦИЯМ ОПЕРАЦИОННОЙ СИСТЕМЫ

Содержание

Следует учесть, что единственным механизмом обращения к функциям операционной системы является инициация программного прерывания.

Слайды и текст этой презентации

Слайд 1ОБРАЩЕНИЕ К ФУНКЦИЯМ ОПЕРАЦИОННОЙ СИСТЕМЫ
Большинство библиотечных процедур и функций является

своеобразным интерфейсом между языковыми средствами Турбо-Паскаля и функциями операционной системы.

ОБРАЩЕНИЕ К ФУНКЦИЯМ ОПЕРАЦИОННОЙ СИСТЕМЫБольшинство библиотечных процедур и функций является своеобразным интерфейсом между языковыми средствами Турбо-Паскаля и

Слайд 2Следует учесть, что единственным механизмом обращения к функциям операционной системы

является инициация программного прерывания.

Следует учесть, что единственным механизмом обращения к функциям операционной системы является инициация программного прерывания.

Слайд 3ПРЕРЫВАНИЕ - ЭТО ОСОБОЕ СОСТОЯНИЕ ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА.
В момент прерывания нарушается

нормальный порядок выполнения команд программы, и управление передается специальной процедуре,

которая входит в состав MS DOS и называется процедурой обработки прерывания.
Каждое прерывание характеризуется в рамках MS DOS порядковым номером и связано со своей процедурой обработки.
В архитектуре центрального процессора ЭВМ предусмотрены прерывания двух типов: аппаратные и программные.
Аппаратные прерывания создаются схемами контроля и управления ЭВМ и сигнализируют операционной системе о переходе какого-либо устройства в новое состояние или о возникновении неисправности.
ПРЕРЫВАНИЕ - ЭТО ОСОБОЕ СОСТОЯНИЕ ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА. В момент прерывания нарушается нормальный порядок выполнения команд программы, и

Слайд 4Прерывания MS-DOS.
Всего в MS DOS имеется около 40 программных прерываний.
каждое

из которых может активизировать одну или несколько функций MS DOS.
Одно

из прерываний - с номером 33 ($21) обеспечивает доступ к 85 функциям.

а всего в MS DOS имеется более 200 разнообразных функций.

Прерывания MS-DOS.Всего в MS DOS имеется около 40 программных прерываний.каждое из которых может активизировать одну или несколько

Слайд 5Модуль Dos
Модуль Dos содержит ряд подпрограмм для работы с файлами

и доступа к средствам операционной системы.
Ни одна из программ

модуля Dos не определена в стандартном Паскале, поэтому они помещены в отдельный модуль.
Модуль DosМодуль Dos содержит ряд подпрограмм для работы с файлами и доступа к средствам операционной системы. Ни

Слайд 6Процедуры и функции модуля Dos.

Модуль DOS
Функции управления операционной средой.

Процедуры управления

процессами.

Процедуры обслуживания прерываний.

Процедуры работы с датой и временем.

Процедуры и функции

проверки состояния диска.

Процедуры и функции работы с файлами.

Процедуры и функции различного назначения.

Процедуры и функции модуля Dos.Модуль DOSФункции управления операционной средой.Процедуры управления процессами.Процедуры обслуживания прерываний.Процедуры работы с датой и

Слайд 7Функции управления операционной средой.
Программа, написанная на языке Турбо Паскаль 7.0,

имеет возможность получать от MS-DOS информацию об окружении (environment).
Каждое

описание в области окружения представляет собой строку вида: Имя = Значение.
Имя — это имя переменной, Значение — текстовая строка.
Переменные окружения предназначены для хранения определенной системной информации, которая необходима различным прикладным программам, использующим ее в своих целях.

Функции управления операционной средой.Программа, написанная на языке Турбо Паскаль 7.0, имеет возможность получать от MS-DOS информацию об

Слайд 8В Турбо Паскале имеется три функции для работы с переменными

окружения:

FUNCTION EnvCount : INTEGER;

FUNCTION EnvStr(index:INTEGER) : STRING;

FUNCTION GetEnv(EnWar:

STRING) : STRING;

В Турбо Паскале имеется три функции для работы с переменными окружения:FUNCTION EnvCount  :  INTEGER;FUNCTION EnvStr(index:INTEGER)

Слайд 9Функции управления операционной средой.

Функция EnvCount

не имеет параметров и возвращает

общее число переменных окружения.
Функция EnvStr

имеет один параметр и возвращает

строку, содержащую имя и значение переменной, которая соответствует значению указанного индекса.
индекс самой первой переменной — 1.
если указанный индекс меньше 1 или больше EnvCount, функция EnvStr возвращает пустую строку.
Функции управления операционной средой.Функция EnvCount не имеет параметров и возвращает общее число переменных окружения.Функция EnvStr имеет один

Слайд 10Пример.
{Использование функций EnvCount и EnvStr}
USES Dos;
VAR
I: INTEGER;
BEGIN
FOR I

:= 1 TO EnvCount DO WriteLn(i,' ',EnvStr(I));
ReadLn;
END.
Результат работы

данной программы может выглядеть примерно следующим образом:

COMSPEC=C:\COMMAND.СОМ
РАТН=С:\NU;C:\;D:\TOOLS;C:\NC;C:\WINDOWS;
SYMANTEC=C:\SYMANTEC
NU=C:\NU

Пример.{Использование функций EnvCount и EnvStr}USES Dos;VAR	I:  INTEGER;BEGIN	FOR I  := 1 TO EnvCount DO WriteLn(i,'

Слайд 11Функции управления операционной средой.

Функция GetEnv

позволяет по имени переменной окружения

получить ее значение.
при вызове функции указывается один параметр — имя

переменной окружения.

Например, используя оператор WriteLn(GetEnv('PATH'))
можно получить на экране следующее:

С:\;С:\NC;\С:\ WINDOWS;D:\TOOLS;

Функции управления операционной средой.Функция GetEnv позволяет по имени переменной окружения получить ее значение.при вызове функции указывается один

Слайд 12Процедуры управления процессами.
Используя специальные средства языка Турбо Паскаль, можно организовать

вызов из программы любой другой программы, которую называют программой-потомком.
Важно

помнить, что для того, чтобы программа-потомок успешно загрузилась в память и начала выполняться, необходимо обеспечить выделение ей требуемого объема памяти.

Так как программа, которая выполняется в данный момент, по умолчанию захватывает всю свободную динамическую память (кучу) системы, то для загрузки программы-потомка просто нет места.
Для того чтобы выделить для программы-потомка достаточное количество свободного места, необходимо в начале программы указать с помощью директивы компилятора $М минимальный размер выделяемой программе памяти, а если в программе не используется динамическая память, то вовсе не выделять ее.

Процедуры управления процессами.Используя специальные средства языка Турбо Паскаль, можно организовать вызов из программы любой другой программы, которую

Слайд 13Директива {$M 16384,0,655360} устанавливается для программ по умолчанию.
Здесь максимальный

размер кучи равен всей доступной памяти.
Поэтому вызов программы-потомка невозможен.


Но можно задать и такую директиву {$М 1024,0,0}.
В этом случае динамическая память вообще не выделяется.
Теперь можно вызывать программу-потомка.
Директива {$M 16384,0,655360} устанавливается для программ по умолчанию. Здесь максимальный размер кучи равен всей доступной памяти. Поэтому

Слайд 14Процедуры управления процессами.

Вызов программы-потомка производится с помощью процедуры:

Exec(Path,CmdLine : STRING);

Path

— это полный или сокращенный путь к исполняемому файлу и

его имя
CmdLine — параметр, в котором можно передать вызываемой программе командную строку.

Если вызов программы не произошел, то это никак не отразится на работе вызвавшей программы, т.е. она будет вести себя одинаково как при успешном, так и при неудачном вызове.

Процедуры управления процессами.Вызов программы-потомка производится с помощью процедуры:Exec(Path,CmdLine : STRING);Path 	— 	это полный или сокращенный путь к

Слайд 15Для того чтобы определить, как прошел вызов, используется системная переменная

DosError.
Сразу после вызова процедуры Exec необходимо проверить значение переменной

DosError.
Если она равна 0, то это значит, что вызов прошел успешно.
Ненулевое значение свидетельствует об ошибке.
Для того чтобы определить, как прошел вызов, используется системная переменная DosError. Сразу после вызова процедуры Exec необходимо

Слайд 16Процедуры управления процессами.

Значения переменной DosError соответствуют кодам, вырабатываемым операционной системой,

и могут быть следующими :

Процедуры управления процессами.Значения переменной DosError соответствуют кодам, вырабатываемым операционной системой, и могут быть следующими :

Слайд 17Перед вызовом программы-потомка нужно восстановить исходные адреса обработчиков прерываний.
А после

завершения работы вызываемой программы установить адреса обработчиков Турбо Паскаля.

Перед вызовом программы-потомка нужно восстановить исходные адреса обработчиков прерываний.А после завершения работы вызываемой программы установить адреса обработчиков

Слайд 18Процедуры управления процессами.

Cпецифические особенности исполнения Турбо-Паскалевых программ требуют изменения стандартных

значений некоторых векторов прерываний.
К ним относятся векторы со следующими

шестнадцатеричными номерами:

$00, $02, $18, $23, $24, $34, $35,
$36, $37, $38, $39, $3А, $3В, 3С,
$3D, $3Е, $3F, $75.

Начальные значения этих векторов сохраняются в восемнадцати переменных с именами SaveIntXX ,
где ХХ - шестнадцатеричный номер прерывания.

Процедуры управления процессами.Cпецифические особенности исполнения Турбо-Паскалевых программ требуют изменения стандартных значений некоторых векторов прерываний. К ним относятся

Слайд 19Непосредственно перед запуском внешней программы и сразу после возврата из

нее рекомендуется вызвать библиотечную процедуру не имеющая параметров SwapVectors, которая

обменивает содержимое векторов прерывания и перечисленных переменных.
Непосредственно перед запуском внешней программы и сразу после возврата из нее рекомендуется вызвать библиотечную процедуру не имеющая

Слайд 20Пример использования процедур Exec и SwapVectors .
{Использование процедур Exec и

SwapVectors}
{$М 1024,0,0} {освобождение памяти для потомка}
USES Dos;
VAR
ProgName, CmdLine: STRING;
BEGIN
Write('Введите

путь и имя исполняемого файла ');
ReadLn(ProgName);
Write('Введите командную строку ');
ReadLn(CmdLine);
SwapVectors; {переустановка векторов}
Exec(ProgName, CmdLine);
SwapVectors; {восстановление векторов}
IF DosError <> 0 {проверка на ошибку запуска}
THEN
WriteLn('Ошибка DOS ', DosError)
ELSE
WriteLn('Выполнено успешно, код возврата ',Lo(DosExitCode));
END.
Пример использования процедур  Exec и SwapVectors .{Использование процедур Exec и SwapVectors}{$М 1024,0,0}  {освобождение памяти для

Слайд 21Процедуры управления процессами.
Функция DosExitCode : WORD;
Эта функция возвращает значение

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

через процедуру завершения, а в старшем — признак того, как завершилась программа (см. табл.).
Процедуры управления процессами.Функция DosExitCode  : WORD;Эта функция возвращает значение типа WORD, в младшем байте которого содержится

Слайд 22Процедуры управления процессами.
В заключение рассмотрим еще один весьма полезный пример.


Программа воспринимает с клавиатуры любую команду DOS, затем вызывает командный

процессор СОММАND.СОМ операционной системы и передает ему эту команду.

PROGRAM ExecDemo;
{$M 1024, 0, 0}
Uses DOS;
var
st: string f79];
BEGIN
write ( ‘Введите команду DOS:’ );
read1n (st);
if st <> '' then
begin
st := '/C '+st,;
SwapVectors;
Exec (GetEnv ('COMSPEC'), st);
SwapVectors
end;
END.

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

Слайд 23Обратите внимание: для указания файла СОММАND.СОМ и пути к нему

используется обращение к библиотечной функции GetEnv, с помощью которой можно

получить параметры настройки операционной системы.
В частности, параметр СОМSPЕС определяет спецификацию файла, содержащего командный процессор.
Обратите внимание: для указания файла СОММАND.СОМ и пути к нему используется обращение к библиотечной функции GetEnv, с

Слайд 24Процедуры обслуживания прерываний.
Несмотря на то, что Турбо Паскаль имеет большой

набор инструментальных средств для использования возможностей MS-DOS, во многих случаях

возникает необходимость прямого обращения к функциям MS-DOS для использования некоторых специфических средств операционной системы, в частности, для организации обмена информацией в оперативной памяти.
Рассмотрим более подробно принцип такого обмена.
Процедуры обслуживания прерываний.Несмотря на то, что Турбо Паскаль имеет большой набор инструментальных средств для использования возможностей MS-DOS,

Слайд 25Для более полного использования возможностей MS-DOS в модуле Dos имеются

две процедуры:
Intr и MsDos.

Для более полного использования возможностей MS-DOS в модуле Dos имеются две процедуры: Intr и MsDos.

Слайд 26Процедуры обслуживания прерываний.
Процедура
Intr(IntNo :BYTE; VAR Regs :REGISTERS)
выполняет заданное

программное прерывание.
IntNo — номер программного прерывания;
REGISTERS — является типом

записи, определенным в модуле Dos следующим образом:

Type Registers = Record
Case Integer Of
0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : Word);
1: (AL, AH, BL, BH, CL, CH, DL, DH : Byte);
End;

Поля записи соответствуют регистрам процессора.

Процедуры обслуживания прерываний.Процедура Intr(IntNo :BYTE; VAR Regs :REGISTERS) выполняет заданное программное прерывание.IntNo — номер программного прерывания; REGISTERS

Слайд 27Процесс выполнения процедуры Intr.
Таким образом, можно получить доступ к результатам

работы процедуры прерывания

Процесс выполнения процедуры Intr.Таким образом, можно получить доступ к результатам работы процедуры прерывания

Слайд 28Процедуры обслуживания прерываний.
Для доступа к отдельным битам регистра флагов процессора

используются следующие константы масок

Процедуры обслуживания прерываний.Для доступа к отдельным битам регистра флагов процессора используются следующие константы масок

Слайд 29Пример использования процедуры Intr.
прерывание с номером 18 ($12) возвращает в

регистре AX объем оперативной памяти ЭВМ
PROGRAM IntrDem; {Использование процедуры Intr}
Uses

DOS;
Var
r : registers;
BEGIN
Intr ($12, r);
writeln('Объем памяти = ', r.АХ, ' Кбайт')
END.
Пример использования процедуры Intr.прерывание с номером 18 ($12) возвращает в регистре AX объем оперативной памяти ЭВМPROGRAM IntrDem;

Слайд 30Прерывание номер 33 ($21) стоит особняком и называется прерывание DOS.


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


(этим прерыванием вызывается 85 функций).
Прерывание номер 33 ($21) стоит особняком и называется прерывание DOS. Оно дает доступ к большому количеству функций

Слайд 31Процедуры обслуживания прерываний.
Процедура
MsDos(VAR Regs:REGISTERS)
выполняет вызов функции DOS.
Результат обращения

к процедуре MsDos будет тот же, что и при обращении

к процедуре Intr с номером прерывания $21.
Процедуры обслуживания прерываний.Процедура MsDos(VAR Regs:REGISTERS) выполняет вызов функции DOS.Результат обращения к процедуре MsDos будет тот же, что

Слайд 32Пример использования процедуры MsDos.
PROGRAM MsDosDemo;
Uses DOS;
Var
R: registers;
BEGIN
r.AH: = $30;
MsDos (r);
WriteLN

('Версия операционной системы :’,r.АL,'.',r.АН)
END.

Пример использования процедуры MsDos.PROGRAM MsDosDemo;Uses DOS;Var	R: registers;BEGIN	r.AH: = $30;	MsDos (r);	WriteLN ('Версия операционной системы :’,r.АL,'.',r.АН)END.

Слайд 33Процедуры обслуживания прерываний.
Довольно распространенной является ситуация, когда в программе необходимо

определить собственные алгоритмы реакции на прерывания операционной системы.
При этом обычно

нужно либо отменить стандартные реакции, либо сделать так, чтобы выполнялась и стандартная реакция, и своя собственная.

Для этого Турбо Паскаль позволяет создавать процедуры специального вида —
обработчики прерываний

хотя обычно такие процедуры пишутся на языке ассемблера

Процедуры обслуживания прерываний.Довольно распространенной является ситуация, когда в программе необходимо определить собственные алгоритмы реакции на прерывания операционной

Слайд 34Обработчики прерываний.
Заголовок таких процедур должен иметь стандартный вид:
PROCEDURE имя_процедуры (Flags,CS,IP,АХ,ВХ,СХ,DX,SI,DI,DS,ES,BP:WORD);


INTERRUPT;
begin
. . . . . . .
end;

При активизации процедуры

обработки прерываний в стек автоматически сохраняется содержимое всех регистров,
а процедуре передаются копии содержимого тех регистров, которые указаны к качестве формальных параметров.
Поэтому в процедуре их можно изменять и использовать.
Обработчики прерываний.Заголовок таких процедур должен иметь стандартный вид:PROCEDURE имя_процедуры (Flags,CS,IP,АХ,ВХ,СХ,DX,SI,DI,DS,ES,BP:WORD);  INTERRUPT;	begin		. . . . . .

Слайд 35Порядок следования параметров должен точно соответствовать приведенному выше,
но допускается

указывать только необходимые из них.

Порядок следования параметров должен точно соответствовать приведенному выше, но допускается указывать только необходимые из них.

Слайд 36Процедуры обслуживания прерываний.
При написании процедур обработки прерываний существенными являются следующие

обстоятельства:
Процедура обработки прерывания не должна искажать работу прерванной программы.
Для

этого необходимо сначала сохранить регистры центрального процессора, а перед выходом из процедуры — восстановить их.

Процедура должна строиться по принципу реентерабельности (повторной входимости)

Ее работа может быть прервана в любой момент другими прерываниями и DOS может обратиться к соответствующей функции до завершения обработки предыдущего прерывания.

В самой процедуре обработки прерывания не рекомендуется обращение к другим функциям DOS.

Так как некоторые из них, в том числе все функции ввода-вывода, нереентерабельны.

Процедуры обслуживания прерываний.При написании процедур обработки прерываний существенными являются следующие обстоятельства:Процедура обработки прерывания не должна искажать работу

Слайд 37Процедуры обслуживания прерываний.
Процедура
SetIntVec(IntNo :BYTE; Vector :POINTER);
используется для установки

нового адреса обработчика прерывания .
IntNo — номер прерывания, которое необходимо

переопределить;
Vector — адрес новой процедуры обработки прерывания.
Процедуры обслуживания прерываний.Процедура SetIntVec(IntNo :BYTE; Vector :POINTER); используется для установки нового адреса обработчика прерывания .IntNo — номер

Слайд 38Процедуры обслуживания прерываний.
Для того чтобы изменить реакцию системы на прерывание

и определить пользовательский обработчик, SetIntVec просто изменяет запись в системной

области DOS, которая называется областью векторов прерываний.

но при этом старый вектор, т.е. адрес старой процедуры обработки прерываний, не сохраняется.

Адрес старой процедуры обработки прерываний может быть необходим, чтобы через некоторое время восстановить старую реакцию на прерывание.

или чтобы при вызове прерывания сначала срабатывал новый обработчик, который затем передавал бы управление оригинальному (старому) обработчику.

Процедуры обслуживания прерываний.Для того чтобы изменить реакцию системы на прерывание и определить пользовательский обработчик, SetIntVec просто изменяет

Слайд 39Процедуры обслуживания прерываний.
Этот принцип использует большинство резидентных программ.
Таким образом, работоспособность

системы не нарушается, когда несколько программ перехватывают одно прерывание.
Резидентная программа

сначала отрабатывает сама, затем передает управление другой программе и так далее, а в конце управление передается операционной системе. .
Процедуры обслуживания прерываний.Этот принцип использует большинство резидентных программ.Таким образом, работоспособность системы не нарушается, когда несколько программ перехватывают

Слайд 40Поэтому очень важно сохранить адрес cтарого обработчика прерывания.
Для этого можно

использовать процедуру
GetlntVec(IntNo :BYTE; VAR Vector :POINTER);
которая присваивает параметру-переменной Vector

адрес текущего обработчика прерывания, номер которого задан в параметре IntNo.
Поэтому очень важно сохранить адрес cтарого обработчика прерывания.Для этого можно использовать процедуру GetlntVec(IntNo :BYTE; VAR Vector :POINTER);которая

Слайд 41Процедуры обслуживания прерываний.
Следующий пример выводит на экран содержимое всех ненулевых

векторов прерываний.
Uses DOS;
var
i : byte;
p : pointer;
BEGIN
for i := 0

to 255 do
begin
GetIntVec (i, p);
if (Seg (p^) <> 0) or (Ofs (p^) <> 0) then
write1n (' N =', i:3, ' Seg =', Seg (p^):5, Ofs =', Ofs (p^):5)
end
END.
Процедуры обслуживания прерываний.Следующий пример выводит на экран содержимое всех ненулевых векторов прерываний.Uses DOS;var	i : byte;	p : pointer;BEGIN	for

Слайд 42Программы, резидентные в памяти.
Существует еще одна процедура, относящаяся к процедурам

управления процессами - это процедура Keep.
Keep(ExitCode: WORD);
Вызов этой процедуры

приводит к завершению работы программы, но при этом оставляет ее в памяти.
Такие программы носят название программ, резидентных в памяти (Terminate and Stay Resident, TSR), или просто резидентных программ.
На этом принципе построены драйверы устройств и различные сервисные программы, например резидентные словари или калькуляторы.
Программы, резидентные в памяти.Существует еще одна процедура, относящаяся к процедурам управления процессами - это процедура Keep. Keep(ExitCode:

Слайд 43Программы, резидентные в памяти.
После того как программа осталась резидентной в

памяти, она передает управление командному процессору.
а сама как бы

«замирает».

Для того чтобы активизироваться в нужный момент, программа обязательно должна перехватывать какое-нибудь прерывание

например, прерывание от клавиатуры.

После нажатия нужной комбинации клавиш программа перехватывает управление и выполняет свою задачу.

Программы, резидентные в памяти.После того как программа осталась резидентной в памяти, она передает управление командному процессору. а

Слайд 44Пример резидентной программы.
Переопределим прерывание от клавиатуры.
USES Dos;
CONST
Segment = $B800;
Col

= 39;
Row = 12;
Attr = $0C;
VAR
Offset : WORD;
Vector : PROCEDURE;
Activ : BOOLEAN;
{$F+} {должен

использоваться дальний тип вызова}
Пример резидентной программы.Переопределим прерывание от клавиатуры.USES Dos; CONST	Segment = $B800;	Col = 39;	Row = 12;	Attr = $0C; VAR	Offset		:

Слайд 45Пример резидентной программы.
PROCEDURE Int09; INTERRUPT; {процедура обработки прерывания 09}
VAR
Time62,

Time60, Portfo : BYTE;
BEGIN
Time60:=Port[$60); {чтение регистров портов}
Portfo:=Port[$61];
Time62:=Port[$62];
Port[$61]:=Portfo OR

128; {запись новых значений в регистры порта}
Port[$61]:=Portfo AND 127;
IF ((Mem[$40:$17]=Mem[$40:$17] OR 12) AND (Time60=19)) OR (activ) THEN
BEGIN
Activ:=TRUE;
IF Time60=l THEN Activ:=FALSE;
Mem[Segment:Offset+1]:=Attr; {прямой вывод в видеопамять}
Mem[Segment:Off3et+3]:=Attr;
Mem[Segment:Offset+5]:=Attr;
Mem[Segment:Offset]:=(Time60 DIV 100J+48;
Mem[Segment:0ffset+2]:=((Time60 MOD 100) DIV 10)+48;
Mem[Segment:Offset+4]:=((Time60 MOD 100) MOD 10)+48;
END;
INLINE ($9С); {вызов новой процедуры обработки прерывания}
Vector;
End;
Пример резидентной программы.PROCEDURE Int09;  INTERRUPT; 	{процедура обработки прерывания 09}VAR	Time62, 	Time60, Portfo	: BYTE;BEGINTime60:=Port[$60); 			{чтение регистров портов} Portfo:=Port[$61];

Слайд 46Пример резидентной программы.
{$F-}
BEGIN
Activ:=FALSE;
Offset:=(Row-l)*160+(Col-l) SHL 1;
GetIntVec($09,@Vector) ; {сохранение старого

вектора}
SetIntVec($09,Addr(Int09)); {установка нового вектора}
Keep(0); {выйти и остаться резидентной}
END.
Данная

программа остается резидентной в памяти и выводит на экран значение скэн-кодов нажатых клавиш.

Процедура Int09 перехватывает прерывание клавиатуры и активизируется после нажатия комбинации клавиш [Ctrl+Alt+R], а затем используя прямой доступ к видеопамяти, выводит скэн-коды

После нажатия клавиши [Esc] вывод кодов прекращается.

Пример резидентной программы.{$F-} BEGIN	Activ:=FALSE;	Offset:=(Row-l)*160+(Col-l) SHL 1; 		GetIntVec($09,@Vector) ; 		{сохранение старого вектора}	SetIntVec($09,Addr(Int09)); 	{установка нового вектора}	Keep(0);  			{выйти и

Слайд 47Резидентные программы лучше писать с использованием языка низкого уровня.

Резидентные программы лучше писать с использованием языка низкого уровня.

Слайд 48Процедуры работы с датой и временем.
Модуль Dos предоставляет программисту возможность

доступа к системным часам и календарю, а также дает возможность

изменять дату и время создания файла.
Для доступа к системной дате используют процедуры GetDate и SetDate.
Для доступа к системным часам используются процедуры SetTime и GetTime.
Процедуры работы с датой и временем.Модуль Dos предоставляет программисту возможность доступа к системным часам и календарю, а

Слайд 49Процедуры работы с датой и временем.

Процедура GetDate

GetDate(var year,month,day,day_of_week :

WORD);
возвращает текущую дату, установленную в системе.
Процедура SetDate

SetDate(year,month,day : WORD);
устанавливает

текущую дату в операционной системе.
Процедуры работы с датой и временем.Процедура GetDate GetDate(var year,month,day,day_of_week : WORD); возвращает текущую дату, установленную в системе.Процедура

Слайд 50Процедуры работы с датой и временем.

Значения параметров
year

может принимать значения от

1980 до 2099
month

значения от 1 до 12
day

значения от 1 до

31

day_of_week


значения от 0 до 6,
где 0 означает воскресенье.

Процедуры работы с датой и временем.Значения параметровyearможет принимать значения от 1980 до 2099monthзначения от 1 до 12dayзначения

Слайд 51Пример программы, демонстрирующий использование процедур GetDate и SetDate.
USES Dos;
CONST
days :

ARRAY[0..6] OF STRING[11] =('Воскресенье','Понедельник','Вторник',
'Среда', 'Четверг' , 'Пятница', 'Суббота');
VAR
year,month,day,day_of_week :

WORD;

PROCEDURE Get_Date;
BEGIN
GetDate(year,month, day,day_of_week);
WriteLn('Сегодня ',days[day_of_week], ‘, ',day,'/',month,’/', year) ;
END;

PROCEDURE Set_Date;
BEGIN
Write('Введите число, месяц и год, используя пробел в качестве разделителя’);
ReadLn(day,month,year); SetDate(year,month,day);
END;
Пример программы, демонстрирующий использование процедур GetDate и SetDate.USES Dos;CONST	days : ARRAY[0..6] OF STRING[11] =('Воскресенье','Понедельник','Вторник',	'Среда', 'Четверг' , 'Пятница',

Слайд 52Пример программы, демонстрирующий использование процедур GetDate и SetDate.
BEGIN
Get_Date; {получение текущей

даты}
Set_Date; {установка новой даты}
END.
Данная программа представляет собой аналог команды DOS DATE.


Если параметры в процедуре SetDate будут заданы некорректно, то вызов процедуры будет проигнорирован и дата не изменится.

Пример программы, демонстрирующий использование процедур GetDate и SetDate.BEGIN	Get_Date; 	{получение текущей даты}	Set_Date;	{установка новой даты}END.Данная программа представляет собой аналог

Слайд 53Процедуры работы с датой и временем.

Процедура GetTime

GetTime (var hour,

minute, second, hund: WORD);
возвращает текущее время, установленное в

системе.

Процедура SetTime


SetTime (hour, minute, second, hund: WORD);
устанавливает текущее время в операционной системе.

Процедуры работы с датой и временем.Процедура GetTime GetTime (var hour, minute,  second,  hund: WORD);возвращает текущее

Слайд 54Процедуры работы с датой и временем.

Значения параметров
hour

может принимать значения от

0 до 23
minute

значения от 0 до 59
second

значения от 0

до 59

hund


значения от 0 до 99,
сотые доли секунды

Процедуры работы с датой и временем.Значения параметровhourможет принимать значения от 0 до 23minute значения от 0 до

Слайд 55Пример программы, демонстрирующий использование процедур GetTime и SetTime.
USES Dos;
VAR
hour,minute,second,hund

: WORD;
PROCEDURE Get_Time;
BEGIN
GetTime(hour, minute,second,hund);
WriteLn('Текущее время',hour,':',minute,':',second,':',hund’);
END;
PROCEDURE Set_Time;
BEGIN
Write('Введите

часы, минуты и секунды');
ReadLn(hour, minute, second);
SetTime(hour,minute,second,0);
END;
BEGIN
Get_Time; {получение текущего времени}
Set_Time; {установка нового времени}
END.
Пример программы, демонстрирующий использование процедур GetTime и SetTime.USES Dos;VAR	hour,minute,second,hund  :  WORD;PROCEDURE Get_Time; 	BEGIN	GetTime(hour,  minute,second,hund);	WriteLn('Текущее

Слайд 56Процедуры работы с датой и временем.

Процедура GetFTime

GetFTime(var F; var

Time:Longlnt);
возвращает время и дату создания файла.
Переменная F должна быть файловой

переменной.

Время и дата возвращаются в переменной Time в упакованном формате в виде двойного слова (32 бита)

для их распаковки используется процедура UnpackTime

Процедуры работы с датой и временем.Процедура GetFTime GetFTime(var F; var Time:Longlnt);возвращает время и дату создания файла.Переменная F

Слайд 57Процедуры работы с датой и временем.

Процедура UnpackTime

UnpackTime(Time: Longlnt; VAR

DT: DateTime);
преобразовывает значение, переданное в параметре Time, в запись DT

типа DateTime (дата и время).

Тип DateTime описан в модуле Dos следующим образом:

TYPE
DataTime = RECORD
Year, Month, Day, Hour, Min, Sec : WORD;
END;

Процедуры работы с датой и временем.Процедура UnpackTime UnpackTime(Time: Longlnt; VAR DT: DateTime);преобразовывает значение, переданное в параметре Time,

Слайд 58Процедуры работы с датой и временем.

Процедура SetFTime

SetFTime(VAR F; Time: Longlnt);
устанавливает

время и дату создания файла.
Процедура PackTime

PackTime(VAR T: DateTime; VAR

Time: Longlnt);
преобразовывает запись типа DateTime в двойное слово, используемое процедурой SetFTime.
Процедуры работы с датой и временем.Процедура SetFTimeSetFTime(VAR F; Time: Longlnt);устанавливает время и дату создания файла.Процедура PackTime PackTime(VAR

Слайд 59О том, как прошла операция установки даты создания файла, можно

узнать из переменной DosError.
В случае успешного завершения переменная DosError будет

содержать 0.
В случае неудачи код ошибки может быть только 6 (разрушен заголовок файла).
О том, как прошла операция установки даты создания файла, можно узнать из переменной DosError.В случае успешного завершения

Слайд 60Следует запомнить, что файл, для которого необходимо изменить дату создания,

должен быть открыт для чтения.
Если файл открыт процедурой Rewrite, то

после того, как дата его создания изменена и в конце работы файл будет закрыт процедурой Close, дата создания автоматически обновится, т. е. установится текущая системная дата.
Поэтому, если происходит запись в файл, а затем требуется изменить дату его создания, можно просто выполнить перед процедурой SetFTime команду Reset, т.е. открыть файл для чтения.
Следует запомнить, что файл, для которого необходимо изменить дату создания, должен быть открыт для чтения.Если файл открыт

Слайд 61Пример программы, использующей процедуры работы с временем создания файла.
USES Dos;
VAR
ff :

TEXT;
hour, minute, second, hund : WORD; {переменные для GetTime}
FileTime : LongInt;

{переменная для GetFTime и SetFTime}
dt : DateTime; {переменная для PackTime и UnpackTime}

FUNCTION FZero(w : WORD) :STRING;
VAR
S : STRING;
BEGIN
Str(w:0, S);
IF Length(S) = 1 THEN S:= '0' + S;
FZero:= S ;
END;
Пример программы, использующей процедуры работы с временем создания файла.USES Dos;VAR	ff	: TEXT;	hour, minute, second, hund	: WORD; 	{переменные для

Слайд 62Пример программы, использующей процедуры работы с временем создания файла.
BEGIN
Assign(ff, Paramstr(1));
GetTime(hour,

minute,second,hund);
WriteLn('Текущее время',FZero(hour),':',FZero(minute),':‘,FZero(second));
Rewrite(ff); {создание нового файла}
GetFTime(ff,filetime); {получение времени создания}


UnpackTime(filetime, dt);
WITH dt DO
BEGIN
WriteLn('Файл создан ', FZero(hour),':',FZero(min),':',FZero(sec));
hour:= 13;
min:= 0;
sec:= 0;
year:=2009;
month:=4;
day:=2;
PackTime(dt, FileTime) ;
WriteLn('Устанавливаем время создания 13:00 2 апреля 2009 г.');
Reset (ff); {Открытие файла для чтения}
SetFTime(ff,FileTime);
END;
Close(ff); {Закрытие файла}
END.
Пример программы, использующей процедуры работы с временем создания файла.BEGIN	Assign(ff, Paramstr(1));	GetTime(hour, minute,second,hund); 	WriteLn('Текущее время',FZero(hour),':',FZero(minute),':‘,FZero(second)); 	Rewrite(ff); 		{создание нового файла}	GetFTime(ff,filetime);

Слайд 63Процедуры и функции проверки состояния диска.
Модуль Dos содержит ряд функций

и процедур для работы с диском.
С их помощью можно

осуществлять контроль за наличием свободного пространства на диске, контроль правильности записи на диск, а также определять общий объем памяти диска.
Процедуры и функции проверки состояния диска.Модуль Dos содержит ряд функций и процедур для работы с диском. С

Слайд 64Процедуры и функции проверки состояния диска.

Функция DiskFree

DiskFree( Drive: BYTE)

:Longlnt;
возвращает количество свободных байтов на указанном диске.
Drive — задает номер

диска:

и так далее …..

Процедуры и функции проверки состояния диска.Функция DiskFree DiskFree( Drive: BYTE) :Longlnt;возвращает количество свободных байтов на указанном диске.Drive

Слайд 65Если номер диска задан некорректно, то функция DiskFree возвращает значение

1.
Таким образом, всегда есть возможность проконтролировать правильность вызова функции.

Если номер диска задан некорректно, то функция DiskFree возвращает значение 1.Таким образом, всегда есть возможность проконтролировать правильность

Слайд 66Процедуры и функции проверки состояния диска.

Функция DiskSize

DiskSize( Drive: BYTE)

:Longlnt;
возвращает общее количество байтов на указанном диске.
Drive — задает номер

диска:

и так далее …..

Процедуры и функции проверки состояния диска.Функция DiskSize DiskSize( Drive: BYTE) :Longlnt;возвращает общее количество байтов на указанном диске.Drive

Слайд 67Процедуры и функции проверки состояния диска.
{Использование функций DiskFree и DiskSize}


USES Dos;
BEGIN
WriteLn('Объем вашего диска ', DiskSize(0) DIV 1024,' Kb');
WriteIn('Ha

диске свободно ', DiskFree(0) DIV 1024,' Kb');
END.
Процедуры и функции проверки состояния диска.{Использование функций DiskFree и DiskSize} USES Dos; BEGIN	WriteLn('Объем вашего диска ', DiskSize(0)

Слайд 68Процедуры и функции проверки состояния диска.

Процедура GetVerify

GetVerify( var Verify:

BOOLEAN);
используется для получения значения флага проверки DOS.
Если VERIFY находится во

включенном состоянии, т.е. равен ON (истина), то после того, как информация записана на диск, она снова читается и сверяется с оригиналом.
Если же флаг находится в выключенном состоянии, т.е. OFF (ложь), то информация записывается на диск без проверки.

Процедура SetVerify


SetVerify( Verify: BOOLEAN);
устанавливает или отменяет флаг проверки в зависимости от параметра значения параметра Verify.

Процедуры и функции проверки состояния диска.Процедура GetVerify GetVerify( var Verify: BOOLEAN);используется для получения значения флага проверки DOS.Если

Слайд 69Процедуры и функции проверки состояния диска.
{Контроль флага VERIFY}
USES Dos;
VAR
f

: BOOLEAN;
OffOn : STRING[14];
BEGIN
GetVerify(f);
If f Then OffOn :=

'ON - включен'
ELSE OffOn := 'OFF - выключен'
WriteLn('Флаг проверки ', OffOn);
f := Not(f);
WriteLn(Переключаем флаг проверки');
SetVerify(f);
END.

Данная программа получает флаг проверки и изменяет его значение на противоположное.

Процедуры и функции проверки состояния диска.{Контроль флага VERIFY}USES Dos;VAR	f   	: BOOLEAN;	OffOn 	: STRING[14]; BEGIN	GetVerify(f);	If f

Слайд 70Процедуры и функции работы с файлами.
Работа с файлами в Турбо

Паскале приводит к необходимости использования терминологии и средств MS-DOS.
Иногда

возникает необходимость поиска файлов с одинаковым именем, поиска по шаблону, выделения нужного файла из найденной группы файлов.
Процедуры FSplit, FExpand, FSearch, FindFirst, FindNext упрощают решение этих задач.
Процедуры и функции работы с файлами.Работа с файлами в Турбо Паскале приводит к необходимости использования терминологии и

Слайд 71Процедуры и функции работы с файлами.
Для работы с файлами в

модуле Dos определены следующие процедуры и функции :

Процедуры и функции работы с файлами.Для работы с файлами в модуле Dos определены следующие процедуры и функции

Слайд 72Процедуры и функции работы с файлами.

Процедура FindFirst

FindFirst(Path :STRING; Attr

:WORD; VAR S :SearchRec);
Поиск первого файла с заданным именем и

атрибутами в указанном каталоге.

Path — путь и имя для поиска;
Attr — задаваемые атрибуты файла;
S — переменная типа SearchRec.

Процедура FindNext


FindNext( VAR S :SearchRec);
Поиск следующего файла с заданным именем в указанном каталоге.

Процедуры и функции работы с файлами.Процедура FindFirst FindFirst(Path :STRING; Attr :WORD; VAR S :SearchRec);Поиск первого файла с

Слайд 73Тип SearchRec описан в модуле Dos следующим образом:

Поле Attr содержит

атрибуты файла, которые определяются константами атрибутов файла, описанными в модуле

Dos (см. таблицу).
Поле Time содержит дату и время создания файла в упакованном виде (для распаковки необходимо использовать процедуру UnpackTime).
Поле Size содержит размер файла в байтах.
Поле Name содержит имя найденного файла.
Поле Fill содержит служебную информацию MS-DOS и не должно модифицироваться.

TYPE
SearchRec = RECORD
Fill : ARRAY[1..21] OF BYTE;
Attr : BYTE;
Time : Longlnt;
Size : Longlnt;
Name : STRING[12];
END;

Тип SearchRec описан в модуле Dos следующим образом:Поле Attr 	содержит атрибуты файла, которые определяются константами атрибутов файла,

Слайд 74Процедура FindNext ищет следующий файл с именем и атрибутами, заданными

при вызове FindFirst, если имя файла было задано шаблоном.
Если

FindNext не находит больше файлов, в системной переменной DosError устанавливается значение 18.
Процедура FindNext ищет следующий файл с именем и атрибутами, заданными при вызове FindFirst, если имя файла было

Слайд 75Пример, демонстрирующий использование процедур поиска файлов.
USES Dos;
VAR
DT : DateTime;
S :

SearchRec;
Function FZero(d : WORD) : STRING;
var t : STRING;
Begin
Str(d:0,t);
IF Length(t)=1

THEN t:='0'+t;
FZero:=t;
End;
BEGIN
WriteLn;
FindFirst ('*.exe ', AnyFile, S);
While DosError=0 Do
begin
UnpackTime( S.Time, DT);
Write(S.Name, ' ',FZero (DT.Hour),':',FZero(DT.Min),':',FZero(DT.Sec));
WriteLn (' ',FZero(DT.Day),':',FZero(DT.Month),':', DT.Year);
FindNext(S);
end;
ReadLN
END.
Пример, демонстрирующий использование процедур поиска файлов.USES  Dos; VAR	DT		: DateTime;	S		: SearchRec;		Function FZero(d : WORD)	: STRING;	var 	t	: STRING;	Begin			Str(d:0,t);				IF

Слайд 76Процедуры и функции работы с файлами.

Функция FSearch

FSearch(Path : PathStr;

DirList : STRING) : PathStr;
Поиск файла в

списке каталогов.

Path — путь и имя файла, который необходимо найти;
Dirlist — это список каталогов, в которых будет проводиться поиск;
Тип PathStr описан в модуле Dos, как строковый тип STRING[79].

Каталоги в списке должны быть разделены точкой с запятой.

аналогично тому, как это делается в команде MS-DOS PATH.

Поиск всегда начинается с текущего каталога текущего диска.

В случае удачного поиска функция возвращает строку, в которой содержится полное имя файла (путь и имя).
В случае неудачи возвращается пустая строка.

Процедуры и функции работы с файлами.Функция FSearchFSearch(Path :  PathStr;  DirList :  STRING) :

Слайд 77Использование процедуры FSearch.
USES Dos;
VAR
F : PathStr;
BEGIN
F:=FSearch('NDD.EXE',GetEnv(‘PATH'));
{используется системная

переменная PATH для поиска}
IF F = ' ' THEN

WriteLn('Файл NDD.EXE не найден')
ELSE WriteLn(‘найден как ',F);
ReadLn; {ожидание нажатия Enter}
END.

Для поиска применяется переменная окружения DOS PATH.
Поиск проводится в каталогах, перечисленных в этой переменной, но можно задать и свой список каталогов.

Использование процедуры FSearch.USES  Dos; 	VAR 		F : PathStr;BEGIN	F:=FSearch('NDD.EXE',GetEnv(‘PATH'));	{используется системная переменная PATH для поиска} 	IF F =

Слайд 78Процедуры и функции работы с файлами.
Процедура FSplit

FSplit(Path : PathStr;

var Dir : DirStr; var Name :Namestr; var ExtrExtStr);
позволяет разбить

полный путь к файлу на три компонента.

Типы для работы с именами файлов определены в модуле Dos следующим образом:

ТУРЕ
ComStr = STRING[127];
PathStr = STRING[79];
DirStr = STRING[67];
NameStr = STRING[8];
ExtStr = STRING[4] ;

Процедуры и функции работы с файлами.Процедура FSplit FSplit(Path : PathStr; var Dir : DirStr; 					var Name :Namestr;

Слайд 79Использование процедуры FSplit
Uses Dos;
Var
Р: PathStr;
D: DirStr;
N: NameStr;
E:

ExtStr;
BEGIN
P:=FSearch('NDD.EXE', GetEnv('PATH')); {поиск файла}
If P ='' Then WriteLn('NDD.EXE

не найден')
Else
begin
WriteLn('найден как ', P);
FSplit( P, D, N, E) ; {разбиение на компоненты}
WriteLn('путь ',D );
WriteLn('имя ',N);
WriteLn('расширение ',Е);
end;
ReadLn; {ожидание нажатия Enter}
END.
Использование процедуры FSplitUses Dos;	Var		Р: PathStr; 		D: DirStr; 		N: NameStr; 		E:  ExtStr;BEGIN	P:=FSearch('NDD.EXE', GetEnv('PATH')); 	{поиск файла} 	If P

Слайд 80Использование процедур работы с атрибутами файлов.
USES Dos;
Var
F : File;
FileName : PathStr;
Attr : WORD;
NewAttr : BYTE;
BEGIN
Write('Введите имя файла :

'); ReadLn(FileName);
Assign(F, FileName);
GetFAttr(F, Attr); {получение атрибутов файла}
IF DosError

<> 0
THEN WriteLn('Ошибка DOS ', DosError)
ELSE
Begin
WriteLn('Файл ', FileName);
Write('Атрибуты файла = ', Attr,', '); {Определение атрибутов файла}
IF Attr AND Readonly <> 0 THEN Write('только для чтения; ');
IF Attr AND Hidden <> 0 THEN Write ('скрытый файл;');
IF Attr AND SysFile <> 0 THEN Write (' системный файл; ');
IF Attr AND VolumelD <> 0 THEN Write('метка тома; ');
IF Attr AND Directory <> 0 THEN Write('имя директории; ');
IF Attr AND Archive <> 0 THEN Write ('архивный файл); ');
WriteLn;
Использование процедур работы с атрибутами файлов.USES Dos;Var		F				:	File;	FileName	:	PathStr;	Attr			:	WORD;	NewAttr		:	BYTE;BEGIN	Write('Введите имя файла : '); ReadLn(FileName); 	 Assign(F, FileName);		GetFAttr(F, Attr); 						{получение

Слайд 81Использование процедур работы с атрибутами файлов.
WriteLn('Установка нового атрибута');
WriteLn('1- только для

чтения, 2- скрытый файл,');
WriteLn('3- системный файл, 4- метка тома, '

);
WriteLn('5 - имя директории,6 - архивный');
Write ('Введите новый атрибут '); ReadLn (NewAttr);
{установка новых атрибутов}
CASE NewAttr OF
1: SetFAttr(F, Readonly);
2: SetFAttr(F, Hidden);
3: SetFAttr(F, SysFile);
4: SetFAttr(F, VolumelD);
5: SetFAttr(F, Directory);
ELSE SetFAttr(F, Archive);
end; { of Case }
End;
END.
Использование процедур работы с атрибутами файлов.		WriteLn('Установка нового атрибута');			WriteLn('1- только для чтения, 2- скрытый файл,');			WriteLn('3- системный файл, 4-

Слайд 82Другие процедуры и функции.
В модуле Dos есть еще несколько процедур

и функций, не рассмотренных нами.
Это функция Dos-Version и процедуры

GetCBreak и SetCBreak.
Другие процедуры и функции.В модуле Dos есть еще несколько процедур и функций, не рассмотренных нами. Это функция

Слайд 83Другие процедуры и функции.
Функция DosVersion

DosVersion : WORD;
возвращает номер версии

DOS.
В старшем байте содержится целая часть номера версии например 6,

а в младшем байте — дробная часть номера, например 22.
В итоге получаем 6.22.
Другие процедуры и функции.Функция DosVersion DosVersion : WORD;возвращает номер версии DOS.В старшем байте содержится целая часть номера

Слайд 84Использование функции DosVersion.
USES Dos;
VAR
V : WORD;
BEGIN
V := DosVersion;
WriteLn('Версия

DOS ', Lo(V), '.',Hi(V));
END.

Использование функции DosVersion.USES Dos; 	VAR		V :  WORD;BEGIN	V := DosVersion;	WriteLn('Версия DOS ', Lo(V), '.',Hi(V)); END.

Слайд 85Другие процедуры и функции.
Процедура GetCBreak

GetCBreak(VAR BREAK: BOOLEAN);
возвращает значение системной

переменной MS-DOS BREAK.
Процедура SetCBreak

SetCBreak(BREAK: BOOLEAN);
устанавливает системную переменную MS-DOS BREAK.
Если

BREAK равна OFF, т.е. выключена, то прерывание программы осуществляется только во время операций ввода-вывода и выполнение программ происходит немного быстрее.
Если же BREAK равна ON, то прерывание происходит при любых системных вызовах.
Другие процедуры и функции.Процедура GetCBreak GetCBreak(VAR BREAK: BOOLEAN);возвращает значение системной переменной MS-DOS BREAK.Процедура SetCBreak SetCBreak(BREAK: BOOLEAN);устанавливает системную

Слайд 86Использование процедур GetBreak и SetBreak.
USES Dos;
VAR
f : BOOLEAN;
OffOn : STRING [14];
BEGIN
GetCBreak(f);
IF

f THEN OffOn:='ON - включен'
ELSE

OffOn:='OFF - выключен';
WriteLn('BREAK ', OffOn);
f:= NOT(f) ;
WriteLn('Изменяем значение Break');
SetCBreak(f);
END.
Использование процедур  GetBreak и SetBreak.USES Dos; VAR	f	: BOOLEAN;	OffOn	: STRING [14];BEGIN	GetCBreak(f);	IF  f  	THEN  OffOn:='ON

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика