МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Кафедра "Інформаційні системи та мережі "
К У Р С О В А Р О Б О Т А
з дисципліни "Системне програмування та операційні системи"
на тему:
“Резидентна програма для виведення статистики про наявні пристрої в ПК ”
ЗАВДАННЯ
на курсову роботу з дисципліни
“ Системне програмування та операційні системи ”
студента групи КН-26 Бориса Остапа
на тему:
“Резидентна програма виведення статистики про наявні пристрої в ПК”
1.
Провести огляд літературних джерел по заданій темі для аналізу методів розв’язування задачі.
26.02
2.
Методи та засоби розв’язування задачі.
26.03
3.
Виконати програмну реалізацію розроблених алгоритмів.
Вимоги до програми:
програма повинна бути реалізована мовою Intel Assembler;
програма повинна працювати у вікні MSDOS під керуванням операційної системи Windows;
програма повинна мати інтерфейс для вибору режимів її роботи; інтерфейс може бути реалізований мовами С/C++.
30.04
4.
Підготувати вхідні дані та виконати реалізацію контрольного прикладу.
14.05
5.
Оформити записку до курсової роботи згідно з вимогами Міжнародних стандартів, дотримуючись такого змісту:
-вступ;
-формулювання задачі;
-методи та засоби розв’язування задачі;
-алгоритми розв'язування задачі;
-опис програми;
-технологія програмування, виконання та відлагодження програми;
-інструкція користувачеві;
-контрольний приклад та результати роботи програми;
-висновки;
-література;
-додатки.
28.05
ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________15.02.2010
підпис студента
Керівник роботи: ____________/Ришковець Ю. В./
ЗМІСТ
Вступ 4
1. Формулювання задачі 5
2. Методи та засоби розв’язування задачі 5
3. Алгоритми розв’язування задачі 12
4. Програма та її опис 14
4. 1. Назва програми 14
4. 2. Призначення програми 14
4. 3. Мови програмування, на яких написана програма 14
4. 4. Логічна структура програми 15
4. 5. Вхідні та вихідні дані 16
4. 6. Програмні засоби 16
4. 7. Технічні засоби 16
5. Технологія програмування, виконання, відлагодження програми. 17
5. 1. Технологія програмування 17
5. 2. Технологія виконання програми 17
5. 3. Відлагодження програми 17
5. 4. Надійність програми у межах зміни вхідних даних 18
5. 5. Контрольний приклад та аналіз компютерної реалізації програми…….. 18
6. Інструкція користувачеві 19
Висновки 19
Список використаної літератури 20
Додаток 1. Текст програми на мові Assembler 21
ВСТУП
Метою виконання курсової роботи є закріплення теоретичних знань та практичних навичок програмування, набутих при вивченні дисциплін “Системне програмування та операційні системи”. В ході виконання курсової роботи студенти повинні навчитися самостійно працювати з літературою, розробляти алгоритми, здійснювати їх програмну реалізацію та відлагодження на сучасних обчислювальних системах. Моє індивідуальне завдання на курсову роботу, полягає у розробці резидентної програми для виведення інформації про наявні пристрої в ПК. Майже кожному може знадобитися інформація про пристрої в ПК, але для того, щоб її дізнатися потрібно розбирати системний блок , також можна дізнатися за допомогою спеціального програмного забезпечення, але його потрібно купувати. Саме для того, щоб це не робити мною розроблена програма на мові асемблера на тему: “ Резидентна програма виведення статистики про наявні пристрої в ПК ”.
ФОРМУЛЮВАННЯ ЗАДАЧІ
Програми мовою Асемблер дуже точні. Ця мова дозволяє програмістові безпосередньо працювати з усім апаратним забезпеченням, тобто програми на Асемблері можуть робити те, що недоступно програмам, написаним на будь-якій іншій мові. Безсумнівно, що в програмуванні пристроїв, де потрібен контроль над окремими розрядами регістрів пристрою, програмування мовою Асемблер – єдиний оптимальний вихід.
Дана програма, написана мовою Асемблер, призначена для визначення інформації про наявні пристрої в ПК.
Працює в DOS/Wіn9x, NT, XP із правами адміністратора.
Програма може використовуватись будь-ким. Вона повинна відповідати таким системним вимогам : Операційна система – DOS, Windows 3.1 або старша, пам’ять - 2M і вище.
МЕТОДИ ТА ЗАСОБИ РОЗВЯЗУВАННЯ ЗАДАЧІ
Резидентна програма - програма, яка потрапляє в оперативну пам'ять при запуску і знаходяться там до вимкнення програми, або, що найбільш типово, перезавантаження комп'ютера.
Резидентна програма складається з двох частин:
резидентна - один або декілька обробників переривань;
секція ініціалізації - запускається, розміщує в оперативній пам'яті відповідні обробники переривань, настроює на ці обробники вектори переривань, далі завершує роботу так, щоб в оперативній пам'яті залишилась резидентна частина.
Наприклад:
21h - переривання,
31h - функція, яка залишає в пам'яті обробник переривання.
Мова Асемблер – це система запису програми з деталізацією до окремої машинної команди, яка дозволяє використовувати позначення команд і символічне задання адрес.
Написання асемблер них програм потребує знань організації всієї системи комп’ютера. В основі комп’ютера лежить поняття біта і байта. Вони являються тим засобом, завдяки яким в комп’ютерній пам’яті представлені дані і команди.
Програма в машинному коді складається з різних сегментів для визначення даних, для машинних команд і для сегмента, який називається стеком, для зберігання адрес. Для виконання арифметичних дій, пересилання даних і адресації комп’ютер має ряд регістрів .
Оскільки в різних апаратних архітектурах різні програмно-доступні компоненти (система команд, регістри, способи адресування), мова Асемблер є апаратно-зележною. Програми, написані на мові Асемблер можуть бути перенесені тільки на обчислювальну систему з такою ж архітектурою.
Програмування на Асемблері дозволяє максимально використати особливості архітектури обчислювальної системи. Донедавна було аксіомою те, що асемблерна програма завжди є більш ефективною і в сенсі швидкодії, і в сенсі вимог до пам’яті.
Програма в машинному коді складається з різних сегментів для визначення даних, для машинних команд і для сегменту, який називається стеком, для зберігання адрес. Для виконання арифметичних дій, пересилання даних і адресації комп’ютер має ряд регістрів.
Для виконання програм комп’ютер тимчасово записує програму і дані в основну пам'ять. Комп’ютер також має ряд регістрів, які він використовує для тимчасових обчислень.
Програма на мові Intel Assembler може складатися із одного або декількох сегментів. Сегментом програми називається та її частина, що складається із команд чи даних, розміри яких не перевищують 64 Кбайт. Існує три основних сегменти програми:
сегмент стеку;
сегмент коду;
сегмент даних.
Сегмент стеку – ділянка пам’яті, відведена під стек. Потрібно пам’ятати, що навіть якщо ви в своїй програмі не використовуєте стек, в програмі треба описати сегмент стеку. Це необхідно в міру того, що стек програми використовує операційна система при опрацюванні переривань, які виникають в процесі роботи програми.
Сегмент коду – це сегмент, в якому знаходяться команди. Це основний сегмент програми, аналог функції MAIN у мові програмування С чи С++, з якої починається виконання програми.
Сегмент даних – це сегмент, в якому знаходяться дані, що використовуються у програмі.
Мова програмування Асемблер дозволяє змінювати структуру програми як завгодно, наприклад, заносити дані в сегмент коду, розбивати код на будь-яку кількість сегментів або взагалі використовувати тільки один сегмент для всієї програми.
Команда mov використовується для копіювання значення з одного місця в інше. Цим місцем може бути регістр, комірка пам’яті чи безпосереднє значення (тільки як вихідне значення).
Стек – це область пам’яті, на яку вказує регістр стеку ESP. Стек є місцем для збереження адрес повернення і тимчасових значень. Існують дві команди для розміщення значення в стеку і вивільнення його зі стеку: PUSH і POP. Команда PUSH розміщує значення в стеку, тобто поміщає значення в комірку пам’яті, на яку вказує регістр ESP, після цього значення цього регістру збільшується на 4. Команда РОР вивільняє значення із стеку, тобто вивільняє з комірки пам’яті, на яку вказує регістр ESP, після цього зменшує значення регістру ESP на 4. Значення, яке поміщається у стек, вивільняється першим. При поміщенні значення в стек, вказівник стеку зменшується, а при вивільненні – збільшується.
Регістр є пристроєм тимчасового зберігання даних і використається з метою полегшення арифметичних, логічних операцій. Вісім регістрів загального призначення мають довжину в 32 біт і містять адреси або дані. Вони підтримують операнди:
- дані довжиною 1, 8, 16, 32 і 64 біт;
- бітові поля від 1 до 32 біт;
- операнди - адреси довжиною 16 і 32 біт.
Ці регістри називаються EAX, EBX, ECX, EDX, ESІ, EDІ, EBP, ESP. Доступ до молодших 16 біт цих регістрів виконується незалежно.
Для коректної обробки даних в асемблері потрібна розгалуженість програми. Це досягається використанням умовних переходів. Умовний перехід – це така команда процесора, при якій, в залежності від стану регістру прапорців відбувається передача управління по деякій адресі, іншими словами – стрибок. Ця адреса може бути близькою або далекою. Стрибок вважається близьким, якщо адреса, на якій робиться стрибок, знаходиться не далі, ніж 128 байт назад і 127 байт вперед від наступної команди. Дальній стрибок – це стрибок далі, ніж на [-128, 127] байт. Кожна команда змінює регістр прапорців в залежності від результату своєї операції. Зазвичай перед командою стрибка йде команда порівняння, яка змінює свій регістр прапорців в залежності від результату.
Регістр прапорців має набір прапорців, які встановлюються в залежності від обчислень чи інших подій.
Алгоритм виконання програми заставляє його виконувати програми один за одною, в тому порядку, як вони були описані у вихідному тексті програми і містяться у виконуваному модулі. Однак часто необхідно порушити цей порядок, заставивши процесор обійти якусь частину програми, перейти на виконання іншої гілки чи передати управління програмі, тобто після її завершення повернутися на попереднє місце. Всі ці операції здійснюються за допомогою команд переходів. Переходи поділяються на безумовні, коли передача управління в іншу точку програми здійснюється у безумовному порядку, незалежно від будь-яких обставин, і умовні, здійснювані чи не здійснювані в залежності від тих чи інших умов: результатів порівняння, аналізу, пошуку. Безумовні переходи поділяються на власне переходи (без повернення в точку переходу) і виклики підпрограм (з поверненням після завершення підпрограми) .
Операції переходів і викликів підпрограм, поміж їх практичної цінності, представляють значну методичну цікавість, так як зачіпають основу архітектури процесора – сегментну адресацію пам’яті. Багаточисельні різновиди команд переходів і викликів зобов’язані своїм існуванням не стільки потребам практичного програмування, стільки принциповим архітектурним особливостям процесора.
Безумовні переходи здійснюються за допомогою команди jmp, яка може ви користуватися в 5 різних видах. Перехід може бути:
прямим коротким (в межах -128… + 127 байтів);
прямим близьким (в межах поточного сегменту команд);
прямим далеким (в інший сегмент команд);
непрямий близький (в межах поточного сегменту команд через комірку з адресою переходу);
непрямий далекий (в інший сегмент команд через комірку з адресою переходу).
Прямим називається перехід, в команді якого в явній формі вказується мітка, на яку потрібно перейти. Звісно, ця мітка повинна бути присутньою в тому ж програмному сегменті, при цьому позначена нею команда може знаходитися к до так і після команди jmp.
Прямий близький відрізняється від прямого тільки тим, що під зміщення до точки переходу відводиться ціле число. Це дає можливість здійснити перехід в будь-яку точку 64-кбайтного сегменту.
Прямий далекий перехід дозволяє передати управління в будь-яку точку будь-якого сегменту. При цьому, очевидно, що програмний комплекс включає декілька сегментів команд.
Команди непрямих переходів можуть використовувати різні способи адресації і, відповідно, мати багато різних варіантів.
Непрямий далекий перехід здійснюється за адресою, яка міститься в комірці памяті, однак ця комірка має розмір 2 слова і в ній міститься повна (сегмент плюс зміщення) адреса точки переходу.
Основне призначення підпрограм – це скорочення коду основної програми: одні і ті ж інструкції не потрібно писати декілька разів – їх можна обєднати в підпрограми і викликати по мірі необхідності.
Для виклику підпрорами використовується команда CALL, а для повернення з підпрограми в основну программу – RET. Формат обидвох команд такий:
CALL тип_вызова операнды
RET
Команді CALL необхідно передати всього один операнд – адресу підпрограми. Це може бути безпосереднє значення, зміст регістру, памяті чи мітка. На відміну від JMP, при виконанні команди CALL перш за все зберігається у стеку значення регістру ІР (ЕІР). Передача управління на вказану адресу називається викликом підпрограми.
Як і команді JMP, команді CALL можна вказати «розмір кроку».
Повернення із підпрограми виконується за допомогою команди RET, яка виштовхує із стеку його вершину в ІР (ЕІР). Після цього процессор продовжить виконання інструкцій, які знаходятся в основній програмі після команди CALL [2].
Для розв'язку поставленої задачі я використав компілятор TASM 4.1. Розробляв та запускав у операційній системі Windows XP SP3. Для набирання програми використовував текстовий редактор “PSPad”, а для компіляції – наступний BAT-файл:
del %1.exe
tasm /zi %1.asm
tlink /v %1.obj
del %1.obj
del %1.map
АЛГОРИТМ РОЗВЯЗУВАННЯ ЗАДАЧІ
Для реалізації алгоритму задачі мною були проведені наступні дії. Я почав з підключення мікропроцесора 386, вибрав модель пам’яті flat, оголосив значення параметра функції GetStdHandle, параметри, що передаються в процедуру Ring0_GetDevInfo, параметри пристрою IDE/ATAPI, далі оголосив сегмент даних. В сегменті даних оголосив такі змінні:
szPriMaster DB "=========Primary Master===========", 0Dh, 0Ah, 0
szPriSlave DB "============Primary Slave==========", 0Dh, 0Ah, 0
szSecMaster DB "==============Secondary Master=====", 0Dh, 0Ah, 0
szSecSlave DB "===========Secondary Slave=========", 0Dh, 0Ah, 0
szTerMaster DB "===========Tertiary Master=========", 0Dh, 0Ah, 0
szTerSlave DB "==========Tertiary Slave===========", 0Dh, 0Ah, 0
szQuaMaster DB "==========Quaternary Master========", 0Dh, 0Ah, 0
szQuaSlave DB "==========Quaternary Slave=========", 0Dh, 0Ah, 0
szDevice DB " Device: %s", 0Dh, 0Ah, 0
szModel DB " Model: %s", 0Dh, 0Ah, 0
szFirmwareRev DB "Firmware Revision: %s", 0Dh, 0Ah, 0
szSerNum DB " Serial Number: %s", 0Dh, 0Ah, 0
szHDD DB "HDD %uM", 0
szUnknown DB "Unknown", 0
szPressAnyKey DB 0Dh, 0Ah, "Press any key...", 0
DevInfo DW 256 DUP(?)
Після ініціалізації змінних відбувається зчитування системних даних, сканування пристрою IDE/ATAPI, отримання інформації про пристрій IDE/ATAPI, вивід інформації про пристрій IDE/ATAPI (тип пристрою, його модель, мікропрограмний номер, серійний номер).
Рис. 1. Блок-схема алгоритму програми
4. ОПИС ПРОГРАМИ
4. 1. Назва програми.
kurs
4. 2. Призначення програми.
За допомогою цієї програми можна отримати інформацію наявні пристрої в ПК.
4. 3. Мова програмування на якій написана програма.
Assembler – система програмування, яка включає мову асемблера та транслятор цієї мови. Є мовою програмування низького рівня. Іншими словами – програма, яка перекладає текст з мови, зрозумілої людині, в мову, зрозумілу процесору, тобто, можна сказати, що вона перекладає мову асемблера в машинний код. В повсякденній мові, а тепер і в літературі слово «асемблер» стало також назвою мови програмування.
Assembler - мова програмування, за допомогою якого можна написати такі програми, які неможливо, або дуже складно написати на інших мовах програмування.
Мова асемблера — це мова, на якій "говорить" процесор, і зникнути він може тільки разом із зникненням процесорів! З цієї ж причини асемблер має одну фундаментальну перевагу перед мовами високого рівня: він найшвидший. Більшість додатків, що працюють в режимі реального часу, або написані на асемблері, або використовують в критичних ділянках коди асемблерні модулі.
Нерідко можна чути твердження про те, що процес розробки програм на мові асемблера дуже трудомісткий і віднімає масу часу. Ще однією перешкодою для роботи з асемблером рахують його складність. І, нарешті, як аргумент приводиться твердження, що розробка додатків на асемблері сильно утруднена через відсутність сучасних інструментальних засобів для проектування і відладки.
Такі твердження, взагалі-то, не відповідають дійсності. Мова асемблера не складніше за інші мови програмування і досить легко освоюється як досвідченими, так і початкуючими програмістами. Крім того, останніми роками з'явилися дуже могутні інструментальні засоби розробки програм на асемблері, і це вимушує по-іншому поглянути на процес розробки програм на цій мові. Серед таких інструментальних засобів проектування можна назвати макроасемблер.
Текст програми на мові асемблера записується в один або кілька файлів, імена файлів і їх розширення можуть бути будь-які, прийнято для файлів які містять програми мовою асемблера прийнято використовувати розширення *.asm. Для файлів визначених констант і повних типів розширення *.inc. Ці файли є текстовими їх можна набрати в будь-якому текстовому редакторі. Можна також використати інтегровані середовища для розробки програм, при програмуванні зручно виділяти один каталог для збереження всіх файлів програми і звідти запускати всі необхідні програми для підготовки, асемблювання та компонування програми. При використанні стандартних редакторів тексту, редаговані тексти треба зберігати у вигляді звичайних файлів у форматі ASCII, це означає, що ці файли треба зберігати без додаткових символів, ці символи часто вставляють в текст різні спеціалізовані редактори.
Підготовлений текст мови асемблер є початковим для спеціальних програм, які називаються асемблерами, далі програма асемблера. Задача програми асемблера перетворити текст програми у форму двійкових команд, останні можуть вже бути виконанні мікропроцесором. Після асемблювання дістають так звані файли об’єктних модулів, які мають відповідні розширення *.obj. Для отримання об’єктних файлів необхідного виконати відповідну програму асемблера masm фірми Microsoft, або tasm фірми Borland. В обох випадках після команди вказується ім’я файлу : masm prog1.asm, tasm prog1.asm.
Така форма команди є мінімальною, крім цієї форми можна використовувати іншу форму задаючи перед іменем файлу опції або ключі. Якщо програма складається з декількох файлів, то їх асемблювання проводиться незалежно один від одного, хоча отримані об’єктні файли представлені вже в двійковій формі запускати їх на виконання не можливо.
Мова програмування асемблер дозволяє змінювати структуру програми як завгодно, наприклад, заносити дані в сегмент коду, розбивати код на будь-яку кількість сегментів або взагалі використовувати тільки один сегмент для всієї програми.
4. 4. Логічна структура програми.
Структура даної програми містить у собі невелику кількість процедур, але ця кількість є достатньою для безпомилкового функціонування і для її простого розуміння з боку інших програмістів. Програма працює лінійно, покроково виконуючи всі оператори.
Процедура PrintDevInfo виводить інформацію про пристрій IDE/ATAPI . Використовує функції: lstrcpynA, printf. Виклик відбувається з регістра EDI – буфера з інформацією про пристрій. Змінювані регістри: EAX,ECX,EDX,Flags.
За допомогою процедури W9x_GetDevInfo отримуємо інформацію про пристрій IDE/ATAPI (для Win9x). Використовує функції: Ring0Call, Ring0_GetDevInfo. Виклик відбувається у регістрах: DX- базовий порт, AL - номер пристрою, EDI - буфер для інформації про пристрій. Повернення у регістр EAX – прапорець вдалого/невдалого завершення. Змінні регістри: EAX,ECX,DX,Flags.
Завдяки процедурі Ring0_GetDevInfo отримуємо інформацію про пристрій IDE/ATAPI (викликається з Ring 0). Використовує функції: DetectATAPIDev, GetATAPIDevInfo, GetIDEDevInfo. Виклик відбувається у регістрі ECX, в якому містяться параметри для отримання інформації(GETDEVINFOPARAMS). Повернення в регістр EAX – прапорець успішного/невдалого завершення. Змінні регістри: EAX,ECX,DX,Flags.
4. 5. Вхідні та вихідні дані.
Більшість даних програми є змінними. Так як для визначення інформації про жорсткий диск потрібно за стандартною схемою оголошувати всі дані – тип пристрою, модель, мікропрограмний номер, серійний номер. А також константами є повідомлення від клавіатури, а також атрибути файлової директорії.
4. 6. Програмні засоби.
Завдяки особливостям мови програмування Assembler для використання даної програми не потрібно ніяких особливих програмних засобів. Після створення ехе-файлу, дана програма працює в DOS/Wіn9x, NT, XP з правами адміністратора. Також вона відповідає таким системним вимогам : операційна система – DOS, Windows 3.1 або старша, пам’ять - 2M і вище. А оскільки більшість користувачів використовують саме такі операційні системи можна вважати, що дана програма є мобільною, тобто без значних змін виконується на різних комп’ютерах. Правда компілювання програми відбувалося з допомогою використання оновленої версії середовища Асемблеру, а зокрема – VGM Assembler 1.0.
4. 7. Технічні засоби.
Розроблена програма може бути переміщена на будь-який комп’ютер, завдяки переносним засобам інформації. Комп’ютер на якому ми хочемо використовувати програму повинен відповідати таким системним вимогам: операційна система – DOS, Windows 3.1 або старша, пам’ять - 2MВ і вище.
Отож, якщо користувач має усі вище перераховані технічні засоби, він може користуватися програмою, розробленою протягом курсової роботи.
5. ТЕХНОЛОГІЯ ПРОГРАМУВАНЯ, ВИКОНАННЯ ТА ВІДЛАГОДЖЕННЯ ПРОГРАМИ
5. 1. Технологія програмування
Програма була неодноразово протестована із різними значеннями вхідних параметрів. Неодноразово під час виконання виявлялися похибки (більшість із них пов’язана із синтаксисом функцій). Всі помилки пов’язані з правильним написанням функцій були локалізовані і виправлені.
5. 2. Технологія виконання програми
Для запуску програми з носія необхідно знайти файл з розширенням .ехе і після цього натиснути Enter. В результаті цього на екран буде виведена інформація про наявні пристрої в ПК.
5. 3. Відлагодження програми.
Для успішного написання програми її від лагодження повинно відбуватися покроково. Тобто після написання якоїсь частини програми (це може бути підпрограма) виконується компіляція, пошук помилок та їх виправлення. Потрібно пам’ятати, що ті помилки, які показує компілятор, не завжди стосуються саме тих частин на які він вказує. Причина може виявитися у попередніх операторах. Також слід не забувати, що компілятор не показує логічних помилок, які ми створюємо. Тому перед запуском програми необхідно перевірии її на наявність таких помилок. У таких випадках прийде на допомогу попередньо розроблений алгоритм розв’язування задачі.
5. 4. Надійність програми у межах зміни вхідних даних.
Програма є надійною стосовно зміни вхідних даних. Поданий файл є стійким і відповідає вимогам до структурованої інформації.
5. 5. Контрольний приклад та аналіз комп’ютерної реалізації програми
Щоб протестувати програму необхідно її запустити і перевірити чи коректно виводиться інформація про жорсткий диск, а саме тип пристрою, його модель, мікропрограмний номер, серійний номер.
В результаті останнього запуску програми я отримав це зображення:
Рис. 2. Результат виконання програми
Проаналізувавши результати даного контрольного тестування програми можна зробити висновок, що програма працює правильно. Оскільки результати, які ми отримали в результаті комп’ютерної реалізації програми співпадають з результатами, які ми отримали при ручній перевірці.
Необхідно звернути увагу на те, що результати роботи програми ми отримали швидко, що дозволяє користувачу не затримуватися і продовжити свою роботу над іншим проектом, за необхідності. Робота даної програми не займає великої кількості пам’яті, що є вигідним для користувача.
Також необхідно замітити, що інтерфейс розробленої програми не є виснажливим для людського ока, що в свою чергу дозволяє користувачеві провести більшу кількість часу перед екраном монітора
6. ІНСТРУКЦІЯ КОРИСТУВАЧЕВІ
Інтерфейс програми є зручним, інтуїтивно зрозумілим, простим у користуванні і не потребує додаткових зусиль. Управління програмою реалізоване за допомогою миші і відповідає програмному інтерфейсу.
Дана програма може використовуватися у різних операційних системах. Працює в DOS/Wіn9x, NT, XP з правами адміністратора, пам’ять - 2M і вище. У будь-якій операційній системі для того, щоб запустити програму необхідно клацнути або виділити і натиснути клавішу Enter, на файлі розширення якого є .ехе. Це файл з назвою kurs.exe.
Інтерфейс програми є зручним, інтуїтивно зрозумілим, простим у користуванні і не потребує додаткових зусиль. Управління програмою реалізоване за допомогою клавіатури і відповідає програмному інтерфейсу.
Після запуску програми появляється вікно з результатами запитів: тип пристрою, його модель, мікропрограмний номер, серійний номер.
Для успішного виходу з програми натисніть будь-яку клавішу.
ВИСНОВОК
В ході виконання курсової роботи я закріпив практичні навички, набуті під час вивчення курсу “Системне програмування та операційні системи”. Крім того я навчився самостійно опрацьовувати навчальну літеретуру, розробляти алгоритми та програмно втілювати їх.
Я написав “Резидентну програму для визначення інформації про наявні пристрої в ПК ”, яка виводить інформацію про пристрої за допомогою інтерфейсу ІDE/ATAPІ, зокрема серійних номерів.
До позитивних сторін цієї програми можна віднести її мобільність, тобто програма без змін може використовуватися на різних комп’ютерах. Також дана програма може використовуватися у різних операційних системах, а саме в DOS/Wіn9x, NT, XP з правами адміністратора. Інтерфейс розробленої навчальної підсистеми є надзвичайно простим у використанні та є маловиснажливим для людського ока, що у свою чергу , дозволить користувачеві провести більше часу за комп’ютером, при користуванні програмою.
До недоліків програми можна віднести керування програмою тільки за допомогою клавіатури.
Необхідно пам’ятати, що кожна програма має свої особливості написання, тому алгоритми розроблені для інших програм, можуть лише полегшити написання програми , або вказати вірний напрямок для написання алгоритму.
Список використаної літератури:
Методичні вказівки до курсової роботи з дисциплiни "Системне програмування" для студентів спеціальності “Інтелектуальні системи прийняття рішень” / Укл. П.О.Кравець. - Львів: Видавництво Національного університету “Львівська політехніка”, 2008. - 19 с.
Рудольф Марек "Ассемблер на примерах. Базовый курс". – СПб: Наука и техника, 2005. – 240с.
Финогенов К. Г. "Основы языка Ассемблера"
Абель Питер. Язык Ассемблера для IBM PC и программирования. - М., "Высшая школа",1992. – 423c.
Зубков Д. Д. Программирование на Assembler для DOS, WINDOWS и UNIX. М., ДМК, 2000. – 325c.
Додаток 1. Текст програми на мові Assembler
.386
LOCALS
.MODEL FLAT
L EQU <LARGE>
; Значення параметра функції GetStdHandle
STD_INPUT_HANDLE EQU -10 ; дескриптор стандартного вхідного потоку
STD_OUTPUT_HANDLE EQU -11 ; дескриптор стандартного вихідного потоку
STD_ERROR_HANDLE EQU -12 ; дескриптор стандартного потоку помилок
;*******************************************************************
;Параметри пристрою IDE/ATAPI
;********************************************************************
SCANDEVENTRY STRUC
sde_wBasePort DW ?
sde_bDevNum DB ?
sde_lpszPort DD ?
SCANDEVENTRY ENDS
EXTRN hStdOut:DWORD
EXTRN ExitProcess:PROC
EXTRN GetStdHandle:PROC
EXTRN WaitForSingleObject:PROC
EXTRN _wsprintfA:PROC
EXTRN lstrcpynA:PROC
EXTRN GetVersionExA:PROC
.DATA
szPriMaster DB "=========Primary Master===========", 0Dh, 0Ah, 0
szPriSlave DB "============Primary Slave==========", 0Dh, 0Ah, 0
szSecMaster DB "==============Secondary Master=====", 0Dh, 0Ah, 0
szSecSlave DB "===========Secondary Slave=========", 0Dh, 0Ah, 0
szTerMaster DB "===========Tertiary Master=========", 0Dh, 0Ah, 0
szTerSlave DB "==========Tertiary Slave===========", 0Dh, 0Ah, 0
szQuaMaster DB "==========Quaternary Master========", 0Dh, 0Ah, 0
szQuaSlave DB "==========Quaternary Slave=========", 0Dh, 0Ah, 0
szDevice DB " Device: %s", 0Dh, 0Ah, 0
szModel DB " Model: %s", 0Dh, 0Ah, 0
szFirmwareRev DB "Firmware Revision: %s", 0Dh, 0Ah, 0
szSerNum DB " Serial Number: %s", 0Dh, 0Ah, 0
szHDD DB "HDD %uM", 0
szUnknown DB "Unknown", 0
szPressAnyKey DB 0Dh, 0Ah, "Press any key...", 0
ScanDevices SCANDEVENTRY <1F0h,0,OFFSET szPriMaster>
SCANDEVENTRY <1F0h,1,OFFSET szPriSlave>
SCANDEVENTRY <170h,2,OFFSET szSecMaster>
SCANDEVENTRY <170h,3,OFFSET szSecSlave>
SCANDEVENTRY <1E8h,4,OFFSET szTerMaster>
SCANDEVENTRY <1E8h,5,OFFSET szTerSlave>
SCANDEVENTRY <168h,6,OFFSET szQuaMaster>
SCANDEVENTRY <168h,7,OFFSET szQuaSlave>
SCANDEVICESCOUNT = ($-ScanDevices)/SIZE SCANDEVENTRY
.DATA?
DevInfo DW 256 DUP(?)
.CODE
EXTRN puts:PROC
EXTRN fputs:PROC
EXTRN printf:PROC
EXTRN Ring0Call:PROC
EXTRN GetATAPIDevInfo:PROC ; отримання інформації про пристрій ATAPI
EXTRN GetIDEDevInfo:PROC ; отримання інформації про пристрій IDE
EXTRN DetectATAPIDev:PROC ; перевірка чи пристрій ATAPI
EXTRN NT_GetDevInfo:PROC
Start:
push L STD_OUTPUT_HANDLE
call GetStdHandle
inc eax
jz Exit ; якщо еах = 0 - перехід на Exit, інакше - якщо еах = 1
dec eax
mov [hStdOut],eax
mov ebp,OFFSET W9x_GetDevInfo ; ebp = інформація про IDE/ATAPI(Win9x)
jnz @@ScanDevices ; якщо недорівнює 0 - перехід
mov ebp,OFFSET NT_GetDevInfo
@@ScanDevices:
;Сканування пристрою IDE/ATAPI
mov esi,OFFSET ScanDevices ;ESI -> ScanDevices
mov edi,OFFSET DevInfo ;EDI -> DevInfo
mov ecx,SCANDEVICESCOUNT
@@DevLoop: push ecx
;Отримання інформації про пристрій IDE/ATAPI
mov dx,[(SCANDEVENTRY PTR esi).sde_wBasePort]
mov al,[(SCANDEVENTRY PTR esi).sde_bDevNum]
call ebp
or eax,eax ;інформація отримана?
jz @@NextDev ; перехід, якщо =0, інакше - якщо =1
;Вивід інформації про пристрій IDE/ATAPI
push [(SCANDEVENTRY PTR esi).sde_lpszPort]
call puts
call PrintDevInfo ; вивід інформації про пристрій IDE/ATAPI
@@NextDev: pop ecx
add esi,SIZE SCANDEVENTRY
loop @@DevLoop
;Очікування натискання клавіші
push L STD_ERROR_HANDLE
call GetStdHandle ; виведення повідомлення "Press any key"
push L OFFSET szPressAnyKey
push eax
call fputs
push L STD_INPUT_HANDLE
call GetStdHandle
inc eax
jz Exit
dec eax
push L 0FFFFFFFFh
push eax
call WaitForSingleObject
Exit:
push L 0
call ExitProcess
;********************************************************************
;PrintDevInfo вивід інформації про пристрій IDE/ATAPI
;********************************************************************
;Використовує: lstrcpynA, printf
;
;Виклик: EDI -> буфер з інформацією про пристрій
;
;Виклик: ні
;
;Змінювані регістри: EAX,ECX,EDX,Flags
;********************************************************************
PrintDevInfo PROC
LOCAL @@szTemp:BYTE:64 = LOCAL_SIZE
enter LOCAL_SIZE,0
push esi
lea esi,[@@szTemp] ;ESI -> @@szTemp
;Тип пристрою
mov al,[edi+1]
test al,80h ;пристрій ATAPI?
jz @@IDE
and al,1Fh ;AL = тип пристрою ATAPI
cmp al,5
mov eax,OFFSET szUnknown
je @@PrintDeviceType
mov eax,OFFSET szUnknown
jmp @@PrintDeviceType
@@IDE:
; Жорсткий диск IDE
mov eax,DWORD PTR [edi+120] ;EAX = загальна кількість секторів
;в режимі LBA
cmp eax,16515072
jae @@GetSizeInMB ; перехід, якщо більше рівне для цілого без знаку
movzx eax,WORD PTR [edi+2]
movzx ecx,WORD PTR [edi+6]
mul ecx
movzx ecx,WORD PTR [edi+12]
mul ecx
;визначити розмір в Мб
@@GetSizeInMB: mov ecx,512
mul ecx ; есх = есх * 512
mov ecx,500000
div ecx ; есх\500000
shr eax,1 ; зсув есх на 1 розряд
adc eax,0 ; еах = еах + 0
push eax
push L OFFSET szHDD
push esi
call _wsprintfA
add esp,12
mov eax,esi