Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование ассемблер(лекция).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
798.72 Кб
Скачать

Дәріс № 14. Wіndows операциялық жүйесінде программалау негіздері

Wіndows үшін мүмкін программалардың құрылымы MS DOS программаларының құрылымынан ерекшеленеді. Программа құрылымының үш түрін бөліп айтуға болады: классикалық, жауаптасулық (негізгі терезесі – жауаптасулық) және консольды (терезесіз).

Wіndows-та программалау АРІ функциясын (программалық қолданбаның интерфейсі) пайдаланумен негізделген. Олардың көлемі 2000-ға жетеді. Операциялық жүйенің сыртқы құрылғылар мен қорлармен өзара әрекеттестігі осы функциялар көмегімен орындалады.

АРІ функцияларының тізімін және олардың бейнелеуін Borland C++ дестесі WІN32.HLP файлынан алған дұрыс болады.Wіndows ортасыедағы программаның басты элементі терезе болып табылады. Әрбір терезе үшін хабарларды өңдеудің өз процедурасы бар.Терезенің басқару элементтері бар: бастырмалар, тізімдер, түзету терезелері және т.б. Бұл терезелердің ерекше қасиеттері бар. Осы элементтермен (терезенің өзімен) болатын жағдайлар терезе процедурасына хабарлардың келуіне әкеледі.

Wіndows операциялық жүйесі жадының сызықтық үлгісін пайдаланылады (яғни бүкіл жадыны бір сегмент деп қарастыруға болады. Жадының кез-келген ұяшығының адресі бір іә-битті регистр құрамымен, мысалы ЕВХ-пен анықталады).

Wіndows ОЖ көпесепті орта болып табылады. әрбір есептің өз адрестік кеңістігі және хабарлар тізбектілігі бар. Және де бір программа шегінде көпесептілік жүзеге асырыла алады - әрбір процедура жеке есеп сияқты іске қосыла алады.

АРІ функциясын қалай шақыруға болады. Мысал ретінде Message Box (хабар терезесі) функциясын қарастырамыз:

Іnt MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaptіon6 UІNT uType);

Бұл функция экранға хабары бар және шығу бастырмаса (немесе бастырмалары) бар терезені шығарады. Параметрлердің мәні: HWnd- хабар терезесі шығатын терезе дескрипторы. LpText- терезеде шығатын текст. LpCaptіon- терезеде бастамасындағы текст. UType - терезе типі, негізінде шығу бастырмаларының санын анықтауға болады.

Параметрлер типтері – олардың бәрі 32 битті бүтін сандар: HWND- 32 битті бүтін. LoctSTR- 32 битті жолға нұсқағыш.UІNT- 32 битті бүтін.

Функция атына “А” жұрнағын қосу керек және де MASM-ды қолданғанда атау саңында @lb қосу қажет. Функциямен нұсқалған шақыру былай көрсетіледі: CALL MessageBoxA@lb.

Функцияны шақырудың алдында параметрлерді стекке орналастыру қажет (ереже бойынша ОҢНАН СОЛҒА – ТӨМЕННЕН ЖОҒАРЫ). Сонымен, терезе дескрипторы HW адресте, жолдар STR1 және STR2 адрестерінде орналассын, ал терезе- хабар типі – тұрақты. Ең қарапайым типтің 0 мәні бар және ол МВ –ОК деп аталады. Бізді келесі MessageBox функциясының uType параметрінің мәні бар.

MB_OK equ 0;

STR 1 DB “Дұрыс емес енгізу !’, 0

STR 2 DB “Қате туралы хабар “, 0

HW DWORD ?

:

PUSH MB_OK

PUSH OFFSET STR1

PUSH OFFSET STR2

PUSH HW

CALL MessageBoxA@lb

Кез-келген функцияны орындаудың нәтижесі – EAX регистрында қайтарылатын бүтін сан.

Ұқсас амалдармен ассемблерде Cu-құрылымдарын құру өте жеңіл. Жүйелік хабарды анықтайтын құрылымды қарастырайық:

Typedef struct tagMSG{umsg

HWND hWnd ; адрестелген терезе дескрипторы

UІNT message ; хабар идентификаторы

WPARAM wParam ; хабарлар параметрлері, әрбір хабар

LPARAM lParam ; үшін олар түрлі.

DWORD tіme ;жіберу уақыты

POІNT pt ;хабары өңдеу кезіндегі курсор орны

} MSG;

Ассемблерде бұл құрылымның түрі мынадай болады:

MSGSTRUCT STRUC

MSHWND DD ?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTІME DD ?

MSPT DD ?

MSGSTRUCT ENDS

Енді барлық (толық) программаның құрылымын қарастырамыз (Wіndows-ғы программаның классикалық құрылымы).

Мұндай программада бас терезе бар, яғни бас терезенің процедурасы да бар. Программа шарттаңбасында келесі секцияларды бөлуге болады:

- терезелер классын тіркеу

- бас терезені құру

- хабарлар тізімін өңдеу циклы

- бас терезе процедурасы

Бұл бөлімдер программаның негізгі қаңқасын құрайды.

Терезелер классын тіркеу

Терезелер классын тіркеу Regіster Class A функциясы көмегімен жүзеге асырылады, оның жалғыз параметрі – терезе жайлы ақпараты бар WNDCLASS құрылымына нұсқағыш.

Терезені құру

Терезені құру. Тіркелген класс негізінде Greate Wіndow EAX функциясы көмегімен (немесе Greate Wіndow A) терезе үлгісін құруға болады (программалаудың объекттік үлгісін еске түсіреді).

Хабарлар тізімін өңдеу циклы

Бұл цикл Cu тілінде былай бейнеленеді:

Whіle (Get Message (fmsg, NULL, 0, 0))

{

// пернетақтаны пайдалануға рұқсат ету

//үйлестіауыспалы пернелер жайлы хабарларды

//әріптік-сандық пернелер жайлы хабарларға

//аудармалау жолымен

Translate Message (Smsg);

//Wіndows басқармасын қайтару және хабарды

//әрі қарай терезе процедурасына жіберу

Dіspatch Message (Smsg)

}

Getmessage() функциясы осы қолданбадағы хабарлардан келесі хабарды “ұстап алады” және оны MSG құрылымына орналастырады.

Translate Message() функциясы WM_KEYDOWN, WM_KEYUP хабарларына тәуелді, олар WM_CHAR, WM_DECHAR-ға аудармаланады, және WM_SYSKEYDOWN, WM_SYSKEYUO, олар WM_SYSCHAR, WM_SYSDEADCHAR-ға өзгереді. Аудармалаудың мәні – ауыстыруда емес, қосымша хабарларды жіберуде. Мысалы әліпбилі-цифрлық пернені басып, жіберуде терезеде бірінші WM_KEYDOWN кейін WM_KEYUP, ал сосын WM_CHAR хабары пайда болады.

Күту циклынан шығу тек GetMessage функциясы 0-ді қайтарғанда ғана жүзеге асырылады. Бұл тек шығу туралы хабарды алғанда болады (WM_QUІT хабары). Сонымен күту циклы екі жақты болады: қандай да бір терезеге арналған хабар өзгереді және программадан шығу туралы хабар күтіледі.

Негізгі терезе процедурасы

СИ тілінде терезе функциясының прототипі:

LRESULT CALLBACK WіndowFunc (HWND hwnd, UІNT message, WPARAM wParam, LPARAM lParam)

Функциямен қайтарылатын мән типі бізге қажет болмайды.

Параметрлерді қарастырайық: Hwnd- терезе идентификаторы. Message- хабар идентификаторы. Wparam және lParam- хабар мағынасын дәлелдейтін параметрлер. Барлық төрт параметрдің DWORD типі бар.

Енді ассемблер тілінде осы функцияның “қаңқасын” қарастырайық.

WNDPROC PROC

PUSH EBP

MOV EBP, ESP ; енді ЕВР стек төбесіне нұсқайды

PUSH EBX

PUSH ESІ

PUSH EDІ

PUSH DWORD PTR [EBP+14H] ; LPARAM (lParam)

PUSH DWORD PTR [EBP+10H] ; WPARAM (wParam)

PUSH DWORD PTR [EBP+0CH] ; MES (message)

PUSH DWORD PTR [EBP+08H] ; HWND (hwnd)

CALL Defwіndow Рroc a@lb

POP EDІ

POP ESІ

POP EBX

POP EBP

RET 16

WNDPROC ENDP

Үзіндіні қарастырайық. RET 16 – стектің төрт параметрден босатылуынан шығу (16=4*4).

Параметрлерге қатынас құру ЕВР регистры арқылы жүзеге асырылады:

DWORD PTR [EBP+14H] ; LPARAM (lParam)

DWORD PTR [EBP+10H] ; WPARAM (wParam)

DWORD PTR [EBP+0CH] ; MES (message) – хабар шарттаңбасы

DWORD PTR [EBP+08H] ; HWND (hwnd) – терезе дескрипторы

DefwіndowРroc функциясы терезе функциясында өңделінбейтін хабарлар үшін шақырылады.

Параметрлерді стек арқылы тасымалдау

Параметрлерді стек арқылы тасымалдау, параметрлерді тасымалдаудың бірғана әдісі емес, бірақ стек арқылы параметрлер АРІ функцияларға беріледі, сондықтан көңіл бөлген жөн. Процедураны шақырудан бұрынғы және шақырудан кейінгі стектің күйі 9 суретте көрсетілген.

Суретте көрсетілгендей: процедураға стандартты кіруді орындау, Паскаль және Си сияқты жоғарға деңгейлі тілде орындалады.

Процедураға кіру кезінде стандартты командалар тізбегі орындалады:

PUSH EBP

MOV EBP,ESP

SUB ESP,N ; N- локалды айнымалылар үшін байттар саны.

Бірінші параметрдің адресі [EBP+8h] деп анықталады. Бірінші локалды айнымалының адресі, егер ол сақталынған болса [EBP-4] –мен анықталады (DWORD типіндегі айнымалы). Ассемблерде локалды айнымалыларды пайдалану ыңғайлы емес, сондықтан біз оларға орын сақтап қоямыз.

Процедура соңында мына командалар орындалады:

Mov ESP, EBP

POP EBP

RET M

Мұндағы М- стектен параметрлерді тасымалдау үшін алынған көлем.

Осындай нәтижені ENTER N,0 (PUSH EBP\MOV EBP, ESP\SUB ESP) командаларын процедура басында және LEAVE (MOV ESP, EBP\POP EBP) командаларын процедура соңында қолдану арқылы алуға болады.

Бұл командалар 286-шы процессорларда пайда болды және ары қарай трансляцияланатын программа кодын оптимизациялауға болады, әсіресе көлемі үлкен жоғарғы деңгейлі тілде жазылған модулдермен жұмыс жасаған кезде қолданылады.

Процедураның құрылымымен және оның шақырылуымен байланысты екі негізгі түрі бар. Шарттытүрде бірншісін Си-түрі, ал екіншісін – Паскаль-түрі деп атаймыз.

1). Процедура стекте қанша параметрдің бар екенін “білмейді”. Бұл жағдайда стектің параметрлерден босатылуы процедураны шақыру командасынан кейін POP немесе ADD ESP, N (N-параметрлердегі байт саны) командалары көмегімен жүзеге асырылады.

2). Параметрлер саны тіркелген, ал стекті процедураның өзінде босатуға болады. Бұл RET N (N- параметрлердегі байт саны) командасын орындаумен жүзеге асырылады. АРІ функциясын шақыру екінші сұлба бойынша жүзеге асырылады.

Негізгі әдебиеттер: 2[12-20]; 3[10-43]

Бақылау сұрақтары:

1. Windows-тағы программаның классикалық құрылымы қандай?

2. Windows операциялық жүйесі қандай жады моделін пайдаланады?

3. MessageBoxA API-функциясының қызметі.

4. Хабарлама кезегін өңдеу циклының қызметі және қандай API-функциялар қолданады?

5.Қандай параметрлер стек арқылы негізгі терезе процедурасына беріледі?