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

5. Библиотека dos

5.1 Общая информация

Библиотека DOS предназначена для работы системными средствами операционной системы DOS версии 3.0 и выше.

Все основные процедуры и функции делятся на следующие разделы:

  1. Работа с системным таймером

  2. Работа с файлами

  3. Работа с прерываниями

  4. Работа с операционной системой

ПРЕРЫВАНИЕМ называется специальная программа, которая находится постоянно во время сеанса в операционной системе и используется в процессе обмена ЦП и периферийного устройства или исключительной ситуации при работе ЦП.

Прерывания делятся на 3 основные группы:

  • Прерывания платформы;

  • Прерывания операционной системы;

  • Пользовательские прерывания.

Примечание. Пользовательские прерывания разрешены в операционной системе MS DOS и Windows 9x.

При использовании любых библиотек Turbo Pascal запрещено переопределять типы и использовать имена, совпадающие с именами или константами, входящими в библиотеку.

Группы констант. Атрибуты файлов.

  • Только для чтения. Установлен нулевой разряд. Значение 1

  • Скрытый файл. Установлен 1 разряд. Значение 2.

  • Системный файл. 2 разряд. Значение 4.

  • Метка тома - название диска, винчестера или дискеты. 3 разряд. Значение 8.

  • Директория (каталог). 4 разряд. Значение $10 (в шестнадцатеричной системе исчисления).

  • Архив. 5 разряд. Значение $20.

Другие разряды в MS DOS не используются.

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

Скрытый системный файл: значение =$6.

Типы.

  1. Регистры центрального процессора

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;

  1. Структура для поиска файлов

SearchRec = record

File:array [1..21] of byte;

Attr:byte; {атрибут файла}

Time:longint; {упакованное дата и время создания файла}

Size:longint; {длина файла}

Name:string[12] {имя (8 байт-имя, 3 байта - расширение)}

End;

  1. Запись - распакованные дата и время

DateTime = record Year, Month, Day, Hour, Min, Sec:word

End;

5.2. Регистры центрального процессора.

Первый процессор фирмы INTEL имел длину разрядной сетки 8 бит и только 10 регистров; начиная с процессора 8086i регисты стали иметь длину 16 бит; начиная с процессора 80386i регистры стали иметь длину 32 бита. Итак все регистры делятся на следующие группы:

  1. Основные регистры.

  2. Регистры статуса и управления вычислений.

  3. Сегментные регистры.

5.2.1. Основные регистры:

1-ый регистр носит название А-регистр аккумулятор.

ЕАХ

31 15 АХ 0 0-7 регистр AL

АН

AL

8-15 регистр АН

32 разрядный регистр называется расширенный регистр ЕАХ.

Т. к. В ТР рассматриваются только команда 286 процессора, то для применения доступны только регистры AL,AH и АХ.

В ТР в тексте ассемблера не рекомендуется употреблять индификаторы с именами регистров. В ассемблерном коде эти имена будут игнорироваться и обращение будет к регистрам центрального процессора.

  1. Регистр базы: BH, BL, BX, EBX.

  2. Регистр счетчика: CH, CL ,CX ECX.

  3. Регистр данных: DH, DL, DX, EDX.

  4. Указатель базы ВР: Base Point.

В отличии от предыдущих регистров, регистр ВР 16-разрядный и не делится на младший и старший байты.

  1. Индекс источника SI: 32-разрядный ESI.

Структура аналогична (4).

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

  1. индекс приемника DI: EDI.

Употребляется для хранения адреса массива, для выдачи данных.

  1. Указатель стека: ESP Stack Pointer.

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

5.2.2. Регистры статуса и управления вычислений.

31

17

16

14

13

12

12

10

9

8

7

6

4

2

1

0

VM

RT

NT

IO

IO

PL

OF

II

IF

SF

ZF

AF

PF

CF

  1. Регистр flags  16-разрядный EFlags  32-разрядный.

Для процессора 386.

Статусные флаги:

CF перенос;

PFчетность;

AF вспомогательный перенос:

ZFнуль;

SFзнак;

OFпереполнение;

  1. Управление процессом вычисления.

Используется для управления отладочным режимом.

DFдекремент, увеличение.

TFловушка.

  1. Системные флаги:

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

VMвиртуальный режим;

RTвозобновление задачи;

NTвложенная задача;

IOPLуровень привилегии прерывания ввода-вывода;

IFфлаг разрешения прерывания;

В ТР во встроенном ассемблере из данной группы регистров анализируются только последние 2.

CFустановлен в “1”, если в результате операции был перенесен разряд из старшего бита в результате операции.

PFустановлен в “1”, если в результате операции получилось четное число.

AFаналогичен флагу CF, но устанавливается для двоичной и десятеричной арифметики.

ZFрезультат операции равен нулю.

SP установлен в “1” старший разряд в результате операции

TF установлен в “1” для отладочного режим только для процессоров 386 и выше.

IFесли он установлен в “1”, то запрещены другие прерывания.

DFустановлен в “1” если выполняется последовательность команд от старшего адреса к младшему.

OF установлен в “1” если произошел процесс 1 из старшего разряда, но не хватило разрядной сетки для результата вычсления.

IOPLхранит двубитный номер рапрв прерывания. Прерывания с максимальной рплыврпшр имеет номер 0,а с минимальной 3.

NT установлен в “1”, если программа выполняет программу, вызванную из другой программы.

RT установлен в “1”,если программист отменяет обработку особых ситуаций и возвращает управление программе.

VM установлен в “1” в режиме многозадачности.

  1. Указатель команд IP: EIP.

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

5.2.3. Сегментные регистры.

Служат для хранения адресов основных частей программы.

  1. CS-регистр  code segment  сегмент кода.

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

ECS  запрещен для программирования.

  1. DS  data segment  сегмент данных.

Хранит адрес начала данных в программном коде.

  1. SS  stack segment  сегмент стека.

ESS  запрещен для программирования.

Дополнительные сегментные регистры: ES, FS, GS. Используются для дублирования соответствующих регистров.

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

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

FindFirst (Path:PathStr; Attr:byte; var F:SearchRec);

{Path – путь к директории; Attr – атрибут файла; F – первый найденный файл.}

Если файл не найден, то переменная DosError не равна 0.

Следующий файл можно найти используя

FindNext (var F:SearchRec);

Процедуру можно использовать только после употребления FindFirst. Если дополнительных файлов нет, то переменная DosError не равна 0.

Кроме этих двух процедур пользователь имеет возможность прочитать различные параметры о любом используемом в программе файле. !!!Файл предварительно должен быть назначен.

Прочитать параметры (атрибут) файла.

GetFAttr(var F;var Attr:byte);

Возвращает в переменной Attr атрибуты файла, связанного с F, но еще не открытого.

Установить файловый атрибут.

SetFAttr(var F;Attr:byte);

Устанавливает заданные в Attr атрибуты файла, уже связанного с F, но еще не открытого.

Прочитать дату и время последнего обновления файла.

GetFTime(var F;Time:longint);

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

Установить время и дату последнего обновления файла

SetFTime(var F; Time:longint);

Устанавливает дату и время обновления файла, которые в упакованном виде должны быть заданы как Time.

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

UnpackTime(Time:longint;var Pack:DataTime);

Преобразует 4-байтовое упакованное значение даты и времени, возвращаемое GetFTime, FindFirst или FindNext, в распакованную запись типа DateTime.

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

PackTime(var Pack: DataTime;var Time:longint);

Преобразует запись Pack в 4-байтовое упакованное значение даты и времени типа longint, используемое процедурой SetFTime. Поля записи DateTime не проверяются на диапазон.

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

FSearch(Name:PathStr; DirList:string):PathStr;

Ищет файл Name в списке каталогов DirList. Элементы списка разделяются точкой с запятой.

FExpand(Name:PathStr; DirList:string):PathStr;

Берет имя файла Name и возвращает полное имя файла (устройство, каталог, имя и расширение).

FSplit(Path: PathStr; var Dir: DirStr; var Name: NameStr; var Ext: ExtStr);

Разбивает имя файла Path на 3 составные части (каталог, имя файла, расширение).

5.4 Функции работы с магнитными носителями.

Определить размер носителя

DiskSize (DR:byte):longint;

DR – номер драйвера. Устройство А имеет номер 0. 2 Гб – максимальный размер ностиеля.

Размер свободной памяти

DiskFree (DR:byte):longint;

Возвращает число свободных байтов на диске DR: 0 – любой текущий диск, 1 – диск А, 2 – диск В и т.д. Если номер ошибочен, возвращает –1.

5.5. Обработка прерываний.

Все процедуры и функции данной группы работают с типом Register.

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

Выполнить прерывание:

Intr(IntNo: byte, Var R: Registers);

IntNo – номер прерывания R - содержимое регистров

Выполнить прерывания MS-DOS:

MSDOS(Var R:Registers);

Сохранить вектора прерываний:

SwapVectors

При употреблении прерывания с использованием библиотеки DOS рекомендуется перед и после прерывания ставить процедуру SwapVectors. Особенно это касается работы асинхронных периферийных устройств, таких как клавиатура, мышь, накопитель на жестком или гибком магнитных дисках и т.д. SwapVectors необходимо ставить так как TPascal, а также различные программыоболочки имеют собственные программы по обработке прерываний от данных устройств.

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

Пусть наша программа располагается по адресу nnnn : kkk, спроектируем программу на TP, одновременно с нашей программой по адресу: WNNN : NNNN располагается драйвер клавиатуры TP, по адресу yyyy:yyyy располагается драйвер обработки клавиатуры ОС и по адресу: xxxx:xxxx – драйвер клавиатуры платформы.

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

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

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

Для сохранения старого значения адреса программы в библиотеке Dos используется процедура: GetVect (Intr:byte; var P:pointer); Intr – номер прерывания, Р – указатель на адрес программы прерывания.

Для установки собственного драйвера используется следующая процедура: SetIntVec (Intr:byte; var P:pointer); Intr - № прерывания, которое будет обрабатываться программой, Р – адрес подпрограммы обработки прерывания.

Адрес вычисляется аналогично адресу любой переменной.

Пример1.

Написать программу по установки монитора в режим 320х200 точек с использованием 256 цветов. Прерывания вызывать используя библиотеку DOS.

Uses dos;

Var R:Registers;

Begin

SwapVectors;

R.ah:=0;

R.al:=$13;

Intr($10,R);

SwapVectors;

End.

Пример 2.

Напишем процедуру по установке пиксела с использованием той же библиотеки.

Uses dos;

Procedure my_pixel( x,y : word; Color : byte);

Var R:Registers;

Begin

SwapVectors;

R.Ah:=$C;

R.Al:=Color;

R.Cx:=x;

R.dx:=y;

Intr($10,R);

SwapVectors

End;

5.6. Другие возможности.

Сделать программу резидентной: Keep (ExitCode:word); Употребление данной процедуры внутри программы приводит к тому, что при запуске программы она не снимается после окончания выполнения и постоянно находится загруженной в ОП.

ExitCode – значение передаётся в системную переменную EwdLevel после прохождения загруженной программы.

Выполнить загрузочный модуль внутри программы.

Exec (Path, Com : String), Path – полный путь к выполняемой программе, Com – параметры для выполнения программы.

Имя программы должно быть с расширением. Для успешного выполнения программы необходимо увеличить размер списка и кучи  в 2 раза больше чем в стандартных установках TP. Правильность выполнения необходимо анализировать системной переменной DosError.

Возвратить значение системной переменной ErrorLevel. DosExitCode : word;

Процедуры обработки прерывания Ctrl+Break, Ctrl+C.

При стандартной проектировании на ТР под Ms-Dos нажатие этих клавиш приводит к снятию программы. У программиста в библиотеке Dos имеются средства по отмене данного действия, это производится с помощью SetBreak (Code: Boolean).

Code = 1 выполняется стандартное действие, иначе программа на эти клавиши не реагирует. GetBreak (var Code: boolean);

5.7. Некоторые прерывания платформы IBM PC.

$10 – дисплей, функция в АН.

1. АН = 0 – режим VGA и ниже.

AL = номер режима ( 13 для 320*200*256 VGA).

2. АН = С установить pixel. Для графических режимов (VGA и ниже)

AL – цвет пиксела (в зависимости от видео режима)

СХ – координаты по оси Х

DX – координаты по оси Y

3. AH = D – прочесть пиксел

СХ – координаты по оси Х

DX – координаты по оси Y

Возврат из прерывания в регистре AL – цвет пикселя.

4. AH = F – прочитать номер видеорежима.

возврат из прерывания AL – номер, АН – количество символов в строке, в ВН – номер текущей видеостраницы, для режимов, в которых используется несколько видеостраниц. В текстовом режиме 8 страниц.

5. АН =1А – чтение или запись конфигурации VGA, если чтение регистра AL = 0, если запись, то AL = 1.

Для нормальной работ в регистре ВН записывается номер устройства при чтении из данного регистра возвращается тип адаптера: 0 – графического адаптера нет, 1 – MDA, 2 – CGA, 3, 4 – EGA, 5 – Mono EGA, 6 – PGC, 7 – mono VGA, 8 – VGA, A, B, C – MCGA.

6. АН=1С сохранить или восстановить значение в виде регистров адаптера VGA. AL = 0 – чтение, AL = 1 – запись.

По адресу ES:DI должна располагаться информационная структура длиной в 1 кБайт, в которую будут записаны (будут считаны) значения регистров адаптеров VGA.

7. АН= 4Fh Все функции VBE вызываются с регистром AH = 4Fh. Регистр AL используется для указания, какая функция VBE будет выполнена. При этом регистр BL в исключительных ситуация будет указывать специфическую подфункцию.

Функции 00h-0Fh зарезервированы для стандартных функций VBE. Функции 10h-FFh зарезервированны для поддержки дополнительных спецификаций VBE.

Результат выполнения функции возвращается через регистр AX :

AL == функция не поддерживается

AL <> 4Fh функция поддерживается

AH == 00h вызов функции выполнен успешно

AH == 01h вызов функции провален

AH == 03h функция не поддерживается в текущей конфигурации аппаратного обеспечения

AH == 03h вызов функции нелегален в текущем видеорежиме

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

  1. в регистр AH записывается значение 4Fh

  2. в регистр AL – 00h

  3. es:[di] должен указывать на область памяти, выделенной под структуру VbeInfoBlock.

  4. выполняется прерывание Int 10h

  5. функция выполнена успешно, если регистр AH=0

Пример : допустим, что мы уже имеем переменную VIBlock типа VbeInfoBlock, тогда вызов процедуры

будет выглядеть следущим образом

asm

mov ax,4F00h

les di,@VIBlock

int 10h

mov Result,ah

end;

Структура информации о видеоадаптере.

type VbeInfoBlock = record

VbeSignature : array[1..4] of char;

VbeVersion : word;

OemStringPtr : pointer;

Capabilities : array[1..4] of byte;

VideoModePtr : pointer;

TotalMemory : word;

OemSoftwareRev : word;

OemVendorNamePtr : pointer;

OemProductNamePtr : pointer;

OemProductRevPtr : pointer;

Reserved : array[1..222] of byte;

end;

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

VbeSignature : поле, заполненное ASCI символами = ‘VESA’.

VbeVersion : cтарший байт содержит номер версии, младший – подверсии.

OemStringPtr : указатель на строку, содержащую имя производителя.

Capabilities: поле длиной 4 байта указывает поддержку специальных графических возможностей.

VideoModePtr : указатель на список видеорежимов, заканчивающийся –1(0FFFFh).

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

OemSoftwareRev : номер ревизии VBE производителя.

OemVendorName : указатель на строку, содержащую имя производителя видеоадаптера,

заканчивающуюся -1.

OemProductName : указатель на строку, содержащую название видеокарты,

заканчивающуюся -1.

OemProductRevPtr : указатель на строку, содержащую версию ревизии видеокарты.

Reserved : зарезервированно для будущих расширений стандарта.

Определение информации о видеорежиме.

Определение информации о видеорежиме :

  1. в регистр AH записывается значение 4Fh

  2. в регистр AL – 01h

  3. в регистр CX – номер видеорежима

4) es:[di] должен указывать на область памяти, выделенной под структуру ModeInfoBlock.

5) выполняется прерывание Int 10h

Структура информации о видеорежиме.

type ModeInfoBlock = record

ModeAttributes : word;

WinAAttributes : byte;

WinBAtrributes : byte;

WinGranularity : word;

WinSize : word;

WinASegment : word;

WinBSegment : word;

WinFuncPtr : pointer;

BytesPerScanLine : word;

XResolution : word;

YResolution : word;

XCharSize : byte;

YCharSize : byte;

NumberOfPlanes : byte;

BitsPerPixel : byte;

NumberOfBanks : byte;

MemoryModel : byte;

BankSize : byte;

NumberOfImagePages : byte;

Reserved : byte;

DC : array[1..9] of byte;

Other : array[1..216] of byte;

end;

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

ModeAttributes : аттрибуты видеорежима.

WinAAttributes и WinBAttributes : аттрибуты, описывающие схему доступа к кадровому буферу, а так же расположение в нем окон.

WinASegment и WinBSegment : сегменты адресного пространства процессора, в которых расположены окна.

WinGranularity : наименьший размер окон в килобайтах, которые могут быть расположены в памяти кадрового буфера.

WinSize : размер окна в килобайтах.

WinFuncPtr : указатель на оконную функцию.

XResolution и YResolution : для графического режима определяет ширину и высоту кадрового буфера в пикселях, для текстового – в символах.

XCharSize и YCharSize : размер символа в пикселях.

NumberOfPlanes : количество страниц, доступных в данном видеорежиме для программ (для стандартного 16 цветного VGA режима равно 4).

BitsPerPixel : количество битов на пиксел.

MemoryModel : определяет основной тип организации памяти в данном видеорежиме

00h = текстовый режим

01h = CGA

02h = Hercules

03h = постраничный

04h = упакованное хранение пиксела

05h = 4 и 256 цветный

06h = Direct Color

07h = YUV

08h-0Fh = зарезервировано

10h-FFh = определено производителем видеоадаптера

NumberOfBanks : количество банков , в которые сгруппированы сканлинии (для режимов 0Dh-13h равно 1).

BankSize : размер банка в килобайтах.

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

Dc : набор атрибутов, определяющих цветовую модель.

8. Прерывание 12 – определить размер памяти в АХ –объём памяти в КБайтах.

9. Прерывание 13 – работа с дисками и дискетами, зависит от AH.

10. Прерывание 14 – работа с COM портом, зависит от АН: АН = 0 – инициализация порта, в AL – требуемый параметр, в DX – номер используемого канала.

возврат из прерывания: АН – статус управления, AL – статус модемов.

АН = 1 – передать символ: AL – символ, DX – номер канала, возврат такой же как и в предыдущем.

AH = 2 – прочитать символ, DX – номер канала.

Возврат: АН –статус управления AL – символ.

11. Прерывание 16 – работа с клавиатурой.

От АН:

0 – считать символ. Возврат: AL – код символа, АН – код сканирования.

1 – тест на наличие символа. Возврат: флаг равенства 0, ZF = 1. AL, AH – аналогично предыдущему случаю.

2 – прочитать статус клавиатуры поразрядно. Если в 1 установлен 0-й разряд, то нажат правый Shift.

1-й разряд – левый Shift.

2-й – Ctrl

3-й – Alt

4-й – Scroll Lock

5-й – Num Lock

6-й – Insert

3 – установки для клавиатуры, время задержки, количество повторов и т. д.

4 – установить щелчок при нажатии на клавишу

5 – записать символ в буфер: CL – код символа, СН – код сканирования.

Возврат из прерывания: AL = 0 – символ записан успешно, если 1 – ошибка.