- •Системне програмування, характерні особливості.
- •Асемблер. Варіанти спільного використання асемблера і мов високого рівня.
- •Інструментальні засоби розробки програм на мові Асемблер.
- •Регістри.
- •Користувацькі регістри.
- •Сегментні регістри.
- •Організація роботи з пам’ятю.
- •Сегментна модель пам’яті.
- •Специфікація типів даних
- •Набір команд мікропроцесора.
- •11. Використання арі-функцій.
- •12. Структура програми, приклад простої програми для Windows.
- •13. Передача параметрів через стек
- •14. Використання ресурсів при роботі з діалоговими вікнами.
- •15.Використання ресурсів при роботі з меню.
- •16. Використання акселераторів у файлах ресурсу.
- •17. Ресурси. Переваги використання ресурсів у програмах.
- •18. Використання ресурсів при роботі з іконками, рядками, курсорами.
- •21. Потоки, взаємодія потоків.
- •22. Семафори блять! Події нахуй!
- •23. Критичні секції.
13. Передача параметрів через стек
При вході в процедуру виконується стандартна послідовність команд:
PUSH EBP
MOV EBP, ESP
SUB ESP, N, N - кількість байт для локальних змінних.
Адреса першого параметра визначається як [EBP +8 Н]. Адреса першої локальної змінної, якщо вона зарезервовано, визначається як [ЕВР-4] (мається на увазі змінна типу DWORD). На Асемблері не дуже зручно використовувати локальні змінні, і ми не будемо резервувати для них місце
В кінці процедури йдуть команди:
MOV ESP, EBP
POP EBP
RET M
Тут M - об'єм, взятий у стека для передачі параметрів.
Хотілося б зупинитися ще на одному питанні, пов'язаних зі структурою процедури та п виклику.
Існують два основні підходи. Умовно перший підхід можна назвати Сі-підходом, а другий - Паскаль-підходом.
Перший підхід передбачає, що процедура "не знає", скільки параметрів знаходиться в стеку. Природно, у цьому випадку звільнення стека від параметрів має відбуватися після команди виклику процедури, наприклад, за допомогою команди POP або команди ADD ESP, N (N - кількість байт в параметрах).
Другий підхід заснований на тому, що кількість параметрів фіксовано, а стек можна звільнити у самій процедурі. Це досягається виконанням команди RET N (N - кількість байт в параметрах). Як Ви вже, мабуть, здогадалися, виклик функцій АРІ здійснюється по другій схемі.
14. Використання ресурсів при роботі з діалоговими вікнами.
Діалогові вікна. Діалогові вікна є найбільш складними елементами ресурсів. На відміну від ресурсів, які ми до сих пір розглядали, для діалогу не задає ідентифікатор. Звернення до діалогу відбувається по його імені (рядку).
#define WS_SYSMENU 0x00080000L
#define WS JvlINIMIZEBOX 0x00020000L
#define WS_MAXIMIZEBOX 0x00010000L
DIAL1 DIALOG 0, 0, 240, 120
STYLE WS SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX Caption "Приклад діалогового вікна"
FONT 8, "Arial”
{
}
Як бачимо, визначення діалогу починається з рядка, що містить ключове слово DIALOG. В цьому ж рядку далі вказується положення і розмір діалогового вікна. Далі йдуть рядки, що містять інші властивості вікна. Нарешті йдуть фігурні дужки. У даному випадку вони порожні. Це означає, що на вікні немає ніяких керуючих елементів. Тип вікна, а також інших елементів визначається константами, які ми помістили на початку файлу.
15.Використання ресурсів при роботі з меню.
Меню. Меню також може бути задано у файлі ресурсів. Як і діалогове вікно, у програмі воно визначається по імені (рядку). Меню можна задати і у звичайному вікні, і в діалоговому вікні. Для звичайного вікна при реєстрації класу слід просто замінити рядок
MOV DWORD PTR [WC.CLMENNAME], 0
на
MOV DWORD PTR [WC.CLMENNAME], OFFSET MENS
Тут Mens - ім'я, під яким меню розташовується в файлі ресурсів. Меню на діалогове вікно встановлюється іншим способом, який, зрозуміло, підходить і для звичайного вікна. На початку меню завантажується за допомогою функції LoadMenu, а потім встановлюється функцією SetMenu.
Розглянемо структуру файл>' ресурсів, що містить визначення меню.
MENUP MENU
{
POPUP "& Перший пункт"
{
MENUITEM "& Перший", І MENUITEM "В & якому", 2 POPUP "Підмен & ю"
{
MENUITEM "Десятий пунк & т", 6
}
}
POPUP "& Другий пункт"
{
MENUITEM "Треті & й", З MENUITEM "Четверт & ий", 4 }
MENUITEM "Ви & хід", 5
}
