
- •Лабораторна робота №8
- •Хід роботи
- •Завдання
- •Додаток 1
- •Invoke MessageBox, null,addr MsgBoxText, addr MsgCaption, mb_ok
- •Invoke ExitProcess,null
- •Додаток 4
- •Invoke MessageBox, null,addr MsgBoxText, addr MsgCaption, mb_ok
- •Invoke ExitProcess,null
- •Додаток 5
- •Invoke ExitProcess,null
- •Invoke ExitProcess,null
- •Invoke ExitProcess,null
Додаток 4
Текст програми створення потоку
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data?
ThreadID DWORD ?
.data
MsgCaption db "Привiт!",0
MsgBoxText db "В цiй програмi створюється новий потік",0
MsgBoxText2 db "Це повiдомлення нового потоку",0
MsgBoxText3 db "Завершення програми, яка створює новий потік",0
.code
ThreadProc PROC Param:DWORD
invoke MessageBox, NULL,addr MsgBoxText2, addr MsgCaption, MB_OK
ret
ThreadProc ENDP
start:
Invoke MessageBox, null,addr MsgBoxText, addr MsgCaption, mb_ok
mov eax,OFFSET ThreadProc
invoke CreateThread,NULL,NULL,eax, NULL,NORMAL_PRIORITY_CLASS,\
ADDR ThreadID
invoke MessageBox, NULL,addr MsgBoxText3, addr MsgCaption, MB_OK
Invoke ExitProcess,null
end start
Результат виконання програми:
Дана програма виводить повідомлення “Привіт!”, після натиску кнопки “ОК”, створюється новий потік, котрий виводить своє повідомлення “Привіт!”. Одночасно з викликом повідомлення потоку викликається повідомлення батьківської програми (процесу) про завершення програми. Одночасно із завершенням батьківської програми (після натиску “ОК”) завершується повідомлення потоку.
Додаток 5
Детальний опис функції CreateThread.
invoke CreateThread,NULL,NULL,eax, NULL,NORMAL_PRIORITY_CLASS,\
ADDR ThreadID – Створює новий потік.
CreateThread proto lpThreadAttributes:DWORD,\
dwStackSize:DWORD,\
lpStartAddress:DWORD,\
lpParameter:DWORD,\
dwCreationFlags:DWORD,\
lpThreadId:DWORD
lpThreadAttributes – Щоб у потоку параметри безпеки встановлювались по замовчуванню, потрібно використовувати NULL.
DwStackSize – Вказується розмір стеку. Коли цей параметр рівний NULL, то потік буде мати такий самий розмір стеку як і у головного потоку (процесі).
LpStartAddress – Адреса функції потоку. Ця функція виконує произначену для потоку роботу. Ця функція повинна одержувати тільки один 32 – бітний параметр і повертати 32 – бітове значення.
LpParameter – Параметр, котрий передається функції потоку.
DwCreationFlags - 0 – означає, що потік починає виконуватися відразу після його створення. Прапорець CREATE_SUSPEND – загальмує потік поки не буде викликана функція ResumThread.
LpThreadId – В цей параметр запишеться ID створеного потоку.
Відповіді
1. Мови програмування високого рівня можна сказати є зрозумілішими людині, ніж комп'ютеру. Особливості конкретних комп’ютерних архітектур в них не враховуються, тому створені програми легко переносяться з комп’ютера на комп’ютер, де встановлено транслятор цієї мови. Розробляти програми на таких мовах значно простіше і помилок допускається менше.
2. Програмування на асемблері під ОС MS-DOS та під ОС Windows значно відрізняється. Так DOS програма після запуску повинна бути весь час активною. Якщо їй що-небудь потрібно, наприклад, дістати наступну порцію даних із пристрою вводу - виводу, то вона сама має виконувати відповідні запити до операційної системи. Програма DOS працює по визначеному алгоритмі, вона завжди знає, що і коли їй треба зробити.
В Windows-програмі все навпаки. Програма є пасивною. Після завантаження вона чекає коли операційна система виділить їй час. Операційна система робить це посиланням спеціально оформлених груп даних, які називаються повідомленнями. Повідомлення можуть бути різного типу, вони функціонують у системі досить хаотично і прикладна програма не знає якого типу повідомлення прийде наступним. Можна провести аналогію між механізмом повідомлень Windows і механізмом переривань в архітектурі IBM PC.
Слід пам’ятати, що у Windows – програмі перед використанням будь – якого регістру, крім еах, потрібно зберегти його вміст, який потім треба відновити.
3. У процесі розробки своїх програм програміст повинен ефективно використовувати функції інтерфейсу прикладного програмування API (Application Programming Interface) операційної системи Windows.
Windows пропонує велику кількість API функцій які розташовані безпосередньо в операційній системі. Ці функції знаходяться в декількох динамічно завантажуваних бібліотеках (DLL), таких як kernel32.dll, user32.dll і gdi32.dll.
Kernel32.dll містить API функції, які взаємодіють з пам’яттю та керують процесами. User32.dll контролює інтерфейс користувача. Gdi32.dll відповідає за графічні операції. Крім цих основних бібліотек існують також інші dll, які можна використовувати, маючи потрібну інформацію про них. Програма динамічно під’єднується до бібліотеки dll під час виконання, тобто код API функцій не включається у виконуваний файл. Інформація про функції, які описані в dll знаходиться в бібліотеках імпорту (*.lib). Windows.inc - містить важливі структури і константи, які використовуються в програмах.
4. Процес-це програма під час її виконання
5. Наведемо основні кроки створення нового процесу із використанням функціїї CreateProcess().
1.Відкривають виконуваний файл,що його імя задане як параметр.
2.Створюють об’єкт-процес у виконавчій системі Windows XP (створюють структури даних процесу,створюють початковий адресний простір процесу)
3.Створюють початковий потік процесу.
4.Після створення початкового потоку підсистемі Win32 повідомляють про новий процес і його початковий потік.Це повідомлення містить їхні дескриптори-унікальні числові значення,що ідентифікують процес і потік для засобів режиму користувача.
5.Після надсилання повідомлення розпочинають виконання початкового потоку.
6.Завершують ініціалізацію адресного простору процесу (наприклад,завантажують необхідні динамічні бібліотеки),після чого починають виконання завантаженого програмного коду.
6. Потік користувача-це послідовність виконання команд в адресному просторі процесу.Ядро ОС не має інформації про такі потоки,вся робота з ними виконується в режимі користувача.Засоби підтримки потоків користувача надають спеціальні системні бібліотеки,які доступні для прикладних програмістів у вигляді бібліотечних функцій.
Потік ядра-це послідовність виконання команд в адресному просторі ядра.Потоками ядра управляє ОС,перемикання ними можливе тільки у привілейованому режимі.
7. Основним засобом створення потоків у Windows XP є функція CreateThread()
Win32 API.Основні етапи виконання цієї функції:
1.В адресному просторі процесу створюють стек режиму користувача для потоку.
2.Ініціалізують апаратний контекст потоку.
3.Створюють об’єкт-потік виконавчої системи (створюють структури даних потоку,задають стартову адресу потоку,задають інформацію для підсистеми безпеки та ідентифікатор потоку)
4.Підсистемі Win32 повідомляють про створення нового потоку.
5.Дескриптор та ідентифікатор потоку повертають у процес,що ініціював створення потоку.
6.Починають виконання потоку.
Для завершення потоку призначена функція EndThread().Функції стандартної бібліотеки С у Win32 API не пристосовані до використання за умов багатопотоковості і тому потрібно під час створення і завершення потоків виконувати деякі додаткові дії.Ці дії враховані у спеціальних бібліотечних функціях роботи з потоками,описаних у заголовному файлі process.h.Це функція_beginthreadex() для створення потоку й _endthreadex()-для завершення потоку.
Виконання
1.Запускаю MASM32 Editor, на робочому полі вводжу текст програми згідно з додатком але замінюю Заголовок програми на № групи а отже не пишу «Повідомлення» а пишу «25П», те ж саме я роблю з Змістом — замість «Привіт Win32!» пишу П.І.Б.(прізвище,ім’я,по-батькові) і тип ставимо згідно з додатком. Мій варіант 7 а отже замість MB_OK я пишу MB_ICONINFORMATION.
2.Після цього вибираємо File → Save as → Після чого вводимо ім’я файлу і відразу його розширення, наприклад 25P.asm розширення «.asm» вводимо обов’язково, після цього нажимаємо Зберегти .
3.Після
цих дій вибираємо Project→Build
All(компіляція
програми)→Після цього з’явиться вікно
Командного рядка:
Щоб закрити це вікно нажимаємо будь-яку клавішу на клавіатурі, це означає що програма написана правильно.
4.Щоб запустити програму вибираємо Project→Run Program.
Після цього з’явиться вікно програми:
Аналогічно робимо 2 і 3 програму.
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
MsgCaption db "25П",0
MsgBoxText db "Базалівський олег",0
.code
start:
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_YESNOCANCEL