close

Вход

Забыли?

вход по аккаунту

?

Kursovij proekt 01

код для вставкиСкачать
МІНІСТЕРСТВО АГРАРНОЇ ПОЛІТИКИ ТА ПРОДОВОЛЬСТВА УКРАЇНИ
НОВОБУЗЬКИЙ КОЛЕДЖ МИКОЛАЇВСЬКОГО НАЦІОНАЛЬНОГО АГРАРНОГО УНІВЕРСИТЕТУ
З дисципліни "Системне програмування"
КУРСОВИЙ ПРОЕКТ
"Написання програми для завершення резидентної програми з іншої транзитної програми"
Виконав студент 31-К групи:
Буряк Вячеслав
Дата __________
Підпис __________
Перевірив викладач:
Торопчин О.С.
Дата __________
Підпис ___________
Новий Буг
2013 р.
Зміст
Вступ..........................................................................................3
1 Призначення і область застосування програми.......................................................................................5
2 Огляд існуючих систем, обгрунтування вибору принципу розробки і методики побудови системи. Постановка задачі............................................................................................6
3 Опис і обгрунтування проектних рішень по проектуванню системи.........................................................................................8
4 Розрахунки та експериментальні матеріали, що підтверджують правильність конструкторських або програмних рішень........................................................................................12
5. Алгоритм головної програми......................................................19
5 Інструкція користувачу...............................................................................20
Висновок...................................................................................21
Перелік умовних позначень..................................................................................22
Список використаної літератури.................................................................................23
Додатки:
Додаток А. Лістинг програми
Додаток Б. Блок-схема алгоритму програми
Вступ
Системне програмування - це вид програмування, який полягає у розробці програм, які взаємодіють з системним програмним забезпеченням(операційною системою), або апаратним забезпеченням комп'ютера. Головною відмінністю системного програмування в порівнянні з прикладним програмуванням є те, що прикладне програмне забезпечення призначене для кінцевих користувачів(напр. текстові процесори, графічні редактори), тоді як результатом системного програмування є програми , які обслуговують апаратне забезпечення або операційну систему(напр. де фрагментація диска) що обумовлює значну залежності такого типу ПЗ від апаратної частини. Слід зазначити, що "звичайні" прикладні програми можуть використовувати у своїй роботі фрагменти коду, характерні для системних програм, і навпаки. Оскільки різні операційні системи відрізняються як внутрішньою архітектурою, так і способами взаємодії з апаратним та програмним забезпеченням, то принципи системного програмування для різних ОС є відмінними. Тому розробка прикладних програм, які здійснюватимуть одні і ті ж дії на різних ОС, може суттєво відрізнятися.
В загальному для системного програмування характерні такі особливості(одна або кілька):
- Програміст повинен враховувати особливості операційної системи та/або апаратного забезпечення, на яких передбачається запуск програми, та використовувати ці особливості(наприклад,застосовуючи оптимізовані алгоритми для певної архітектури);
- Зазвичай використовуються низькорівневі мови програмування,які:
- Можуть працювати у ресурсо-обмеженому середовищі;
- Максимульно раціональні та мають мінімальні затримки за часом виконання;
- Дозволяють виконувати прямий доступ до пам'яті та керуючої логіки;
- Дозволяють програмісту писати частини програми на асамблері;
- Налагодження може бути складним,якщо неможливо запустити програму у режимі налогодження через обмеження у ресурсах. Виконання програми у імітованому середовищі може зняти цю проблему.
- налагодження може бути складним, якщо неможливо запустити програму у режимі налагодження через обмеження у ресурсах. Виконання програми у імітованому середовищі може зняти цю проблему.
В системному програмуванні часто необхідно писати системні програми, що обслуговують ПК та залишаються в робочому стані на протязі тривалого часу. Вони називаються резидентними. За визначенням резидентна програма (або ТSR- програма, від англ. Тегтіпаіе апd Stay Resident - "завершитися та залишитися резидентною") - в операційній системі MS-DOS програма, що повернула управління оболонці операційної системи (command.com), або надстройці над операционною системою (Norton Commader та ін.), але залишилася в оперативній пам'яти персонального комп'ютера. Резидентна програма активізується кожен раз при виникненні переривання, вектор якого ця програма змінила на адресу однієї з своїх процедур.
При роботі з MS-DOS резидентні програми широко використовувались для досягнення різних цілей (наприклад, русифікатори клавіатури, програми доступу до локальної мережі, менеджери відкладеного друку, антивірусні програми).
1 Призначення і область застосування програми
Сферою застосування моєї програми є область, де необхідно продемонструвати процес запуску резидентної програми, виклик потрібних переривань, передачу векторів та параметрів. Тобто, головною сферою застосування є навчання написанню резидентних програм, поглиблення знань з системного програмування, дослідження роботи системних функцій.
В подальшому дану програму можна буде застосовувати як фрагмент при написанні більш серйозних програм, оскільки вона включає в себе процеси виклику, завантаження та вивантаження.
Особливостями програми є те, що в ній передбачено тест на подвійне завантаження, отже при спробі завантажити її вдруге користувач отримає повідомлення про це. Програма не конфліктує з іншими резидентними програмами (якщо, звісно, вони працюють коректно), але в разі змінення ними хоча б одного з векторів преривань INT 08Н, INT 09Н, INT 28Н, INT 2FH програма maks.com не взмозі буде вилучитись з пам'яті по вимозі користувача. Про це програма видасть повідомлення. Але після вилучення з пам'яті тієї програми, що змінила вище перераховані вектори переривань, при подальшій вимозі користувача програму maks.com теж буде вилучено з пам'яті.
2 Огляд існуючих систем, обґрунтування вибору принципу розробки і
методики побудови системи. Постановка задачі
Користувачам відомо багато програм, які являються резидентними. До них відносяться і русифікатори (українізатори) клавіатури, антивірусне програмне забезпечення, екранний годинник, перемикач розкладки клавіатури і т.д.
Всі вони написані по одному принципу:
- одноразово запускаються, при цьому йде перевірка на повторний запуск;
- в процесі виконання забезпечують додаткової функції для користувача;
- вивантажуються з пам'яті за запитом користувача.
В якості достатньо поширеного прикладу резидентної програми можна навести програму-українізатор клавіатури. Дана програма працює за принципом, що за допомогою спеціальних переривань та функцій вона визначає ASCII та скан-коди натиснених клавіш з латинськми літерами та замінює на відповідні коди літер українських (російських) літер. Таким чином натискаючи латинську літеру, ми на екрані бачимо російську.
ASCII (МФА: ['aeski], акронім від назви Американський стандартний код для інформаційного обміну, англ. American Standard Code for Information Interchange) в обчислювальній техніці - система кодів, у якій числа від 0 до 127 включно поставлені у відповідність літерам, цифрам і символам пунктуації. Наприклад, 45 відповідає знаку переносу, а. 65 - літері "А" великій. Перші 32 коди використовуються для керівних функцій, на зразок введення і стирання попереднього символу. Строго кажучи, ASCII - це семи-бітний код, а восьмий біт часто використовується для забезпечення відповідності чи додаткових символів. Система широко використовується для зберігання тексту і передачі інформації між комп'ютерами.
Наступним прикладом резидентної програми є екранний годинник. Він в процесі роботи не виконує ніяких дій, але показує точний час. Як відомо, за час в ЕОМ відповідає годинник реального часу, робота якого керується таймером.
Таймер відраховує часові інтервали, а зміни відображаються в RTC. Програма екранний годинник за допомогою спеціальний переривань та фунцій будує зображення на екрані. Точний час зчитується за допомогою переривань та функцій з годинника реального часу та виводиться екрані.
Тобто робота резидентних програм полягає у тому, щоб керувати системними можливостями ЕОМ, тобто за допомогою спеціальних засобів (переривань) керувати залізом.
Основною вимогою до програми згідно завдання курсової роботи є те, що програма повинна працювати швидко та надійно при різних процессорах, а також займати якомога менше пам'яті. Тому задача розроблялась на мові ассемблера (ASM-86) для TASM версії не нижче 2.0.
Також програма повинна бути:
резидентною і не конфліктувати з операційною системою та іншими програмами;
викликатись по натисненню "гарячих" клавіш; мати дружній інтерфейс з користувачем; не завантажуватись в друге; займати якомога менше пам'яті; по вимозі користувача вилучатись з пам'яті.
З Опис і обґрунтування проектних рішень по проектуванню системи
Системне програмування полягає у тому, що програмісту потрібно керувати залізом. Таке керування здійснюється за допомогою переривань. Переривання (англ. interrupt) - сигнал, що повідомляє процесор про настання якої-небудь події. При цьому виконання поточної послідовності команд призупиняється і керування передається обробнику переривання, який реагує на подію та обслуговує її, після чого повертає управління в перерваний код.
Залежно від джерела виникнення сигналу переривання поділяються на:
Асинхронні або зовнішні (апаратні) - події, які створені зовнішніми джерелами (наприклад, периферійними пристроями) та можуть відбутися в довільний момент: сигнал від таймера, мережевої карти або дискового накопичувана, натискання клавіш клавіатури, рух миші;
Синхронні або внутрішні - події в самому процесорі як результат порушення якихось умов при виконанні машинного коду: поділ на нуль або переповнення, звернення до неприпустимих адрес або неприпустимий код операції;
Програмні (частковий випадок внутрішнього переривання) - ініціюються виконанням спеціальної інструкції в коді програми. Програмні переривання, як правило використовуються для звернення до функцій вбудованого програмного забезпечення (firmware), драйверів й операційної системи.
Великий клас програм, що забезпечують функціонування обчислювальної системи (драйвери пристроїв, оболонки DOS, програми шифрации і захисту даних, русифікатори, обслуговуючі програми типу електронних блокнотів або калькуляторів і ін.), повинні постійно знаходитися в пам'яті і миттєво реагувати на запити користувача або на якісь події, що відбуваються в обчислювальній системі. Такі програми носять назви програм, резидентних в пам'яті (Terminate and Stay Resident, TSR), або просто резидентних програм. Зробити резидентною можна як програму типу .СОМ, так і програму типу .EXE, проте оскільки резидентна програма повинна бути максимально компактною, найчастіше як резидентні використовують програми типу .СОМ.
Рентабельною (повторно входимою) програмою називається програма чи процедура, одна копія якої в пам'яті може бути одночасно викликатись кількома процесами, при чьому різноманітні виповнювання цієї процедури не впливають одна на одну.
Нерентабельність MS-DOS проявляється в неможливісті звертання к функціям DOS, якщо вже виповнюється яка-небудь інша функція DOS. Порушення цієї вимоги призведе до зруйнування системного стеку і краху операційної системи. Саме з нереентабильністю DOS пов'язані основні труднощі розработки popup - програм. Справа в тому, що ці резидентні програми використовують для свого запуску аппаратні преривания, які можуть статися в будь-який час, у тому числі й тоді, коли виповнюється функція DOS.
Найпростіше рішення цієї проблеми складається у повній відмові від використання системного сервісу DOS в резидентних програмах. Інколи це не дуже складно. Так, для виводу на дісплей можна користуватись прериванням BIOS ІОН чи прямим записом у відеобуфер, для вводу символів з клавіатури приємлимо користуватись прериванням 16Н, при роботі з принтером і послідовними портами також неважко працювати на рівні BIOS. Але у разі, коли потрібен дисковий ввод - вивод, це вже стає дуже проблематичним.
Працювати з дисками средствами BIOS - дійсно дуже клопітка справа.
Існують і інші ситуації, коли зручніше було б використовувати функції DOS. Отже, треба навчитися перемагати нереентабільність DOS. Для цього існує багато можливостей.
Почнемо з того, що існує простий (хоча й недокументований) спосіб запобігнути конфліктів з операційною системою. При активізації програма може перевірити байтовий прапорець активністі DOS і, якщо він відмінний від нуля (сервіс DOS недоступний), повернутись до пасивного стану. Адресу цього прапорця повідомляє функція DOS 34Н.
Функція 34Н. Дає адресу прапорця активністі DOS
виклик: AH-34H
Повертає: ES:BX - адреса прапорця
Нажаль, якщо вибрати цей шлях,така резидентна програма, скоріше за все, буде взагалі не в змозі стартувати. Це пов'язано з тим, що COMMAND.COM та багато інших програм проводять багато часу в очікуванні вводу строки з клавіатури через функцію DOS 0AH,і,отже прапорець активності DOS майже завжди взведений. Ця обставина використовується у диспетчері функцій, який може мати вигляд на зразок цього:
Запит на виконання функції ОАН не передається одразу до операційної системи. Замість цього периодично перевіряється стан буфера вводу (функція DOS ОВН або функція 01Н преривання 16Н). І вже тільки після того як буфер почав заповниватися, визивається функція ОАН. Оберніть увагу на те, як оформлено повернення у програму - це викликано тим, що DOS використовує прапорець CF в якості признаку помилки.
Важливо те, що в описаному прикладі можна відмовитись від перевірки недокументованого прапорця активності DOS. Замість того диспетчер встановлює свій власний прапорець, який до того ж бітовий, отже він може бути об'єднай з іншими прапорцями резидентної програми.
Диспетчер функцій DOS - приємлимий, але не найбільш вдалий спосіб перевагання нереєнтабільності DOS. Програмам, використовуючим його, далеко не завжди вдається стартувати. Крім того, їм приходиться аналогічним чином відсліджувати ще й преривання 25Н (читати сектор), 26Н (писати сектор) DOS, а також преривання 13Н BIOS.
Обробники преривань 25Н і 26Н виявляються звичайними функціями - під час повернення управління вони залишають в стеці регістр прапорців. А це класичний приклад помилки, якій в наслідок увійшов у документацію.
Найбільш цікавими можливостями преодолання нереєнтабільністі DOS пов'язані з використовуванням недокументованого переривання 28Н. Це преривання використовується резидентними процесами самої операційної системи, наприклад, PRINT, та генерується як раз під час виконання функцій DOS, коли прапорець активністі DOS взведений, але система знаходиться у безпечному стані.
За допомогою преривання 28Н можна досягнути потрясаючих результатів. Отже, така програма може стартувати, наприклад, під час копіювання файлів, а іноді при форматуванні диску.
При натисканні на "гарячу" клавишу не відбувається негайна активізація програми, а лише встановлюється битовий прапорець, повідомляючий, що поступила команда стартувати. Обробник преривання 28Н перевіряє стан прапорця, і, якщо прапорець встановлен, а програма ще не активна, активізує її. На прикінці роботи управління завжди передається завжди повинне передаватись початковому обробнику. Програми, які виконуються усередині преривання 28Н, не повинні користуватись функціями DOS з номерами 00Н - ОСН.
А як буть, коли довгий час не відбувається звертання до функцій DOS і, отже, не вироблялось преривання 28Н? Програма знов не в змозі стартувать. Щоб запобігнути цього, буде потрібна ще одна точка входу, в якісті якої зручно буде обрати обробник якогось часто возникаючого преривання, наприклад, від таймеру. Тоді перед активізацією програми треба перевіряти прапорець активністі DOS, чи свій власний прапорець.
Реакція на виключні випадки
Іноді в результаті збоїв апаратної частини або неправильних дій користувача може скластися ситуація, коли подальша робота програми виявляється неможливою. В цьому випадку управління дістає спеціальна процедура обробки критичної помилки, адреса якої знаходиться у векторі преривання 24Н. Користувач може також сам прервати програму, натиснувши комбінацію клавіш Ctrl+Break. При цьому MS-DOS передає управління до процедури завершення, яка починається по адресі обробника переривання 23Н.
Цей сервіс DOS, неодмінно, дуже корисний, але орієнтований на звичайні програми і не може правильно працювати в резидентних програмах. Тому вам слід передбачити власну обробку виключних випадків або відключити існуючу.
Почнемо з переривання Ctrl+Break. Реакція системи на це переривання залежить від стану прапорця перевірки по Ctrl+Break. Якщо прапорець скинутий, то перевірка натиснення Ctrl+Break і завершення програми відбувається тільки при виконанні функції DOS з номерами 00Н - ОСН, а якщо прапорець встановлений, при виконанні будь-яких функцій. Тому, якщо в програмі не використовуються функції DOS 00Н-0СН, тоді достатньо скинути прапорець перевірки по Ctrl+Break при активізації резидентної програми і встановити його початкове значення перед поверненням у пасивний стан.
Функція 33Н. Прапорець перевірки по Ctrl+Break
Виклик: AH = 33Н
AL = 0 - отримати стан прапорця 1 - змінити стан прапорця.
DL (якщо AL=1) = 0 - скинути прапорець 1 - встановити прапорець
Повертає: DL ( якщо AL дорівнював 0) - стан прапорця:
0 - скинутий
1 - встановлений
Для перевірки або зміни стану прапорця зручно застосовувати функцію DOS 33Н.
Другий можливий путь - просто відмінити оброботку преривання 23Н, тобто змінити його вектор так, щоб він вказував на інструкцію IRET.
При виникнинні критичної помилки (звично це помилка диску) MS-DOS завантажує у регістри АХ, DI, SI, ВР інформацію про помилку ініцирує преривання 24Н. Стандартний системний обробоник преривання веде себе слідуючим чином: видає на дісплей повідомлення про помилку і запит користувача - "Abort, Retry, File or Ignore?" ("Прервати, Повторити, Зняти або Ігнорувати"), чекає відповіді і повертає управління функції DOS, при виконанні якої виникла помилка. Подалші дії операційної системи визначається змістом регістру АL (відповідь користувача).
4 Розрахунки та експериментальні матеріали, що підтверджують правильність конструкторських або програмних рішень
Програми, призначені для завантаження і залишення в пам'яті, зазвичай складаються з двох частин (секцій) - що ініціалізувала і робочою (резидентною). У тексті програми резидентна секція розміщується на початку, що ініціалізувала - за нею.
При першому виклику програми вона завантажується в пам'ять цілком і управління передається секції ініціалізації, яка заповнює або модифікує вектори переривань, настроює програму на конкретні умови роботи (можливо, виходячи з параметрів, переданих програмі при її виклику в хвості командного рядка) і за допомогою переривання DOS Int 21h з функцією 31 h завершує програму, залишаючи в пам'яті її резидентну частину. Розмір резидентної частини програми (у параграфах) передається DOS в регістрі DX. Указувати при цьому сегментну адресу програми немає необхідності, оскільки він відомий DOS. Для визначення розміру резидентної секції її можна завершити пропозицією виду ressize equ $- mypoc, де myproc - адресу почала програми, а при виклику функції 31 h в регістр DX заслати результат обчислення виразу (ressize+lOFh) /16.
Функція 31 h, закріпивши за резидентною програмою необхідну для її функціонування пам'ять, передає управління командному процесору COMMAND.COMi обчислювальна система переходить, таким чином, в початковий стан. Наявність програми, резидентної в пам'яті, ніяк не відбивається на ході обчислювального процесу за винятком того, що зменшується об'єм вільної пам'яті. Одночасно може бути завантажене декілька резидентних програм.
Для того, щоб активізувати резидентну програму, їй треба якось передати управління і, можливо, параметри. Запустити резидентну програму можна трьома способами:
1.)викликати її оператором CALL як підпрограму; використовувати механізм асинхронних (апаратних) переривань;
2.)за допомогою синхронного (програмного) переривання.
Крім того, спеціально для взаємодії з резидентними програмами в DOS передбачено мультиплексне переривання 2Fh.
Перший спосіб вимагає наявність в пам'яті поточної активної програми, яка, очевидно, повинна утворювати з батьківською програмою єдиний програмний комплекс з визначеними заздалегідь угодами взаємодії (міжпрограмним інтерфейсом). Оформивши у вигляді резидентної програми процедури виконання функцій, загальних для групи транзитних програм, можна спростити структуру і об'єм транзитних програм такого багатопрограмного комплексу.
3.)Третій спосіб, асинхронна активізація резидентної програми зовнішнім перериванням (від таймера, клавіатури, послідовного порту або іншого переферійного устаткування) широко використовується резидентними програмами BIOS, а також багатьма прикладними резидентними програмами: русифікаторами, калькуляторами, електронними блокнотами і так далі
Нарешті, синхронна передача управління резидентній програмі за допомогою команди INT характерна для встановлюваних драйверів DOS, деяких русифікаторів, програм обслуговування дисків і ін.
Розглянемо типову структуру резидентної програми і системні засоби залишення її в пам'яті. Як вже наголошувалося, резидентні програми найчастіше пишуться у форматі .СОМ:
text segment 'code' assume CS:text,OS:text
org lOOh
myproc proc far
jmp init ;Перехід на секцію ініціалізації
;Дані резидентної секції програми
entry:;Текст резидентної секції програми
myproc endp
ressige equ $-myproc ;Розмір (у байтах) резидентної секції програми
Init ргос ;Секция ініціалізації
mov DX,(ressize+10Fh) /16 ;Размер у параграфах
mov АХ.ЗЮОИ ;Функція "завершити і залишити в
int 21h ;памяти"
Init endp text ends end myproc
При першому запуску програми з клавіатури управління передається на початок процедури myproc (перший байт після префікса програмного сегменту). Командою JMP здійснюється перехід на секцію ініціалізації, в якій, зокрема, готуються умови для подальшої активізації програми вже в резидентному стані. Останніми рядками секції ініціалізації викликається функція 3 lh, яка виконує завершення програми із залишенням в пам'яті вказаної її частини. З метою економії пам'яті секція ініціалізації розташовується в кінці програми і відкидається при її завершенні.
Для звернення до резидентної програми з транзитної можна використовувати область міжзадачних зв'язків, що є частиною області даних BIOS і розташовану по адресах 40h:F0h...40h:FFh. Ця область не використовується системою і призначена спеціально для комунікації програм користувача. За допомогою області міжзадачних зв'язків можна здійснювати як виклик резидентної програми, так і передачу параметрів. Зручніше передавати не самі параметри, а їх адреси; оскільки повну адресу займає два слова, в області міжзадачного зв'язку поміщається 4 адреси.
По ходу виконання секції ініціалізації майбутня резидентна програма поміщає в обумовлені осередки області міжзадачного зв'язку адреса своєї точки входу, наприклад, в слово 40h:F0h відносна адреса команди з міткою entry, а в слово 40h:F2h - вміст сегментного регістра CS. Транзитна програма, бажаючи передати управління резидентною, настроює регістр ES на початок області даних BIOS і виконує команду дальнього виклику calldword ptr ES: OF Oh
В цьому випадку резидентна програма повинна бути оголошена, як дальня процедура (myproc proc far) і завершуватися командою RET дальнього повернення.
Якщо резидентній програмі потрібно передавати параметри, їх початкова адреса (або, при необхідності, адреса цілого списку адрес) заноситься транзитною програмою в інший обумовлений осередок області міжзадачного зв'язку, наприклад, двухсловную осередок 40h:F4h. В цьому випадку резидентна програма переносить, наприклад, в регістр SI відносну адресу параметра з осередку 40h:F4h, а в регістр DS - сегментна адреса параметра з осередку 40h:F6h і після цього забирає самі параметри командами типу mov AX.DS:[SI] mov BX.DS:[SI+2] и т.д.
Природно, перед початком виконання резидентна програма повинна зберегти всі використовувані нею регістри (а перед завершенням - відновити їх).
Витонченіший метод передачі резидентній програмі управління і параметрів полягає у використанні вільних векторів, наприклад, 60h...66h. В процесі ініціалізації резидентна програма перешкодить своя адреса у вільний вектор:
mov АХ, О mov ES.AX
mov ES: 180h,offset entry ; Адрес вектора 60h mov ES:182h,CS
Для активізації резидентної програми в транзитній програмі досить виконати команду int 60h
В цьому випадку резидентна програма повинна закінчуватися командою IRET. Адреси параметрів можна передавати через інші вільні вектори, наприклад, 61h або 62h. Природно, як і раніше можна скористатися областю міжзадачних зв'язків.
Якщо резидентна програма повинна запускатися безпосередньо з клавіатури, незалежно від наявності або відсутності транзитної програми, слід скористатися апаратним вектором переривання типу 9. Обробники переривань від клавіатури були розглянуті в розділі 8.
Для взаємодії з паралельними процесами і, зокрема, з резидентними програмами в системі MS-DOS передбачений стандартний інтерфейс - переривання 2Fh. Перед викликом цього переривання слід помістити в регістр АН номер функції, а в регістр AL - номер під функції. Функції 00h...BFh зарезервовані за DOS (наприклад, функція 01 h дозволяє управляти процесом виведення файлів на друк за допомогою системної програми PRINT.СОМ, а функція 02h дає можливість визначити, чи завантажена резидентна частина утиліти - розширення DOS ASSIGN); функції C0h...FFh зарезервованi для прикладних програм. Якщо за допомогою переривання 2Fh передбачається передача в резиденту програму або отримання з неї великої кількості параметрів, можна використовувати і інші регістри, наприклад, DS:DX або DS:SI і передавати через них адреси списків параметрів.
Згідно системним угодам переривання 2Fh повертає в регістрі AL стан резидентної програми:Аь=0 - програма не встановлена (тобто завантажена і залишена резидентною) і її можна встановити; Аь=1 - програма не встановлена і її встановити не можна; AL=FFh - програма встановлена.
У разі помилки слід встановити прапор CF, а в регістрі АХ повернути код помилки.
Для того, щоб резидентна прикладна програма відгукувалася на переривання 2Fh, в неї слід включити прикладний обробник однієї або декількох функцій цього переривання. Тоді виклик відповідної функції цього переривання в будь-якій транзитній (або іншою резидентною) програмі дозволить організувати взаємодію із завантаженою резидентною програмою.
Розглянемо структуру резидентної програми з обробником переривання
2Fh.
;Секція ініціалізації
;Збережемо адресу системного обробника 2Fh, щоб не лишати себе можливості використовувати системні функції цього переривання init:movAH,35h ;Функція отримання вектору
ШОУ AL,2Fh ;Тип вектора
Int 21h
mov word ptr old2fh.BX ;Збережемо вектор 2Fh
mov word ptr old2fh+2,ES ;в комірці old2fh
;Завантажимо в вектор 2Fh адрес нашого обробника
mov AH,25h;Функція встановлення вектора
mov ALr2Fh;Тип вектора
lea DX,new2fh
Int Zlh
;Інші дії по ініціалізації
;3аверпшмо програму, залишивши її резидентною в пам'яті за допомогою ;функції 31h переривання DOS 21h ; Робоча секція entry: і ret
;Наш обробник переривання 2Fh (функції COh) new2fh:cmpAH.OCOh ;Наша функція?
je COh ;Наша!
jmp CS:old2fh ;He наша, в системний обробник
;Можливо, аналіз AL и переходи на програми реалізації підфункції.
;Далі будь-які заплановані дії в нашій резидентній програмі -
запуск ;її через точку entry, настройка, передача або отримання інформації і т.д.
iret ;Повернення в викликавшу програму
Після того, як програма, якою належить стати резидентною, завантажена і залишена в пам'яті за допомогою функції DOS 3 lh, управління передається СОММAND.СОМ,який чекає подальших команд оператора. Система не виконує якої-небудь перевірки імен програм, що запускаються, тому оператор може помилково повторно або навіть багато разів запустити ту ж програму, внаслідок чого в пам'яті залишаться резидентними два або декілька екземплярів однієї і тієї ж програми. Залежно від характеру настройки, що виконується на етапі ініціалізації, нові екземпляри програми можуть логічно "дезактивувати" попередні, але можуть і "зчіплюватися" з ними, так що при передачі управління резидентній програмі послідовно виконуватимуться всі її копії в пам'яті. Навіть якщо таке багатократне виконання не приведе до збою системи, повторного завантаження слід уникати, щоб не витрачати по-напрасну пам'ять.
Для захисту резидентної програми від повторного завантаження можна включити в завантажувальний модуль програми деякий довільний код (сигнатуру) і перевіряти його наявність в пам'яті в процесі ініціалізації програми. Такий метод зручний для резидентних програм, що запускаються через апаратний вектор переривання, наприклад, 0%. Якщо наша програма ще не встановлена, у векторі 09h зберігається адреса системного обробника, в якому, природно, немає сигнатури. Якщо ж наша програма вже встановлена, сигнатура в пам'яті є; процес повторної ініціалізації виявить її і аварійно завершиться.
Структура програми, що захищає себе від повторного завантаження, може виглядати таким чином.
org 100h ; Наша програма типу .COM jmp init ;На ініціалізацію nark dw 1234И;Сигнатура
entry:
;Робоча секція
init:movAX,3509h;Пустьцеобробникпереривання
int 21h ;от клавіатури
;Е5:вх=содерхимоє вектора 09h
sub Вх.2 ;BX->entry-2, тобто mark, якщо наша
;програма вже завантажена
cmp word ptr ES: [ВХ]. 1234h
je installed ; Сигнатура виявлена
;Сигнатура не виявлена. Продовження ініціалізації. ;Установка програми в
пам'яті
installed:
;Виведення повідомлення "Програма юшці встановлена!"
ШОУ AX,4C01h ;3авершение з кодом помилки і без int 21h залишення в пам'яті
Слід зазначити, що якщо після ініціалізації і установки описаної вище програми буде завантажена інша резидентна програма обробки того ж переривання, то розглянута методика не врятує від повторного завантаження, оскільки у векторі переривання знаходитиметься адреса іншої програми, в якій дана сигнатура відсутня.
Інший метод захисту резидентних програм від повторного завантаження зв'язаний з використанням мультиплексного переривання 2Fh. Структура резидентної програми з таким захистом може виглядати таким чином. ;Секція ініціалізації
;Перш за все перевіримо, чи не завантажена вже ця програма Init:
movAX,0C000h;Функція COh, підфункція 00h
int 2Fh ;Наш обробник повинен повернути ;AL=FFh
cmp AL,OFFh ;Установлена? je installed ;Так,уже! - на аварійний вихід
;Програма не встановлена. Продовження ініціалізації:установка
;власного обробника 2Fh, завантаження інших векторів ;залишення програми у пам'яті
;Обробник 2Fh, що входить до складу резидентної секції програми cmp AX.OCOOOh ;Наша функція і підфункція? jne notour ;Ні, викличемо системний обробник ;переривання 2Fh
mov AL,0FFh Програма вже завантажена (інакше ;звідки узятися цьому обробникові?},
;верхній код FFh назад ч секцію і ret ініціалізації
notour: jmp CS:old2fh ;Перехід у системний обробник переривання 2Fh
Завдання 10.1. Резидентні програми. Передача параметрів через область міжзадачного зв'язку BIOS, розташованого по адресах 40h:F0h, - 40h:FFh.
У даному завданні резидентна програма в процесі своєї ініціалізації поміщає за адресою 40h:F0h відносну адресу своєї точки входу, а за адресою 40h:F2h - своя сегментна адреса. Транзитна програма поміщає в осередок 40h:F4h довільне двійкове число через вектор 40h:F0h.. Резидентна програма витягує передане їй дане, перетворить його в десяткову форму в кодах ASCII і поміщає результат (6 байт, включаючи знаковий) в ту ж область міжзадачного зв'язку BIOS, починаючи з адреси 40h:F6h, після чого завершує свою роботу командою дальнього повернення RET. Транзитна програма, відновивши виконання, забирає перетворене число з області зв'язку і виводить його на екран відповідною функцією DOS.
Схема використання області міжзадачних зв'язків для даної задачі наведена
Алгоритм головної програми:
- Перевірка на присутність програми в пам'яті.
- Присутня, перехід на перевірку параметрів.
- Не присутня, встановлення нового обробника переривання 21h, залишення резидента в пам'яті.
- Перевірка параметрів на символи /г, /?, /s, /d.
- Якщо є символи /г, то вигрузка резидента з пам'яті (звільнення пам'яті, відновлення старого обробника переривання 21h).
- Якщо є символи /?, то вивід допомоги.
- Якщо є символи /s, то інвертування прапорцю зупинки(чи буде перевіряться ім'я на присутність в стоповому файлі).
- Якщо є символи /d, то вилучаємо файл, в якому записується інформація про програми, які запускаються на комп'ютері.
- Закінчити програму.
Алгоритм обробника переривання 21h:
1. Перевірка на функцію перевірки на присутність.
2. Перевірка на функцію 4Bh.
3. Якщо потрібно, перевірка на те, чи потрібно запускати дану програму.
4. Аналізується та записується інформація про дану програму в файл.
5. Виклик старого обробника переривання 2 lh.
6. Вихід з обробника.
Програма написана на мові ASM-86 з використанням команд процесора 86/286. Вона складається з головної програми, яка перевіряє параметри, які задані в командному рядку, та функції-обробника переривання 21h, який й контролює програми, які запускалися.
Перевага написаної мною програми-резидента в тому, що вона залишається постійно в пам'яті, завдяки чому користувач не помічає контролю.
Програма компілюється Turbo Assembler, зв'язується за допомогою TLINK.
5 Інструкція користувачу
Для того щоб завантажити програму необхідно запустити файл maks.exe.
Після запуску програма запуститься та буде знаходитися в пам'яті до вивантаження за допомогою спеціальної функції.
Для запуску резидентної програми, яка здійснює контроль програм, які запускалися на комп'ютері, потрібно в командному рядку набрати maks.com та натиснути Enter. Також в командному рядку можна задавати параметри:
"/R" - вивантажити програму з пам'яті.
"/?" - вивести допомогу.
"/D" - вилучення файлу зберігання програм, що запускалися.
"/S" - інвертування стопового прапору.
Програма лише викликає резидентну програми з іншої транзитної.
Висновок
В ході виконання курсового проекту була написана резидентна програма, яка викликається з транзитної. Під час написання програми були використанні та закріплені знання та вміння щодо системних засобів в прикладних програмах.
Всі системні засоби знаходяться в постійній пам'яті комп'ютера BIOS, в функції якого входить організація всього обчислювального процесу: запуск та завершення задач, керування пам'яттю, обслуговування файлової системи, обробка помилок і т.д. Базова система введення-виведення включає набір резидентних драйверів головних периферійних пристроїв комп'ютера, таких, як магнітні диски, консоль, принтер, послідовний порт, годинник. Програми BIOS забезпечують управління апаратурою на найнижчому, "фізичному" рівні, шляхом звернення до портів, регістрів та апаратних буферів, які являються апаратно- залежними (залежать від мікросхем).
Потреба в резидентних програмах достатньо висока, оскільки головне їх призначення полягає в тому, що вони розширюють можливості операційної системи. Тобто, годинники, драйвери, антивіруси являються резидентними. Тому для програміста є важливим знання принципу побудови резидентрної програми.
Програма написана на мові програмування ASM-86, оскільки дана мова забезпечує найширше використання системних засобів та має найвищу швидкодію.
Перелік умовних позначень
ОС - операційна система.
ООП - об'єктно-орієнтоване програмування.
ПЗ - програмне забезпечення.
ПК - персональний комп'ютер
і т.д. - і так далі
і ті. - і таке інше
та ін. - та інші
т.я. - так як
п. - пункт
ОС - операційна система
popup - резидентні програми, які викликаються користувачем
DOS - дискова операційна система
BIOS - базова система вводу/виводу
INT - переривання
PC - персональний комп'ютер
WINDOWS - операційна система
Список використаної літератури
- "Програмування на мові Асемблера EC ЕВМ" З.С. Брич. В.І. Воющ Москва 1989р. ст.166
- "Програмування на сучасних мовах програмування." Москва 1990р.
- ст.206
- "Основи мови Асемблер" В.І. Криволап. Москва 1997р. ст.309
- "Ассемблер для початківців"М.П.Шукін.Київ 1980р. ст.155
- "Турбо Асемблер"Л.В.Захаров. Харків 1995 р ст.178
- "Макро Асемблер"К.С. Кропійко О.Д. Богатирова.Київ - "Наука" 1991р.
- Електроний довідник BOOK.
Додаток А. Лістинг програми
myprocprocfar;Дальня'Процедура
jmp init;Перехід на секцію ініціалізації
entry:pushAX;зберігаємо все, щовикористовувалося
push ВХІв резидентній прогграмі
push СХ/регістри
push DX push SI
push DS;Збережемо DS основноі програми
;Налаштуємо DS на початок області даних BIOS
mov AX,DS:0F4h/отримаємо дані
mov ВХ, DF6h;ВХ=адреса результату
/Програма перетворення двійкового числа ;в ASCII - представлення
push АХ;збережемовихіднідані
mov СХ,6/лічильник байтів
fill_buff:mov byte ptr [ВХ],''/Заповнимо б байт
іпс ВХ;буферу результату
loop fillbuff/пробілами
mov SI,ID/Дільник - число ID
or AX,AX/Дані від'ємні?
jns clrdvd/Hi
neg AX/Такг зробимо позитивними
clr dvd:xor DX,DX/очистимо старшу половину діленого
div SI/розділимо DX:AX на SI
add DX,'O'/перетворимо залишок в ASCII
dec ВХ/повернемося в буфері
mov [ВХ],DL/занесемо цей символ в рядок
іпс СХ/зчитаємо символи, що перетворюються
or АХ,АХ/все зроблено?
jnz clr_dvd/Ні. Отримати наступну цифру
pop АХ/Так. Верній початкові дані
or АХ,АХ/Вони були від'ємні?
jns no_more/Ні. Залишити як є
dec ВХ/Так. Повернемося в буфері та
mov byte ptr [ВХ],/занесем туди знак іпс СХ/збільшимолічильниксимволів
по more:popDS відновимо
pop SI/всі регістри
pop DX
pop CX
pop BX
pop AX
ret/Вихід з підпрограми
endres equ $-myproc/Кінець резидентної частини init:
/Секція ініціалізації резидентної програми /НалаштуємоES на початокобластіданихBIOS
/Відправимов 4 0h:F0hзміщення,ав4 0h:F2h сегментнуадресу
mov ES:OFOh,offset entry mov ES:0F2h,CS
/Завершимо програму, залишивши її резидентну частину в пам'яті
Додаток Б. Блок-схема алгоритму програми
Документ
Категория
Рефераты
Просмотров
152
Размер файла
483 Кб
Теги
kursovik, proekt
1/--страниц
Пожаловаться на содержимое документа