оботи планувальника кожен процес повинен зафарбувати +3200 пікселів у вигляді прямокутника. Зафарбовування пікселя виконується за допомогою функції 0ch переривання 10h. Вхідні параметри:
) Колір лінії (регістр AL);
2) Координата Y (регістр DX);
) Координата Х (регістр СХ);
) відеосторінкою (реєстр BH);
Якщо дана функція буде викликатися циклічно, то кол-во ітерацій - квант часу. Змінюваними параметрами є значення регістрів CX, AL, DX. Після того як процес завершиться і передасть управління основній програмі значення цих регістрів повинні бути збережені в стек даного процесу.
Так як мітка на кожен процес містить адресу, то для того щоб викликати потрібну процедуру достатньо записати цю адресу в змінну proc_p. А для виклику процесу буде використовуватися команда call [cs: proc_p]. Такий підхід дозволить уникнути розгалужень з умовних операторів для перевірки деякого параметра містить номер процесу.
Алгоритм роботи процесу
) Рг.BL:=50
) Рг.AH:=0ch
) Рг.BH:=1
) виконати переривання 10h
) Рг.СХ:=Рг.СХ - 1
) Рг.BL:=Рг.BL - 1
7) порівняти BL c 0.
) Якщо не дорівнює 0, то перейти на мітку 2
) порівняти СХ з 0
) якщо не дорівнює 0, то перейти на мітку 13
) Рг.AL:=Рг.AL + 1
) Рг.СХ:=3200
. Розробка процедур планувальника
Основними процедурами планувальника є: збереження словосостоянія поточного процесу, завантаження обраного процесу, перемикання між процесами.
Для збереження словосостояній процесу використовується процедура save_. Вхідним параметром даної процедури є змінна р. Дана змінна зберігає адресу по якому в пам'яті записаний номер призупиненого процесу. Використовуючи команди cmp і jСС значення за адресою p порівнюється з числами 1h, 2h, 3h, 4h, 5h, 6h. При збігу з одним із чисел виконується перехід на мітку ms1, ms2, ms3, ms4, ms5 або ms6. Після кожної з міток виконуються команди збереження регістрів CX, AX, DX в стек. Після запису в стек адреса вершини стека записується як значення за адресою на який вказує одна із змінних sp1, sp2, sp3, sp4, sp5, sp6. Дані змінні містять адреса за якою записана адреса вершини кожного з стеків після запису.
Алгоритм процедури save _
) Завантажити номер процесу в BX
) Порівняти BX з 1h
) Якщо BX=1h, то перехід на мітку 14
) Порівняти BX з 2h
) Якщо BX=2h, то перехід на мітку 15
) Порівняти BX з 3h
) Якщо BX=3h, то перехід на мітку 16
) Порівняти BX з 4h
) Якщо BX=4h, то перехід на мітку 17
10) Порівняти BX з 5h
) Якщо BX=5h, то перехід на мітку 18
) Порівняти BX з 6h
) Якщо BX=6h, то перехід на мітку 19
14) Завантажити параметри в стек ss1 і перейти на мітку 20
) Завантажити параметри в стек ss2 і перейти на мітку 20
) Завантажити параметри в стек ss3 і перейти на мітку 20
) Завантажити параметри в стек ss4 і перейти на мітку 20
) Завантажити параметри в стек ss5 і перейти на мітку 20
) Завантажити параметри в стек ss6 і перейти на мітку 20
) Передати управління основній програмі і переключитися на її стек
Після кожної збереження словосостоянія адреса вершини стека записується за адресою відповідної змінної.
Для завантаження словосостоянія процесу використовується процедура load_. Робота даної процедури ідентична процедурі save_. Відмінністю буде те, що для роботи зі стеком змінні sp1, sp2, sp3, sp4, sp5, sp6 не потрібні.
Процедура load_ викликається перед викликом процедури за адресою proc_p. Після завершення роботи викликаної процедури викликається процедура save _.
Планувальник реалізується процедурою proc. Для запису адреси даної процедури в таблицю векторів переривань використовуються команди заборони і дозволу переривань і каманди пересилки mov. При виклику переривання 60h відбувається перехід на процедуру proc за адресою [cs: proc]. Дана процедура виконує наступні дії
) Ініціалізація генератора випадкових чисел;
...