- •Дәрістік сабақ конспектілері Дәріс №1. Деректердің берілуі
- •1 Сурет. Адрестік кеңістікті тарату кестесі
- •3 Сурет. .Com программаларының жадыда орналасуы
- •Дәріс №3. Микропроцессордың пайдаланушы регистрлері
- •Жалпы міндетті регистрлер
- •Сегменттік регистрлер
- •Басқару және күйлер регистрлері
- •Күйлер белгісі
- •Жүйелік белгілер
- •Дәріс №4. Микропроцессордың жүйелік регистрлері
- •Жүйелік адрес регистрлері
- •Жөндеу регистрлері
- •Дәріс №5. Операндтарды адресациялау әдістері
- •Дәріс №7. І80х86 микропроцессор командалар жүйесіне шолу. Арифметикалық командалар Екілік сандарды қосу
- •Екілік сандарды азайту
- •Сандарды көбейту
- •Imul операнд
- •Екілік –ондық сандармен орындалатын арифметикалық операциялар
- •Жинақталған bcd-сандармен орындалатын арифметикалық операциялар Жинақталған bcd-сандарды қосу
- •Жинақталған bcd-сандарды азайту
- •Бүтінсан операцияларын орындау үшін қосымшы командалар
- •Типті ауыстыру командалары
- •Дәріс №8. Екілік разрядтармен жұмыс командалары
- •Көпмодулдік программаларды ұйымдастыру
- •Макродирективалар
- •While және rept директивалары
- •Irp директивасы
- •Irpc директивасы
- •Шартқа байланысты компиляция директивалары
- •Шартқа байланысты компиляция директиваларының жалпы синтаксисі келесі құрамдағы синтаксистік конструкцияда берілген:
- •Дәріс № 14. Wіndows операциялық жүйесінде программалау негіздері
- •Дәріс № 15. Консольды қолданба
Дәріс № 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.Қандай параметрлер стек арқылы негізгі терезе процедурасына беріледі?
