Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Зм.
Арк.
№ докум.
Підп.
Дата
Арк.
КР.КІ-11.00.000 ПЗ
ВСТУП 5
1 ПОСТАНОВКА ЗАВДАННЯ 7
2 КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ 8
2.1 Засоби BIOS та DOS для роботи з клавіатурою 8
2.2 Резидентний обробник переривань 9
3 ПРОГРАМНА РЕАЛІЗАЦІЯ ЗАВДАННЯ 13
3.1 Опис алгоритму програми 13
3.2 Словесний опис програми 14
3.3 Результат виконання програми 15
4 ВИСНОВКИ 16
ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ 17
Додатки…………………………………………………………………………..18
Системне програмування (або програмування систем) - це вид програмування, який полягає у розробці програм, які взаємодіють з системним програмним забезпеченням (операційною системою), або апаратним забезпеченням комп'ютера. Головною відмінністю системного програмування в порівнянні з прикладним програмуванням є те, що прикладне програмне забезпечення призначене для кінцевих користувачів (напр., текстові процесори, графічні редактори), тоді як результатом системного програмування є програми, які обслуговують апаратне забезпечення або операційну систему (напр., дефрагментація диска) що обумовлює значну залежності такого типу ПЗ від апаратної частини. Слід зазначити, що "звичайні" прикладні програми можуть використовувати у своїй роботі фрагменти коду, характерні для системних програм, і навпаки; тому чіткої межі між прикладним та системним програмуванням немає.
Оскільки різні операційні системи відрізняються як внутрішньою архітектурою, так і способами взаємодії з апаратним та програмним забезпеченням, то принципи системного програмування для різних ОС є відмінними. Тому розробка прикладних програм, які здійснюватимуть одні і ті ж дії на різних ОС, може суттєво відрізнятися.
В загальному для системного програмування характерні такі особливості (одна або кілька):
Системне програмування суттєво відрізняється від прикладного програмування, що і змушує програмістів спеціалізуватися у одній з цих галузей. Мова асемблера на практиці набагато складніша будь-яких мов високого рівня по причині високої залежності від апаратного забезпечення ЕОМ. А також складної структури побудови програм та неінтуїтивному синтаксису.
Для системного програмування часто доступна тільки обмежена кількість інструментів. Налагодження інколи має підвищену складність. Бібліотеки періоду виконання, якщо взагалі доступні, мають набагато менші можливості, і роблять менше перевірок на помилки. Через ці обмеження, часто використовуються моніторинг та реєстрація даних; операційні системи мають бути забезпечені дуже якісними підсистемами реєстрації даних.
Загалом можна поділити програми на два класи: додатки для DOS і для Windows. Вони суттєво відрізняються, по причині однозадачності MS DOS, та захищеному режимі роботи MS Windows, який не дозволяє тісно працювати з апаратною частиною.
Метою розробки даної курсової роботи є отримання практичних навичок програмування мовою асемблера.
Підсумком виконання курсової роботи є розробка алгоритму і програми на мові асемблера, яка реалізує даний алгоритм.
Мета курсової роботи з курсу ”Системне програмування” вироблення у студентів практичних навиків створення системних програм, які напряму працюють з процесором, памяттю і портами вводу/виводу. Назва курсової роботи: “Створення резидентної програми”.
Завдання:
Написати резидентну програму, яка при натисканні на [Ctrl]+[D] записує в буфер клавіатури команду “dir” та Enter
У відповідності із завданням студент повинен:
Набір функцій для роботи з клавіатурою через BOIS реалізовано за допомогою переривання int 16h. Кожній клавіші на клавіатурі відповідає так званий скан-код (див. додаток А), що відповідає тільки цій клавіші. Цей код посилається клавіатурою при кожному натисканні і відпусканні клавіші й обробляється BIOS (обробником переривання int 9). Переривання 16h дає можливість одержати код натискання, не перехоплюючи цей обробник. Основні функції переривання 16h подані в таблиці 4.2. Якщо натиснутій клавіші відповідає ASCII-символ, то в АН повертається код цього символу, а в AL скан-код клавіші. Якщо натиснутій клавіші відповідає розширений ASCII-код, у AL повертається префікс скан-коду (наприклад, Е0 для сірих клавіш) чи 0, якщо префікса немає, а в АН розширений ASCII-код. Функція 00Н обробляє тільки комбінації, що використовують клавіші 84-клавішної клавіатури, l0h обробляє всі 101 105-клавішні комбінації, 20h 122-клавішні. Тип клавіатури можна визначити за допомогою функції 09h переривання 16h, якщо вона підтримується BIOS (чи підтримується ця функція, можна визначити за допомогою функції C0h переривання 15h).
Функція |
Значення |
00h, 10h, 20h |
Читання символу з клавіатури з очікуванням. |
01h, 11h, 21h |
Перевірка буферу на наявність символу. |
05h |
Переміщення символу в буфер клавіатури. |
02h, 12h, 22h |
Читання стану клавіатури. |
Робота з клавіатурою засобами DOS реалізовується через переривання int 21h. Практично всі функції DOS повторюють функції BIOS за виключенням додаткових операцій Ctrl + Break i Ctrl + C. Функції BIOS роботи з клавіатурою переривання 21h подані в таблиці нижче.
Функція |
Значення |
0Аh |
Ввід рядка символів в буфер. |
01h |
Буферизований ввід з ехо-виводом. |
08h |
Буферизований ввід без ехо-виводу. |
07h |
Не фільтрований ввід без ехо-виводу. |
06h |
Ввід/вивід на консоль. |
0Вh |
Перевірка стану стандартного вводу. |
0Сh |
Скидання буферу клавіатури (Reset). |
2.2 Резидентний обробник переривань
Великий клас програм, що забезпечують функціонування обчислювальної системи (драйвери пристроїв, програми шифрації і захисту даних, русифікатори, обслуговуючі програми типу електронних блокнотів або калькуляторів та ін.), повинні постійно находиться в пам'яті і швидко реагувати на запити користувача або на якісь події, що відбуваються в обчислювальній системі. Такі програми носять назву резидентних програм, (Terminate and Stay Resident, TSR). Зробити резидентною можна як програму типу СОМ, так і програму типу ЕХЕ, проте з огляду на те, що резидентна програма має бути максимально компактною, найчастіше в якості резидентних використовують програми типу СОМ.
Розглянемо типову структуру резидентної програми і системні засоби залишення її в пам'яті після ініціалізації:
mSeg segment
assume SS:mSeg, DS:mSeg, CS:mSeg, ES:mSeg
org 100h
MAIN: jmp L1 ; Пропуск резидентної частини.
; Резидентна частина
old09h dd 0 ; Стара адреса Int 09h.
L2:
pushf ; Регістр прапорців - в стек.
call CS:old09h ; Виклик системного обробника ;переривань 09h.
push AX ; Збереження тих регістрів,
push BX ; вміст яких змінюється
push CX ; в програмі.
push DX ;
push ES ;
=====================
Резидентна частина
=====================
; Реагуюча частина
mov AX, 03 ; Очистка консолі.
int 10h ;
mov AH, 09h ; Вивід строки:
lea DX, message ; 'Out of memory. Less the
30mb left!'
int 21h ;
L3:
pop ES ; Відновлення вмісту
pop DX ; регістрів ES, BX,
pop CX ; AX.
pop BX ;
pop AX ;
iret ; Повернення в DOS.
L1:
; Ініціююча частина
mov AX, 3509h ; Отримати в ES:BX стару адресу
int 21h ; обробника переривань int 09h
mov word ptr CS:old09h, BX ; і запам'ятати її
mov word ptr CS:old09h+2, ES; в комірці old09h.
mov AX, 2509h ; Встановлення нової адреси
<адр.L2>
lea DX, L2 ; обробника переривання int 09h.
int 21h ;
mov AH, 09h ; Вивід строки:
lea DX, message ; 'Program is resident'.
int 21h ;
mov AX, 3100h ; Завершити резидентну частину
mov DX, (L1-MAIN+10Fh)/16 ; розміром (L1-MAIN+10Fh)/16.
int 21h ;
memMess db 'Out of memory. Less the 30mb left!', '$'
message db 'Program is resident', '$'
mSeg ENDS ; Кінець програми.
END MAIN ; Зовсім кінець області MAIN.
До розміру резидентної частини (M1-Pr) додається розмір PSP (100h) і ще 15, щоб при розподілі на 16 округлити результат у більшу сторону. Це
буде розмір в параграфах.
Чому 'mov AX, CS: sym1', а не просто 'mov AX, sym1'? це викликано тим, що всі адреси в рег. ES, DS, SS належать тій програмі, з якої була викликана перериваюча програма. Тільки CS змінюється як при звичайному дальньому виклику. При поверненні CS відновлюється зі стека.
Резидентна частина закінчується командою IRET, так як викликається вона перериванням, а не командою CALL. Відрізняється IRET від RET тим, що зі стека читається крім CS: IP ще й вміст регістра ознак.
Точка входу у процедуру при запуску |
main jmp RESID …Резидентні поля даних |
Точка входу у процедуру при виклику |
ENTRY … Код резидентної … частини iret |
Резидентна частина RESID Завершення програми і залишення резидентної частини в памяті … секція ініціалізації Функція DOS 31h |
Рисунок 2.3 Взаємодія елементів резидентної програми
Функція 31h, закріпивши за резидентною програмою необхідну для її функціонування пам'ять, передає управління командному процесору і обчислювальна система переходить в початковий стан. Наявність програми, резидентної в пам'яті, ніяк не відбивається на ході обчислювального процесу, за винятком того, що зменшується об'єм вільної пам'яті. Одночасно в пам'ять може бути завантажене будь-яка кількість резидентних програм.
Будь-яка резидентна програма має принаймні дві точки входу. При
запуску з клавіатури програми типу .СОМ управління завжди передається на
перший байт після PSP (IP=l00h). Тому практично завжди першою командою резидентної програми є команда jmp, яка передає управління на початок секції ініціалізації.
Після відробітку функції DOS 31h програма залишається в пам'яті в пасивному стані. Для того, щоб активізувати резидентну програму, їй потрібно якось передати управління і, можливо, параметри. Викликати до життя резидентну програму можна різними способами, але найбільш частим є механізм апаратних або програмних переривань.
В цьому випадку в секції ініціалізації необхідно заповнити відповідний
вектор адресою резидентної частини програми (точка ENTRY на Рисунку 2.3). Адреса ENTRY утворює другу точку входу в програму, через яку здійснюється її активізація. Очевидно, що резидентна секція програми повинна закінчуватися командою виходу з переривання iret.
При заповненні в секції ініціалізації векторів не виникає проблем з перенастроюванням регістра DS, оскільки в програмі типу СОМ усі регістри вказують на єдиний сегмент програми. У секції ініціалізації передбачений, як це зазвичай робиться, вивід на екран повідомлення про завантаження програми в пам'ять.
Після запуску програми вона залишається в пам'яті і, активізуючись фактично апаратними перериваннями від клавіатури (а точніше - програмою BIOS, що активізується апаратними перериваннями від клавіатури).
Програма складається з резидентної частини (що залишається в оперативній памяті після завершення програми ) та реалізації отримання даних про диск.
Алгоритм програми наведений на рисунках 3.1
Перевірка чи введено Ctl+D
Ввід з клавіатури
Залишити резидентною, вийти в DOS
Початок
Завантаження резидента в память
Кінець
Викликати команду DIR
Рисунок 3.1 Схема завантажувальної частини
Перевірка чи введено Ctl+D
Ввід з клавіатури
Кінець
Викликати команду DIR
Програма написана у форматі СОМ, оскільки цей формат є менш громіздким ніж .exe, тому в ній передбачається тільки один сегмент, в якому зв'язуються сегментні регістри CS і DS. При запуску програми з клавіатури, командою jmp відразу ж здійснюється перехід на секцію ініціалізації резидента, яка оформлена у вигляді окремої процедури. Далі здійснюється
пошук конфігурації поточного диску за допомогою фунції 36h, після його знаходження відбувається збереження адрес переривання,встановлення нової адреси; виводиться повідомлення, якщо ємність дискового простору перейшла за задану відмітку; після цього відбувається коректне завершення резидентної програми.
Функція 0Сh спочатку очищає буфер клавіатури ( тобто "забуває" попередні натиснення клавіш ), а потім виконує будь-яку з функцій 01h, 06h, 07h, 08h або 0Аh. Номер цієї функції задається в регістрі AL.
Функція 05h переривання int 21h, використовується для переміщення символу в буфер клавіатури.
Запис символів в буфер клавіатури
На вході: АН = 05h
СL = ASCII код
СH = Scan Code або “0”
На виході: АL = „0” якщо запис здійснено успішно
„1” якщо переповнений буфер клавіатури.
Перериваня int 16h, використано для створення очікування на введеня клавіші.
Int 21h, використано для отримання старої, а також встановлення нової адреси переривання 09h.
mov AX, 3509h ; Отримати в ES:BX стару адресу
int 21h ; обробника переривань int 09h
mov word ptr CS:old09h, BX ; і запам'ятати її
mov word ptr CS:old09h+2, ES ; в комірці old09h.
mov AX, 2509h ; Встановлення нової адреси <адр.L2>
lea DX, L2 ;обробника переривання int 09h
int 21h ;
Int 21h ; використано для завершення резидентної частини.
mov AX, 3100h ; Завершити резидентну частину
mov DX, (L1-MAIN+10Fh)/16 ; розміром (L1-MAIN+10Fh)/16
int 21h
Результати виконання програми зображено на рисунку 3.3.
Рисунок 3.3 Результат роботи програми
4 ВИСНОВКИ
Результатом виконання даного курсової проекту з системного програмування стала резидентна програма яка при натисненні комбінації [Ctrl]+[D] записує в буфер клавіатури команду “dir” та Enter.
Реалізована програма працює тільки в операційній системі MS-DOS, що зумовлено її архітектурою, у Windows інша реалізація роботи з памяттю, і резидента програма повинна бути написана з урахуванням всієї специфіки даного сімейства ОС та поставлених вимог до стандартів мови.
ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ
Додатки
seg1 SEGMENT
ASSUME SS:Seg1,DS:Seg1,CS:Seg1,ES:Seg1
ORG 100h ;Початок програми з 0100h
Pr: JMP M1 ;Пропускаємо резидентну частину
;== Резидентна частина ==
old_09 dd 0 ;Старий адрес Int 09h
M2: pushF ;Регiстр прапорцiв - в стек
call CS:old_09 ;Виклик системного обр. перерив. 09h
push AX ;Зберiгаємо тi регiстри, вмiст
push BX ;яких мiняється в програмi
push ES ;
push CX
mov AX,40h ;Занесення сегментного адресу
mov ES,AX ;буферу клавiатури в рег.ES
mov BX,ES:[1Ah] ;Адрес голови буферу клавiатури
mov AX,ES:[BX] ;Читання коду натиснутої клавiшi
cmp AX,2004h ;Порiвняння з Ctrl+D
jnz M3 ;Вихiд, якщо не Ctrl+D
mov ah,05h
mov ch,1Ch
mov cl,0Dh ;ENTER (перший ентер потрiбен для того, щоб команда dir вводилася
int 16h ;з нового рядка (в попередньому вже можуть бути символи)
mov ah,05h
mov ch,20h ;"d"
mov cl,64h
int 16h
mov ah,05h
mov ch,17h
mov cl,69h ;"i"
int 16h
mov ah,05h
mov ch,13h
mov cl,72h ;"r"
int 16h
mov ah,05h
mov ch,1Ch
mov cl,0Dh ;ENTER
int 16h
M3: pop ES ;Вiдновимо вмiст
pop BX ;регiстрiв ES, BX и AX
pop AX ;
pop CX
iret ;Вихiд в DOS
M1: ;---------------------- ;iнiцiююча частина
mov AX,3509h ;Отримати й передати в ES:BX стару адресу
INT 21h ;обробника переривання int 09h
mov word ptr old_09,BX ;i запам'ятати його
mov word ptr old_09+2,ES ;в ячейцi old_09
mov AX,2509h ;Встановлення нової адреси <адр.M2>
lea DX,M2 ;обробника переривання int 09h
INT 21h ; -------
mov AH,09h ;Вивiд строки:
lea DX,x ;"Резидентний обробник завантажений в пам'ять"
INT 21h ; -------
mov AX,3100h ;Завершити i залишити резидентною
mov DX,(M1-Pr+10Fh)/16 ;частину размiром (M1-Pr+10Fh)/16
INT 21h ; -------
x db "Резидентний обробник завантажений в пам'ять", '$'
Seg1 ENDS ;Кiнець сегменту