Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Подпрограммы обработки директорий




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

Процедура erase(f: file) удалит файл, связанный с файловой переменной f. Если такого файла нет, произойдет ошибка, реакцию на которую можно отрегулировать при помощи директивы компилятора {$I}.

 

Процедура rename(f: file; s: string) даст файлу, связанному с файловой переменной f, новое имя, указанное в строке s. Если такого файла нет, произойдет ошибка.

 

Процедура chdir(s: string) сделает текущей директорию, указанную в строке s. Если такой директории нет, произойдет ошибка.

 

Процедура getdir(disk: byte; s:string) запишет в строку s имя текущей директории на указанном диске (0 ― текущий диск, 1 ― диск А, 2 ― диск В и т.д.).

 

Процедура mkdir(s: string) создаст в текущей директории новую поддиректорию с указанным в строке s именем. Если в текущей директории уже существуют файл или директория с указанным именем, произойдет ошибка.

 

Процедура rmdir(s: string) удалит пустую директорию с заданным в строке s именем. Если такой директории нет, произойдет ошибка.

 

Пробельные символы

К пробельным символам (присутствующим в файле, но невидимым на экране) относятся:

· символ горизонтальной табуляции (#9);

· символ перевода строки (#10) (смещение курсора на следующую строку, в той же позиции);

· символ вертикальной табуляции (#11);

· символ возврата каретки (#13) (смещение курсора на начальную позицию текущей строки; в кодировке UNIX один этот символ служит признаком конца строки);

· символ конца файла (#26);

· символ пробела (#32).

 

СОДЕРЖАНИЕ РАБОТЫ: Создать программу считывания произвольного файла и создание нового нетипизированного файла, копируя блоками. Научиться использовать подпрограммы обработки директорий.

 

ВОПРОСЫ ВЫХОДНОГО КОНТРОЛЯ:

1. Приведите пример объявления нетипизированного файла.

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

3. Перечислите и опишите подпрограммы обработки директорий.

4. Перечислите пробельные символы.

ДОМАШНЕЕ ЗАДАНИЕ

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


ЛАБОРАТОРНАЯ РАБОТА №22 Тема: Разработка программ с использованием прерываний BIOS и DOS, процедурных типов

Цель: Развить умения разрабатывать программы с использованием процедурного типа

Программное обеспечение: TURBO PASCAL 7.1

Оснащение: персональный компьютер, практикум

Время проведения: 2 уч. часа

 

Литература:

Павловская Т.А. Паскаль. Программирование на языке высокого уровня. Учебник для вузов. СПб.: Питер, 2008. С. 153-163.

Время выполнения: 2 часа.

ВОПРОСЫ ВХОДНОГО КОНТРОЛЯ:

1. Перечислите типы файловых переменных, пример их объявления.

2. Запишите структуру процедур открытия и закрытия файла.

3. Перечислите и опишите подпрограммы обработки директорий.

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Структура *.ЕХЕ программ

Программа в формате ЕХЕ, созданная компоновщиком, состоит из следующих двух частей:

1) заголовка ― записи, содержащей информацию по управлению и настройке программы;

2) собственно загрузочного модуля.

В заголовке находится информация о размере выполняемого модуля, области загрузки в памяти, адресе стека и относительных смещениях, которые должны заполнить машинные адреса в соответствии с относительными шестнадцатеричными позициями:

00 ― (шестнадцатеричное 4D5A) компоновщик устанавливает этот код для идентификации правильного ЕХЕ файла;

02 ― число байтов в последнем блоке ЕХЕ файла;

04 ― число блоков по 512 байт ЕХЕ файла, включая заголовок;

06 ― число настраиваемых элементов;

08 ― число 16-ти байтовых блоков (параграфов) в заголовке (необходимо для локализации начала выполняемого модуля, следующего после заголовка);

0А ― минимальное число параграфов, которые должны находится после загруженной программы;

0С ― переключатель загрузки в младшие или старшие адреса. При компоновке пользователь должен решить, будет ли его программа загружаться для выполнения в младшие адреса памяти или в старшие. Обычным является загрузка в младшие адреса. Значение 0000 указывает на загрузку в старшие адреса, а FFFF ― в младшие. Иные значения определяют максимальное число параграфов, которые должны находиться после загруженной программы;

0Е ― относительный адрес сегмента стека в выполняемом модуле;

10 ― адрес, который загрузчик должен поместить в регистр SP перед передачей управления в выполнимый модуль;

12 ― контрольная сумма ― сумма всех слов в файле (без учета переполнения) используется для проверки потери данных;

14 ― относительный адрес, который загрузчик должен поместить в регистр IP до передачи управления в выполняемый модуль;

16 ― относительный адрес кодового сегмента в выполняемом модуле. Этот адрес загрузчик заносит в регистр CS;

18 ― смещение 1-ого настраиваемого элемента в файле;

1А ― номер оверлейного фрагмента: 0 означает, что заголовок относится к резидентной части ЕХЕ файла;

1С ― таблица настройки, содержащая переменное число настраиваемых элементов, соответствующее значению по смещению 06.

Заголовок имеет минимальный размер 512 байт и может быть больше, если программа содержит большое число настраиваемых элементов. Позиция 06 в заголовке указывает число элементов в выполняемом модуле, нуждающихся в настройке. Каждый элемент настройки в таблице, начинающейся в позиции 1С заголовка, состоит из 2-х байтовых величин смещений и 2-х байтовых сегментных значений. Система строит префикс программного сегмента (PSP) следом за резидентной частью COMMAND.COM, которая выполняет операцию загрузки. Затем COMMAND.COM осуществляет следующее:

― считывает форматированную часть заголовка в память;

― вычисляет размер выполнимого модуля (общий размер файла в позиции 04 минус размер заголовка в позиции 08) и загружает модуль в память с начала сегмента;

― считывает элементы таблицы настройки в рабочую область и прибавляет значение каждого элемента таблицы к началу сегмента (позиция 0E);

― устанавливает в регистрах SS и SP значения из заголовка и прибавляет адрес начала сегмента;

― устанавливает в регистрах DS и ES сегментный адрес PSP;

― устанавливает в регистре CS адрес PSP и прибавляет величину смещения в заголовке (позиция 16) к регистру CS. Если сегмент кода непосредственно следует за PSP, то смещение в заголовке равно 256 (100H). Регистровая пара CS:IP содержит стартовый адрес в кодовом сегменте, т.е. начальный адрес программы. После инициализации регистры CS и SS содержат правильные адреса сегментов, а регистр DS (и ES) должен быть настроен в программе на собственный сегмент данных:

Mov AX,datasegname; {Установить в DS}

Mov DS,AX; {адрес сегмента данных}

 

Структура СОМ - программ.

Различия между программами в ЕХЕ и СОМ файлах:

― РАЗМЕР ПРОГРАММЫ. Программа в формате ЕХЕ может иметь любой размер, в то время как СОМ-файл ограничен размером одного сегмента и не превышает 64 К. Размер СОМ-файла всегда меньше, чем размер соответствующего ЕХЕ-файла; одна из причин этого - отсутствие в СОМ-файле 512-байтового заголовка ЕХЕ-файла.

― СЕГМЕНТ СТЕКА. В ЕХЕ-программе определяется сегмент стека, в то время как СОМ-программа генерирует стек автоматически. Таким образом, при создании ассемблерной программы, которая будет преобразована в СОМ-файл, стек должен быть опущен.

― СЕГМЕНТ ДАННЫХ. В ЕХЕ-программе обычно определяется сегмент данных, а регистр DS инициализируется адресом этого сегмента. В СОМ-программе все данные должны быть определены в сегменте кода.

― ИНИЦИАЛИЗАЦИЯ. В ЕХЕ-программе выполняется инициализация регистра DS. Так как в СОМ-программе стек и сегмент данных не определены, то эти шаги отсутствуют. Когда СОМ-программа начинает работать, все сегментные регистры содержат адрес PSP ― 256 байтовый блок, который резервируется операционной системой DOS непосредственно перед СОМ- или ЕХЕ-программой в памяти. Так как адресация начинается со смещения 100Н от начала PSP, то в программе необходимо указать директиву ORG 100H.

Процедурные типы

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

Приведем некоторые примеры описаний процедурного типа:

type

Proc = procedure;

SwapProc = procedure(var X, Y: Integer);

StrProc = procedure(S: String);

MathFunc = function(X: Real): Real;

DeviceFunc = function(var F: text): Integer;

MaxFunc = function(A, B: Real; F: MathFunc): Real;

Имена параметров в описании процедурного типа играют чисто декоративную роль ― на смысл описание они не влияют.

 

Процедурные значения

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

* значениями nil;

* ссылкой на переменную процедурного типа;

* идентификатором процедуры или функции.

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

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

Рассмотрим, например, следующее описание:

var

P: SwapProc;

F: MathFunc;

procedure Swap(var A, B: Integer); far;

var

Temp: Integer;

begin

Temp:= A;

A:= B;

B:= Temp;

end;

function Tan(Angle: Real); far;

begin

Tan:= Sin(Angle) / Cos(Angle);

end;

Переменным P и F можно присвоить значения следующим образом:

P:= Swap;

F:= Tan;

а вызовы с помощью P и F можно выполнить так:

P(I, J); { эквивалентно Swap(I, J) }

X:= F(X); { эквивалентно X:= Tan(X) }

Использование процедурных переменных, которым в операторе вызова процедуры или функции присваивается значение nil, приводит к ошибке. Значение nil предназначено для указания того, что процедурная переменная не присвоена, где процедурная переменная может получить значение nil, участвующие в этой процедурной переменной вызовы процедур и функций следует подвергать проверке: if @P <> nil then P(I, J);

Обратите внимание на использование операции @ для указания того, что P проверяется, а не вызывается.

СОДЕРЖАНИЕ РАБОТЫ: Разработать программу определения значений функций а=0; 0,5; 1,0 с использованием параметров процедурного или функционального типа.

Вариант Задание
№1
№2
№3
№4
№5
№6
№7
№8
№9
№10
№11
№12
№13
№14
№15
№16

ВОПРОСЫ ВЫХОДНОГО КОНТРОЛЯ:

1. Опишите структуру переменных процедурного типа.

2. Перечислите процедур и функций обработки прерываний.

ДОМАШНЕЕ ЗАДАНИЕ

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






Поделиться с друзьями:


Дата добавления: 2016-10-06; Мы поможем в написании ваших работ!; просмотров: 400 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Так просто быть добрым - нужно только представить себя на месте другого человека прежде, чем начать его судить. © Марлен Дитрих
==> читать все изречения...

2443 - | 2198 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.