Міністерство освіти і науки, молоді та спорту України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ ФУНКЦІЙ АРІ
Методичні вказівкидо лабораторної роботи № 5 з курсу “ Системне програмування ”
для студентів базового напряму 6.050102 - “Комп’ютерна інженерія”
Затвердженона засіданні кафедри”Електронні обчислювальні машини”Протокол № від року
Львів – 2011
Особливості програмування з використанням функцій АРІ: Методичні вказівки до лабораторної роботи № 5 з курсу “ Системне програмування ” для студентів базового напряму 6.050102 - “Комп’ютерна інженерія” / Укладачі: Мархивка В.С., Олексів М.В., Акимишин О.І., Мороз І.В., – Львів: Національний університет “Львівська політехніка”, 2011, 8 с.
Укладачі Мархивка В.С., ст. викл.
Олексів М. В., асистент
Акимишин О.І., к.т.н., доцент
Мороз І.В., ст. викл.
Рецензенти
Відповідальний за випуск: Мельник А. О., професор, завідувач кафедри
ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ ФУНКЦІЙ АРІ
Мета: Ознайомитись з можливостями програмування на Асемблері під Windows та засвоїти навики використання функцій АРІ.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Незважаючи на те що Wіndows 95/NT/ХР здаються складнішими операційними системам у порівнянні з DOS, програмувати для них на асемблері набагато простіше. Wіndows-задача запускається в 32-бітному режимі з моделлю пам'яті flat та не передбачає низькорівневого програмування різних пристроїв комп'ютера так як це було у DOS. В існуючих операційних системах програми користуються тільки системними викликами Wіn32 APІ функції, число яких тут перевищує 2000 (близько 2200 для Wіndows 95 і 2434 для Wіndows NT).
Всі Wіndows-задачі використовують спеціальний формат виконавчих файлів - формат РЕ (Portable Executable). Такі файли починаються як звичайні Ехе-файлы старого зразка (їх також називають MZ по першим двох символах заголовка). Якщо такий файл запустити з DOS, він виконається й видасть повідомлення про помилку (текст повідомлення залежить від використовуваного компілятора), у той час як Wіndows помітить, що після звичайного MZ-заголовка файлу йде РЕ-заголовок, і запустить програму. Це буде означати лише те, що для компіляції програм будуть потрібні інші параметри в командному рядку.
Win32 API (розшифровується як інтерфейс прикладних програм) - це множина підпрограм-функцій, на яких побудована операційна система WINDOWS, яка використовує 32х-бітну адресацію, починаючи з WINDOWS 95 і закінчуючи WINDOWS XP. Розробники WINDOWS зробили багато зусиль щоб стандартизувати як назви функцій, так і їх параметри. Тому використовувати їх не так важко, якщо засвоїти деякі загальні концепції.
Більшість функцій доступні для програм користувача, які написані для Windows на будь-якій мові програмування (у тому числі і на асемблері). Множина цих функцій розширюється при переході до наступної версії Windows, таким чином, забезпечується сумісність розроблених раніше програм із новими версіями операційної системи. Існують і функції, які не відображені в документації, або для свого застосування вимагають від програми спеціальних прав доступу до пам'яті.
Суть функцій API зрозуміти значно легше, якщо уявити, з яких файлів вони викликаються і на які групи ці функції поділяються. Асемблер - це як раз той зручний і простий засіб, який дозволить вам звертатись безпосередньо до будь-якої функції API, що знаходиться у DLL-файлі.
Секрет пізнання операційної системи через програмування на асемблері полягає у тому, що сам асемблер не накладає жодних обмежень на програму та дані, з якими вона працює. Це повинен робити сам програміст з метою захисту операційної системи від своїх некоректних дій. Таким чином, основною метою системного програмування є написання коректних програм з необмеженими можливостями (в рамках операційної системи). Для збереження коректності ми будемо користуватися певними правилами програмування, які будуть зрозумілі на конкретних прикладах.
Типи програм. Процесори стандарту Intel можуть працювати в трьох основних режимах: реальному, віртуальному і захищеному. При включенні комп'ютера його процесор працює в реальному режимі. Після завантаження операційної системи (ОС) процесор може бути переключений програмами ОС в інші режими. В реальному та віртуальному режимах використовується 16-бітна адресація з фіксованими сегментами по 64К. У захищеному режимі використовується 32х-бітна адресація з необмеженими сегментами, і адреса до пам'яті формується (на апаратному рівні) за допомогою дескрипторних таблиць, в яких задаються початкові адреси сегментів, їх довжина, та права доступу до пам'яті і до портів для процесів, які їх використовують. Крім того, в захищеному режимі реалізоване апаратне переключення між задачами за допомогою спеціальних таблиць.
Особливості виклику функцій API. Найбільш перспективним з точки зору програмування є захищений режим, тому що він використовує всі апаратні можливості комп'ютера. Отже, функції API для Windows відіграють ту ж саму роль, що і переривання INT 21h для DOS в реальному або віртуальному режимі, але, відмінності між ними досить суттєві. Перелічимо їх:
Функції API не відміняють, а заміняють програмні переривання. Механізм обробки апаратних переривань залишається на рівні драйверів пристроїв;
Стандарт виклику функцій API оснований на передачі параметрів через стек (а не через регістри);
Значення кожної функції повертається в регістрі EAX. Якщо функція повертає структуру даних, то регістр EAX містить логічну ознаку виконання, а адресу структури необхідно передати до функції як параметр;
Функції API працюють у захищеному режимі процесора, а переривання DOS - у реальному чи віртуальному режимі.
Функції API зберігаються у різних бібліотеках динамічного компонування, які знаходяться у файлах із розширенням DLL, наприклад, kernel32.dll, user32.dll, gdi32.dll та ін. Ці файли знаходяться у системному каталозі Windows (наприклад, "C:\Windows\System"). У разі необхідності, програміст може створити DLL-файл з набором своїх функцій.
Програми Windows звертаються до функцій API за допомогою команд апаратного виклику CALL, наприклад: call MessageBoxA, де MessageBoxA - 32х-бітна адреса функції. Саме ця назва функції фігурує у файлі user32.dll (подивіться редактором цей файл). Перелік можливих функцій є у файлі /tasm/lib/Import32.lib, який називається бібліотекою імпорту.
Параметри для виконання будь-якої функції API перед її викликом повинні засилатися в стек, починаючи з останнього параметра (див. текст програми). Тому кожний параметр є 32х-бітним числом (в якому можуть використовуватись не всі біти). Параметрами досить часто бувають спеціальні дескриптори - хендли (HANDLE) та атоми.
Дескриптори (хендли та атоми) - це унікальні цілі числа, які Windows використовує для ідентифікації об'єктів, які створюються або використовуються в системі. Хендли займають по 4 байти, а атоми - по 2 байти. Хендли ідентифікують вікна, меню, блоки пам'яті, екземпляри програми, пристрої виводу, файли, аудіо та відео потоки, та інші об'єкти. Атоми ідентифікують стандартні іконки, курсори та об'єкти, які не змінюються при наступному завантаженні системи.
Більшість дескрипторів є значеннями індексів внутрішніх таблиць, які Windows використовує для доступу та керування своїми об'єктами. Звичайно, програми користувача (ужитки) в захищеному режимі не мають прав доступу до цих таблиць. Тому, коли необхідно отримати чи змінити дані, що пов'язані з певним об'єктом Windows, ужиток використовує відповідну функцію API з параметром хендла цього об'єкту. Таким чином Windows забезпечує захист своїх даних при роботі у багатозадачному режимі.
КОНТРОЛЬНІ ПИТАННЯ
1. Який формат виконавчих файлів у програм написаних під Windows?
2. Що таке Win32 API?
3. Особливості виклику функцій АРІ?
4. Які функції АРІ ви знаєте?
5. Що таке дескриптор, хендл, атом?
ЛІТЕРАТУРА
1. Эпплман Д. Win32 API и Visual Basic. Для профессионалов (+CD). - СПб.: Питер, 2001. - 1120 с.: ил.
2. Юров В. Assembler: учебник. - СПб.: Питер, 2001. - 624 с.: ил.
ПОРЯДОК ВИКОНАННЯ
Набрати подану нижче програму для визначення імені комп'ютера (яке задається системним адміністратором при установці операційної системи), зберегти її у файлі з розширенням ".ASM ".
Відкомпілювати за допомогою MASM32 набрану програму та запустити одержаний exe-файл на виконання. Записати ім'я комп'ютера, яке отримала програма.
Розглянути текст програми, вивчити загальну структуру програми із застосуванням функцій Win32 API.
Замінити виклик функції API GetComputerNameA на виклик однієї з функцій (згідно варіанту), змінивши відповідним чином параметри.
Створити ехе-файл модифікованої програми та продемонструвати його роботу.
Підготувати та захистити звіт. В звіті обов’язково мають бути описані параметри виклику функції.
Лістинг програми
.586 ; Для процесора не нижче INTEL-586
.model flat, STDCALL ; компілювати як програму для WIN32;
option casemap :none ; case sensitive
; Визначення зовнішніх процедур:
include \masm32\include\windows.inc ; always first
include \masm32\macros\macros.asm ; MASM support macros
; -----------------------------------------------------------------
; include files that have MASM format prototypes for function calls
; -----------------------------------------------------------------
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
; ------------------------------------------------
; Library files that have definitions for function
; exports and tested reliable prebuilt code.
; ------------------------------------------------
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data ; Вміст сегменту даних:
buflen dd 256 ; Визначення комірки пам'яті
hello_title db ' Лабораторна робота № 5 ', 0
hello_message db 'ComputerName: ' ; Рядок байтів
user_name db 256 dup (0) ; Буфер заповнений нулями
.code ; Вміст сегменту коду:
Start:
push offset buflen ; 2-й параметр: адреса buflen
push offset user_name ; 1-й параметр: адреса user_name
call GetComputerNameA ; виклик функції API
push 40h ; стиль вікна - одна кнопка "OK" з піктограмою "і"
push offset hello_title ; адреса рядка із заголовком
push offset hello_message ; адреса рядка з повідомленням
push 0 ; хендл програми-власника вікна
call MessageBoxA ; виклик функції API
push 0 ; код виходу з програми
call ExitProcess ; завершення програми
end Start ; закінчення сегменту кода
Про параметри функцій можна дізнатися з довідкового файлу GUIDE, який є додатком до Лабораторної роботи. Для отримання довідки необхідно запустити файл GUIDE, вибрати розділ "index (указатель)", набрати назву функції без останньої букви "A". Буква "A" вказує лише, що дана функція працює з символами, які представляються в пам’яті комп’ютера одним байтом. Всі параметри, які будуть вказані в довіднику, необхідно засилати в стек, починаючи з останнього. Якщо назва параметру починається з наступних букв, то його довжина вказана у таблиці:
Перші символи
Довжина параметра
Зміст параметра
H
4
Хендл об'єкту
Lp
4
Адреса об'єкту (offset)
N
4
Змінна або адреса змінної (4 байти), що містить кількість
U або B
4
Ідентифікатори типу BOOL або прапорці
W
2
Ціле 16-ти бітне число
D
4
Ціле 32х бітне число
Short
2
Ціле 16ти бітне число
Long
4
Ціле 32х бітне число
ЗАВДАННЯ
№
варіанту
Функція АРІ
1
GetUserNameA
2
GetWindowsDirectoryA
3
GetSystemDirectoryA
4
GetTempPathA
5
GetCurrentDirectoryA
6
GetDriveTypeA
7
GetVersionEx
8
GetOEMCP
9
GetOACP
10
DeleteFileА
11
GetDiskFreeSpaceА
12
GetFileAttributesA
13
GetFileSize
14
GetFullPathNameA
15
GetShortPathNameA
16
MoveFileA
17
RemoveDirectoryA
18
GetDoubleClickTime
19
CharLowerA
20
CharUpperA
21
IsCharLowerA
22
IsCharUpperA
23
GetSystemDirectoryA
24
GetTempPathA
25
GetCurrentDirectoryA
26
GetUserNameA
27
GetSystemTime
28
GetLocalTime
29
GetSysColor
30
GetComputerNameA
НАВЧАЛЬНЕ ВИДАННЯ
ОСОБЛИВОСТІ ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ ФУНКЦІЙ АРІ
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи № 5 з дисципліни “ Системне програмування ”
для студентів базового напряму 6.050102 - “Комп’ютерна інженерія”
Укладачі Мархивка В.С., ст. викл.
Олексів М. В., асистент
Акимишин О.І., к.т.н., доцент
Мороз І.В., ст. викл.
Редактор
Комп’ютерне верстання
Здано у видавництво . Підписано до друку
Формат 70х100/16. Папір офсетний. Друк на різографі
Умовн. друк. арк. Обл..-вид. арк..
Тираж прим. Зам..
Видавництво Національного університету “Львівська політехніка”
Реєстраційне свідоцтво ДК №751 від 27.12.2001 р.
Поліграфічний центр Видавництва
Національного університету “Львівська політехніка”
Вул.. Ф. Колесси, 2. Львів, 79000