
- •Загальні методичні вказівки
- •1.3 Завдання на роботу
- •1.4 Контрольні запитання
- •2.3 Завдання на роботу
- •Варіанти завдань:
- •Варіанти завдань
- •3.4 Приклад оформлення звіту
- •4.3 Завдання на роботу
- •Варіанти завдань
- •4.4 Приклад оформлення звіту
- •5.3 Завдання на роботу
- •Варіанти завдань
- •5.4 Приклад оформлення звіту
- •6.3 Завдання на роботу
- •Контрольні запитання
- •А) команда rol; б) команда ror; в) команда rcl; г) команда rcr
- •7.3 Завдання на роботу
- •7.4 Приклад оформлення звіту
- •8.3 Завдання на роботу
- •8.4 Приклад оформлення звіту
- •X 28 розрядів bl, di, si y 12 розрядів ax
- •9.3 Завдання на роботу
- •9.4 Приклад оформлення звіту
- •10.2 Завдання на роботу
- •10.3 Варіанти завдань
- •11.3 Завдання на роботу
- •11.4 Контрольні запитання
- •12.3 Завдання на роботу
- •12.4 Приклад оформлення звіту
- •Виконання:
- •13.3 Завдання на роботу
- •13.4 Контрольні запитання
- •14.3 Завдання на роботу
- •Контрольні запитання
- •15.3 Завдання на роботу
- •16.3 Завдання на роботу
- •16.4 Контрольні запитання
- •17.3 Завдання на роботу
- •17.4 Контрольні запитання
- •18.3 Завдання на роботу
- •18.4 Контрольні запитання
- •19.3 Завдання на роботу
- •12.3 Контрольні запитання
- •20.3 Завдання на роботу
- •20.4 Контрольні запитання
- •21.3 Завдання на роботу
- •21.4 Контрольні запитання
- •Перелік рекомендованих джерел
20.3 Завдання на роботу
1 Написати програму на Turbo Assembler для виконання завдання відповідно до заданого варіанту.
Крім того для усіх завдань передбачити коректне завершення роботи програми після натискання клавіші [Esc].
Таблиця 20.5 – Варіанти завдань
Варіант |
Завдання |
1 |
2 |
1 |
Написати програму-годинник, яка показує поточний час (з секундами) та дату (включно із днем тижня) |
2 |
Написати програму-будильник, яка спрацює через 1 хв. Після запуску програми |
3 |
Показати скільки тіків (коливань) системного таймера пройшло з моменту запуску програми (при виході з неї) |
4 |
Відобразити рух букви “о” по периметру екрану зі швидкістю 1 знакомісце/секунду |
5 |
Написати програму вводу паролю. Якщо пароль не введено протягом 15сек., видати повідомлення і завершити роботу програми. Робота програми не повинна перериватись при натисканні [Ctrl]+[Break] та [Ctrl]+[C] |
6 |
Виводити символи на екран зі швидкістю від 1 символ за 3 сек. до 3 символів/сек. Швидкість виведення регулювати за допомогою клавіш [+] та [-] |
7 |
Генерувати поперемінно звук уз частотою 100 та 1000Гц. Тривалість кожного інтервалу 1сек. |
8 |
Виводити на екран поточне значення регістру лічильника 0 |
9 |
Вивести в якому режимі працює кожен із лічильників |
10 |
Програма-світлофор. На екрані відображаються вертикально три букви “О” на чорному фоні (світлофор). Активний сигнал світлофора відображається за допомогою зміни фону символу на колір, що відповідає кольору світлофора. Переключення здійснюється з інтервалом в 8 сек. |
Продовження таблиці 20.5
1 |
2 |
11 |
Якщо протягом 10сек. натискається одна і та ж клавіша здійснити вихід з програми |
12 |
Відобразити рух букви “о” на екрані зі швидкістю 2 знакомісця/сек. |
13 |
Вивести на екран скільки тіків та секунд виконується цикл на 100000 кроків |
14 |
Написати програму, яка при виході, за допомогою повторного запуску себе (внісши необхідні коди клавіш в буфер клавіатури), забезпечує неможливість завершити роботу з нею до заданого часу |
15 |
Написати програму, яка здійснює зворотній відлік часу (від 59 до 0 сек), відображає його на екрані, та здійснює вихід після завершення відліку |
2 Здійснити компіляцію програм.
3 Виконати трасування програми за допомогою Turbo Debugger.
4 Зробити висновки за результатами роботи.
20.4 Контрольні запитання
Чим відрізняється годинник реального часу і системний таймер?
Назвіть переривання системного таймера та годинника реального часу.
Назвіть мінімальний часовий інтервал, що можна від слідкувати за допомогою системного таймера та годинника реального часу.
ЛАБОРАТОРНА РОБОТА №21
РЕЗИДЕНТНІ ПРОГРАМИ
21.1 Мета роботи
Навчитися створювати прості резидентні програми для перехоплення та обробки подій з портів периферійних пристроїв.
21.2 Теоретичні відомості
Програми, що залишаються в пам’яті, після того як керування повертається в DOS, називаються резидентними. Для того, щоб залишити програму (або її частину) в пам’яті використовують функції DOS 27h та 31h переривання 21h.
Також розрізняють напіврезидентні програми - це програми, що загружають і виконують іншу програму, залишаючись при цьому в пам’яті, а після того як завантажена програма виконана, вони теж закриваються. Напіврезидентна програма може містити обробники переривань, що будуть діяти увесь час, поки працює завантажена з-під неї звичайна програма. Так що, з погляду даної дочірньої програми, напіврезидентна програма функціонує як звичайна резидентная. Такі програми зручно використовувати для внесення змін і доповнень в існуючі програми, якщо не можна внести виправлення прямо в їхній виконавчий код.
Резидентні програми прийнято розділяти на активні і пасивні, в залежності від того, чи перехоплюють вони переривання від зовнішніх пристроїв чи одержують керування, тільки якщо програма спеціально викликає команду int з потрібним номером переривання і параметрами.
Щоб вигрузити резидентну програму з пам’яті, необхідно виконати наступне: закрити відкриті програмою файли і пристрої, відновити всі перехоплені вектори переривань, і нарешті, звільнити всю зайняту програмою пам'ять.
Спрощену структуру резидентної програми на мові Assembler подано нижче:
.286
code segment
org 100h
assume cs:code, ds:code
intNumber equ … ;номер периравання, що перехоплюється
start:
jmp install
intMyFunc proc
push ds
push cs ;забезпечити звертання до змiнних
pop ds ;без використання префiксу cs:
;текст резидентної частини до стандартного обробника переривання
pushf
call [dword ptr old_ip]
;текст резидентної частини після стандартного обробника переривання
pop ds
iret
endp
old_int: ;змiннi для збереження старої адреси
old_ip dw 0 ;вектора intNumber
old_cs dw 0
install:
mov ah, 35h
mov al, intNumber
int 21h ;отримати адресу попереднього вектора
;переривання intNumber
mov [old_ip], bx ;зберегти молодше слово адреси в old_ip
mov [old_cs], es ;зберегти старше слово адреси в old_cs
mov ah, 25h
mov al, intNumber
mov dx, offset intMyFunc
int 21h ;встановити нову адресу вектора
mov dx, offset install ;завершити роботу i залишити резидентною
int 27h ;частину програми по мiтку install
ends
end start