МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
КАФЕДРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
Звіт
Про виконання лабораторної роботи № 1
з дисципліни «Операційні системи та системне програмування»
Тема: оробка переривань в операційній системі MS-DOS
Завдання
Скласти програму, яка б виводила на екран зміст всіх ненульових векторів переривань. Після виклику програма повинна залишатись резидентною. Вектор переривань, яким ініціалізується програма, підібрати самостійно.
Використані типи даних
^word; - для опису вказівників на слово, для того щоб в них вмістити адрес сегмента та зміщення всередині цього сегмента;
word, integer - для опису цілих змінних, нап., для лічильників у циклі;
string - для запису шістнадцяткових номерів, адрес та зміщень
var OldVect: procedure; - для запису адреси стандартного обробника переривань.
Алгоритм виконання завдання
Після початку роботи програми ми зберігаємо стандартний вектор обробки переривань від клавіатури, та заміняємо його на обробник. Обробник перевіряє яка клавіша була натиснута, і якщо це була F12, то він починає виконувати поставлене завдання, інакше управління передається стандартному обробнику переривання. Для виконання завдання, обробник очищає екран, і отримує адреси всіх переривань, якщо вони не нульові, то виводить їх на екран. Для отримання адреси отримуємо сегмент в якому знаходиться переривання та зміщення всередині сегменту, виходячи з того, що переривання починають розміщуватися з нульової адреси оперативної пам’яті. Після виконання програма залишається резидентною в пам’яті.
Блок-схема алгоритму роботи програми
Текст програми
program lab1;
uses dos, crt;
var OldVect: procedure;
ofset,seg:^word;{pointer to WORD}
b:word;
{dec to hex}
function hex(a:word):string;
var
b,c:integer;
d:string;
begin
d:='';
for b:=0 to 3 do
begin
c:=a mod 16;
if c>9 then
c:=c+39;
d:=chr(c+48)+d;
a:=a div 16;
end;
hex:=d;
end;
{F+}
procedure GetAllNotNullVect; interrupt;
var i: byte;
p: pointer;
NLineIndex: byte;
begin
if Port[$60]=$58 then
begin
clrscr;
{pereburaem vsi pereruvannya}
for b:=0 to 255 do
begin
{get segment}
seg:=ptr(0,(b*4));
{get offset}
ofset:=ptr(0,(b*4+2));
if (seg^<>0)and(ofset^<>0)then
begin
textcolor(green);
write(' ',hex(b),': ');
textcolor(blue);
write(hex(seg^),':',hex(ofset^));
end;
end;
end;
OldVect;
end;
{$F-}
{$M $2048, 0, 0}
Begin
clrscr;
GetIntVec($9, @OldVect);
SetIntVec($9, @GetAllNotNullVect);
Keep(0);
readln; readln;
End.
Результат роботи програми: