- •Ижевский государственный технический университет
- •6. Оверлей 32
- •8.10. Стандартные библиотеки 52
- •Экзаменационные вопросы 52
- •1. Назначение системного программного обеспечения (спо)
- •Ос и языки программирования
- •2. Обслуживание ввода-вывода
- •2.1. Организация ввода-вывода
- •2.2 Способы управления пу Понятие драйвера пу
- •2.2.1. Синхронный ввод-вывод
- •2.2.2. Асинхронный ввод-вывод
- •2.2.3. Буферный ввод-вывод
- •3. Буферный обмен информацией в языках программирования.
- •4. Управление и доступ к оперативной памяти.
- •4.3. Управление реальной памятью
- •Разделы фиксированной длины
- •Использование разделов переменного размера
- •Использование перемещаемых разделов
- •Защита памяти
- •5. Библиотека dos
- •12. Прерывание 17h – работа с принтером
- •Функция 00h – прочитать время
- •6. Оверлей
- •6.1 Структура программного комплекса
- •6.2. Распределение памяти в оверлейной структуре
- •7. Встроенный в turbo pascal assembler
- •7.2. Режимы адресации в Ассемблере
- •7.4. Выражения для управления памятью
- •7.5.Выражения в Ассемблере
- •7.6. Команды Ассемблера
- •7.6.3. Команды ввода вывода
- •7.6.4. Адресные команды
- •7.6.7. Строковые команды
- •Test Аналогична команде and, но результат операции не записывается в 1 операнд.
- •Установить операнд:
- •8. Язык программирования с.
- •8.10. Стандартные библиотеки
- •Литература
- •Экзаменационные вопросы
- •На тему: название темы
- •Примечание: если курсовая работа выполняется двумя и более студентами, обязательно разбивка задач для каждого студента конкретно.
- •Состав пояснительной записки:
5. Библиотека dos
5.1 Общая информация
Библиотека DOS предназначена для работы системными средствами операционной системы DOS версии 3.0 и выше.
Все основные процедуры и функции делятся на следующие разделы:
Работа с системным таймером
Работа с файлами
Работа с прерываниями
Работа с операционной системой
ПРЕРЫВАНИЕМ называется специальная программа, которая находится постоянно во время сеанса в операционной системе и используется в процессе обмена ЦП и периферийного устройства или исключительной ситуации при работе ЦП.
Прерывания делятся на 3 основные группы:
Прерывания платформы;
Прерывания операционной системы;
Пользовательские прерывания.
Примечание. Пользовательские прерывания разрешены в операционной системе MS DOS и Windows 9x.
При использовании любых библиотек Turbo Pascal запрещено переопределять типы и использовать имена, совпадающие с именами или константами, входящими в библиотеку.
Группы констант. Атрибуты файлов.
Только для чтения. Установлен нулевой разряд. Значение 1
Скрытый файл. Установлен 1 разряд. Значение 2.
Системный файл. 2 разряд. Значение 4.
Метка тома - название диска, винчестера или дискеты. 3 разряд. Значение 8.
Директория (каталог). 4 разряд. Значение $10 (в шестнадцатеричной системе исчисления).
Архив. 5 разряд. Значение $20.
Другие разряды в MS DOS не используются.
Примечание. Архивный файл, как правило, относятся к любому файлу, за исключением метки тома и директории.
Скрытый системный файл: значение =$6.
Типы.
Регистры центрального процессора
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;
Структура для поиска файлов
SearchRec = record
File:array [1..21] of byte;
Attr:byte; {атрибут файла}
Time:longint; {упакованное дата и время создания файла}
Size:longint; {длина файла}
Name:string[12] {имя (8 байт-имя, 3 байта - расширение)}
End;
Запись - распакованные дата и время
DateTime = record Year, Month, Day, Hour, Min, Sec:word
End;
5.2. Регистры центрального процессора.
Первый процессор фирмы INTEL имел длину разрядной сетки 8 бит и только 10 регистров; начиная с процессора 8086i регисты стали иметь длину 16 бит; начиная с процессора 80386i регистры стали иметь длину 32 бита. Итак все регистры делятся на следующие группы:
Основные регистры.
Регистры статуса и управления вычислений.
Сегментные регистры.
5.2.1. Основные регистры:
1-ый регистр носит название А-регистр аккумулятор.
ЕАХ
31 15 АХ 0 0-7 регистр AL
|
АН |
AL |
32 разрядный регистр называется расширенный регистр ЕАХ.
Т. к. В ТР рассматриваются только команда 286 процессора, то для применения доступны только регистры AL,AH и АХ.
В ТР в тексте ассемблера не рекомендуется употреблять индификаторы с именами регистров. В ассемблерном коде эти имена будут игнорироваться и обращение будет к регистрам центрального процессора.
Регистр базы: BH, BL, BX, EBX.
Регистр счетчика: CH, CL ,CX ECX.
Регистр данных: DH, DL, DX, EDX.
Указатель базы ВР: Base Point.
В отличии от предыдущих регистров, регистр ВР 16-разрядный и не делится на младший и старший байты.
Индекс источника SI: 32-разрядный ESI.
Структура аналогична (4).
Как правило, данный регистр употребляется для хранения адреса массива, для хранения данных.
индекс приемника DI: EDI.
Употребляется для хранения адреса массива, для выдачи данных.
Указатель стека: 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 |
Регистр flags 16-разрядный EFlags 32-разрядный.
Для процессора 386.
Статусные флаги:
CF перенос;
PFчетность;
AF вспомогательный перенос:
ZFнуль;
SFзнак;
OFпереполнение;
Управление процессом вычисления.
Используется для управления отладочным режимом.
DFдекремент, увеличение.
TFловушка.
Системные флаги:
Устанавливаются в процессе выполнения следующих команд ассемблера.
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” в режиме многозадачности.
Указатель команд IP: EIP.
Служит для хранения адреса текущей выполняющейся команды, запрещенной для прерывания вообще.
5.2.3. Сегментные регистры.
Служат для хранения адресов основных частей программы.
CS-регистр code segment сегмент кода.
Часть программы, в которой хранятся команды для выполнения.
ECS запрещен для программирования.
DS data segment сегмент данных.
Хранит адрес начала данных в программном коде.
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 вызов функции нелегален в текущем видеорежиме
Для определения информации о видеодаптере необходимо определить ее структуру, выделить память под возвращаемые данные. Вызыв функции происходит следущим образом:
в регистр AH записывается значение 4Fh
в регистр AL – 00h
es:[di] должен указывать на область памяти, выделенной под структуру VbeInfoBlock.
выполняется прерывание Int 10h
функция выполнена успешно, если регистр 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 : зарезервированно для будущих расширений стандарта.
Определение информации о видеорежиме.
Определение информации о видеорежиме :
в регистр AH записывается значение 4Fh
в регистр AL – 01h
в регистр 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 – ошибка.