- •Історична довідка
- •Характеристика й особливості мови
- •Алфавіт мови
- •Службові (зарезервовані) слова.
- •Структура програми мови Turbo Pascal
- •Розділ оголошень і угод
- •Розділ текстів процедур і функцій
- •Розділ основного блоку програми
- •Процедури введення-виведення. Деякі вбудовані функції Турбо-Паскаля.
- •Функції числових параметрів.
- •Базові управляючі конструкції Турбо-Паскаля Оператори умовного переходу.
- •1. Оператор if.
- •2. Оператор вибору (case)
- •Оператори циклів у Паскалі
- •1. Цикл із післяумовою (Repeat)
- •2. Цикл із предумовою (While)
- •3. Цикл із лічильником або параметром (For)
- •Концепція типів даних. Типи даних в мові Pascal
- •Дійсні типи
- •Бульовий (логічний) тип
- •Символьні і рядкові змінні
- •1. Символьний тип
- •2. Рядковий тип
- •Перерахований та обмежений типи
- •1. Перерахований тип
- •2. Обмежений тип
- •1. Поняття масиву. Одномірні масиви
- •2. Багатомірні масиви
- •3. Сортування і пошук
- •Множинний тип
- •Тип запис
- •Процедури і функції
- •Формальні і фактичні параметри. Механізм параметрів
- •Параметри - значення
- •Параметри-змінні
- •Безтипові параметри
- •Приведення типів.
- •Процедурні типи
- •Рекурсія Рекурсивні визначення
- •Рекурсивні підпрограми
- •Алгоритми з поверненням. Розв’язок задачі про рух коня
- •Алгоритми з поверненням. Розв’язок задачі про вісьмох ферзів
- •If підходить тнеn
- •Модулі в Турбо Паскалі
- •Модуль crt
- •1. Керування екраном
- •2. Робота з клавіатурою
- •3. Інші можливості
- •Графіка в Турбо Паскалі
- •1. Включення і вимикання графічного режиму.
- •2. Побудова елементарних зображень
- •3. Виведення текстової інформації.
- •Файли в мові програмування Pascal
- •Установчі і завершальні операції
- •Операції введення-виведення
- •Обробка помилок введення-виведення
- •Переміщення по файлу
- •Спеціальні операції
- •Текстові файли
- •1. Оголошення файлової змінної і прив'язка до файлу на диску
- •2. Читання даних з файлу
- •3. Запис даних у файл
- •Двійкові файли
- •1. Типізовані файли
- •2. Нетипізовані файли
- •Статичні і динамічні змінні
- •Покажчики
- •Стан покажчика
- •Установка розмірів динамічної пам'яті
- •Сумісність і перетворення посилкових типів
- •Динамічні структури даних
- •Динамічні змінні: інші види списків, стек і черга.
- •1. Інші види списків
- •2. Стек і черга
- •Дерева і пошук у деревах
- •1. Визначення й описи структур даних
- •1. Масив
- •2. Список
- •3. Дерево
- •2. Алгоритми
- •1. Лінійний пошук у масиві
- •2. Двійковий пошук
- •3. Лінійний пошук у списку
- •Змішані таблиці
- •Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування
- •Інкапсуляція
- •Спадкування
- •Віртуальні методи і поліморфізм
- •Конструктори, динамічні об'єкти і деструктори
- •Поля і методи: сховані і загальнодоступні
- •Системно- залежні розширення
- •Налагодження змінних
- •Оверлеї
- •Переривання і системні виклики
- •Доступ до пам'яті і портів
- •Перевизначення переривань
Перевизначення переривань
Досить частою є ситуація, коли в програмі необхідно визначити власні алгоритми реакції на переривання операційної системи, скасувавши при цьому стандартні реакції. Мова Turbo Pascal підтримує такі можливості введенням процедур спеціального виду. Заголовок таких процедур повинний мати стандартний набір параметрів, що виглядають так:
procedure IntHandler (Flags,
CS, IP, AX, BX, CX, DX,
SI, DI, DS, ES, BP : word );
Допускається завдання тільки деяких з цих параметрів, але при цьому їхній порядок повинний обов'язково зберігатися:
procedure IntHandler{DI,ES,BP : word);
procedure IntHandler(SI,DI,DS,ES,BP : word);
Додавання інших параметрів у заголовок не допускається, хоча ніяких діагностичних повідомлень у цьому випадку не видається.
Далі, після заголовка процедури, призначеної для визначення власної реакції на переривання, і перед її блоком повинно стояти службове слово interrupt, що завершується крапкою з комою. Загальний вид такої процедури показаний нижче.
procedure IntHandler ( Flags, CS, IP, AX, BX, CX,
DX, SI, DI, DS, ES, BP : word); interrupt;
begin
end;
Регістри центрального процесора передаються в процедуру в якості (псевдо) параметрів, так що в процедурі їх можна використовувати і змінювати. Якщо використовуються не всі регістри, то список параметрів, як було сказано, можна скоротити.
При активізації процедури обробки переривань вона автоматично зберігає поточний стан усіх регістрів (незалежно від того, які з них зазначені в заголовку процедури) і ініціалізує регістр DS. Це можна виразити командами ассемблера:
PUSH AX
PUSH BX
PUSH DX
PUSH SI
PUSH DF
PUSH DS
PUSH ES
PUSH BP
MOV BP,SP
SUB SP,LocalSize
MOVAX, SEG DATA
MOV DS,AX
При виході з процедур обробки переривань стан регістрів автоматично відновлюється і виконується спеціальна команда повернення з переривання:
MOV SP,BP
POP BP
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET
Процедура обробки переривання може модифікувати свої параметри. Коли ця процедура поверне керування, зміна описаних параметрів приведе до зміни умісту відповідних регістрів. Це може виявитися корисним, коли процедура використовується в якості користувальницького сервісного засобу, аналогічного викличу функції DOS по перериванню $21.
У процедурах, призначених для обробки переривань, одержуваних від апаратних схем, варто утримуватися від використання яких-небудь операцій введення-виведення або розподілу пам'яті, оскільки вони не є реентерабельними. Через їх не реентерабельність в процедурах обробки переривань не можна також використовувати ніяких функцій DOS.
Власне перевизначення деякого переривання виробляється звертанням до стандартної процедури SetIntVec модуля Dos. Перший параметр цієї процедури визначає номер переривання, другий параметр повинний містити адресу нової процедури, що буде автоматично запускатися при виникненні зазначеного переривання. При цьому адреса старої реакції на переривання буде загублена. Щоб зберегти попередню реакцію (наприклад, для її відновлення через якийсь час), можна скористатися стандартною процедурою GetIntVec, що присвоює другому параметру-змінній адресу поточної реакції на переривання з номером, обумовленим першим параметром.
У наступному прикладі перевизначається переривання з номером $l, що виникає при натисканні комбінації клавіш Ctrl-Break. Адреса процедури старої (стандартної) реакції на це переривання запам'ятовується в змінній IntlBSave і перед завершенням програми відновлюється.
uses
Dos; const
BreakFlag : boolean = false, var
IntlBSave : pointer;
{$F+}
procedure BreakHandler; interrupt;
{ Процедура, що буде викликатися }
{ при натисканні комбінації Ctrl-Break }
begin
BreakFlag := true;
end;
{$F-}
begin
{ Одержуємо адресу стандартної реакції }
GetIntVec($l,IntlBSave);
{ Замість нього встановлюємо адресу своєї процедури }
SetIntVec($l,@BreakHandler);
WriteLn('Press Ctrl-Break to exit');
{ Запускаємо цикл, що завершиться }
{ коли BreakFlag стане рівним true, тобто }
{ при виникненні переривання lВ }
repeat
until BreakFlag,
{ Відновлюємо первісну адресу реакції }
SetIntVec($lB,IntlBSave);
end.
Більш докладні відомості про переривання і техніку перевизначення переривань можна дістати в технічній документації по операційній системі MS-DOS і у фірмових посібниках із системи Turbo Pascal.