Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_СистПрогр_ЛР.DOC
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
2.16 Mб
Скачать

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 Контрольні запитання

  1. Чим відрізняється годинник реального часу і системний таймер?

  2. Назвіть переривання системного таймера та годинника реального часу.

  3. Назвіть мінімальний часовий інтервал, що можна від слідкувати за допомогою системного таймера та годинника реального часу.

ЛАБОРАТОРНА РОБОТА №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