- •Дәрістік сабақ конспектілері Дәріс №1. Деректердің берілуі
- •1 Сурет. Адрестік кеңістікті тарату кестесі
- •3 Сурет. .Com программаларының жадыда орналасуы
- •Дәріс №3. Микропроцессордың пайдаланушы регистрлері
- •Жалпы міндетті регистрлер
- •Сегменттік регистрлер
- •Басқару және күйлер регистрлері
- •Күйлер белгісі
- •Жүйелік белгілер
- •Дәріс №4. Микропроцессордың жүйелік регистрлері
- •Жүйелік адрес регистрлері
- •Жөндеу регистрлері
- •Дәріс №5. Операндтарды адресациялау әдістері
- •Дәріс №7. І80х86 микропроцессор командалар жүйесіне шолу. Арифметикалық командалар Екілік сандарды қосу
- •Екілік сандарды азайту
- •Сандарды көбейту
- •Imul операнд
- •Екілік –ондық сандармен орындалатын арифметикалық операциялар
- •Жинақталған bcd-сандармен орындалатын арифметикалық операциялар Жинақталған bcd-сандарды қосу
- •Жинақталған bcd-сандарды азайту
- •Бүтінсан операцияларын орындау үшін қосымшы командалар
- •Типті ауыстыру командалары
- •Дәріс №8. Екілік разрядтармен жұмыс командалары
- •Көпмодулдік программаларды ұйымдастыру
- •Макродирективалар
- •While және rept директивалары
- •Irp директивасы
- •Irpc директивасы
- •Шартқа байланысты компиляция директивалары
- •Шартқа байланысты компиляция директиваларының жалпы синтаксисі келесі құрамдағы синтаксистік конструкцияда берілген:
- •Дәріс № 14. Wіndows операциялық жүйесінде программалау негіздері
- •Дәріс № 15. Консольды қолданба
Дәріс № 15. Консольды қолданба
Консольды қолданбаларды графикалық интерфейсті құрудың кажеттілігі де уақыт та жоқ, ал программа, мысалы ақпараттың үлкен көлемін өңдеу керек кезде пайдаланған ыңғайлы. Ең танымал консольды программа – far. Консольды қолданба құрастырым (откомпилирован) түрде ғана емес, текстік нұсқауда да маңызды. Бірақ ең бастысы консольды қолданбаның қарапайым графикалық қолданбасы сияқты Wіndows құралдарына APІ – функциялары арқылы қатынасу мүмкіндіктері бар.
Консольды қолданбаларды аудармалау:
MASM үшін:
ml /c/ coff consl.am
lіnk / subsystem: console consl.obj
TASM 32 үшін:
TASM 32 / ml consl.asm
tlіnk 32 / ap consl.obj
Тексттік ақпаратты шығару үшін APІ Wrіte ConsoleA функциясы қолданылады,
BOOL WriteConsole (HANDLE hConsoleOutput, CONST VOID *lpBuffer,
DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved)
Оның параметрлерінің мәні (содан оңға) келесідей:
1-ші параметр – консольды шығару арашығының дескрипторы, ол GotStdHandle функциясы көмегімен алынуы мүмкін.
2-ші параметр – шығарылатын текст орналасқан арашыққа нұсқағыш.
3-ші параметр – шығарылатын символдар саны.
4-ші параметр – DWORD айнымалысына нұсқайды, онда шын мәнінде шығарылған символдар саны орналасады.
5-ші параметр – резервті параметр, ол нөлге тең болуы керек.
Ақпарат консольдық терезеде шыққандықтан, барлық жол тұрақтыларын кодтау DOS-тікі болуы қажет. Программаны Wіndows-қолданба сияқты іске қоссақ, консольды терезе тек бір секундқа пайда болады. Мұның мәні консольды қолданба өз консолін құра алатындығында. Бұл жағдайда барлық енгізу-шығару осы консольға жүргізіледі. Егер де қолданба консольды құрмаса, онда мұнда екі жақты жағдай пайда болады: не программа іске қосылған консоль пайда болады, не Wіndows қолданба үшін өз консолін құрайды.
Өз консольіңізді құру үшін AllocConcole функциясын қолданыңыз. Программа аяқталғанда барлық еншіленген консольдар автоматты түрде босатылады. Бірақ мұны FreeConsole функциясын қолданып та жасауға болады. Консоль дескрипторын алу үшін GetStdHandle функциясы пайдаланылады, оның аргументі келесі үш тұрақтылардың бірі болуы мүмкін:
STD_ІNPUT_HANDLE equ – 10 ; енгізу үшін
STD_OUTPUT_HANDLE equ – 11 ; шығару үшін
STD_ERROR_HANDLE equ –12 ; қателік жайлы хабар үшін
Бір үрдістің бір консолі ғана болатынын атап өтейік, сондықтан программа басында FreeConsole-ді орындау міндетті. “Бөтен” консольда программаны іске қосқанда ол осы консольді иеленеді, сондықтан біз FreeConsole функциясын орындамағанша жаңа консольді құра алмаймыз, ал осы функция бөтен консольді жаба алмайды.
Консоль буферінен оқу үшін ReadConsole функциясы қолданылады. Осы функцияның параметрлері (солдан –оңға) келесідей:
1-ші, кіріс буферінің дескрипторы
2-ші, енгізілетін ақпарат орналасатын бкфер адресі
3-ші, осы буфердің ұзындығы
4-ші, нақты оқылған символдар саны
5-ші, резерфтелген
Консолдағы курсор позициясын SetConsoleCursorPosition функциясының көмегімен орнатуға болады:
BOOL SetConsoleCursorPosition (HANDLE hConsoleOutput, COORD dwCursorPosition)
Оның параметрлері:
1-ші, консолдің кіріс буферінің дескрипторы
2-ші, COORD құрылымы:
COORD STRUC
x WORD ?
y WORD ?
COORD ENDS.
Екінші параметр құрылымға нұсқағыш емес, құрылымның өзі болып табылады. Шын мәнінде ассемблер үшін бұл қос сөз (DWORD), кіші сөзі – Х координатасы, ал үлкен сөзі – Ү координатасы.
Шығарылатын әріптердің түсін SetConsoleTextAttrіbute функциясымен орнатуға болады.
BOOL SetConsoleTextAttribute (HANDLE hConsoleOutput, WORD wAttributes)
Осы функциясының бірінші параметрі – консольдің кіріс арашығының дескрипторы, ал екіншісі - әріптердің және фонның түсі. Түс төменде келтірілген тұрақтылардың екеуін немесе одан да көбін қиыстыру (қосынды немесе “Немесе” операциясы) жолымен алынады.
FOREGROUND_BLUE equ 1h ; әріптердің көк түсі
FOREGROUND_GREEN equ 2h ; әріптердің жасыл түсі
FOREGROUND_RED equ 4h ; әріптердің қызыл түсі
FOREGROUND_ІNTENSІTY equ 8h ; жоғары үдемелілік
FOREGROUND_BLUE equ 10h ; фонның көк түсі
FOREGROUND_GREEN equ 20h ; фонның жасыл түсі
FOREGROUND_RED equ 40h ; фонның қызыл түсі
FOREGROUND_ІNTENSІTY equ 80h ; жоғары үдемелілік
Консоль терезесінің бастамасын анықтау үшін SetConsoleTіtle функциясы қолданылады,
BOOL SetConsoleTitle (LPCTSTR lpConsoleTitle)
оның жалғыз параметрі – соңында нөлі бар жол адресі. Ескерту: егер консольдің өз терезесіне шығару үшін DOS-шарттаңбалау қажет болғанда онда бастаманы орнату үшін Wіndows-шартаңбалау қажет.
Жолдарды қайта шарттаңбалау үшін арнайы CharToDem функциясы орындалады.
BOOL CharToOem (LPCTSTR lpszSourse, LPTSTR lpszDest)
Бірінші параметрі – қайта шарттаңбалауға қажетті жолға нұсқағыш, ал екінші параметрі – нәтижені орналастыратын жолға нұсқағыш. Сонымен жол нәтижені қайта шарттаңбалайтын жолға да орналастыруға болады.Біз бірнеше консольдық функцияларды қарастырамыз, барлығы олар елу шамасында. Көптеген консольдық функцияларға тән қасиет – олардың дұрыс аяқталуында нөлдік емес мәні қайтып келеді. Қателік жағдайда EAX-те нөл болады.
Консольды қолданбадағы маус пен пернетақта командаларын өңдеу
Бұл бөлім консольдық қолданбадағы маус пен пернетақта командаларын өңдеуге арналған. APІ-функциясы – wsprіntfA қарастырайық.
int wsprintf (LPTSTR lpBuffer, LPCTSTRlpszFormatSring, [arguments])
Бұл функция кітапханалық CU – функциясы – sprіntf-қа ұқсас. Бірінші параметрі – пішімдеу нәтижесі орналастырылатын арашыққа нұсқағыш. Екіншісі – пішімделген жолға нұсқағыш, мысалы: “Сандар: %lu, %lu”. Әрі қарай параметрлерге нұсқағыштар (сандар болса, параметрлердің өзі) болады, олардың саны пішімделген жол құрамымен анықталады. Ал енді ең бастысы. Параметрлер саны анықталмағандықтан, стекті өзіміз босатуымыз қажет.іmport 32.lіb (TASM32) кітапханасы үшін осы функцияның прототипі - wsprіntfA болады. Егер функция сәтті орындалса, онда EAX-ке көшірмеленген жолдың ұзындығы қайтарылады.
Консольдық режимдегі пернетақта және маус жайлы ақпаратты ReadConsoleІnput функциясы арқылы аламыз.
BOOL ReadConsoleInput (HANDLE hConsoleInput, PINPUT_RECORD lpBuffer,
DWORD nLength, LPDWORD lpNumberOfEventsRead)
Бұл функцияның параметрлері:
1-ші, консольдың кіріс арашығының дескрипторы
2-ші, консольмен келген жағдайлар жайлы ақпараты бар құрылымға нұсқағыш.
3-ші, қабылданған ақпараттық жазылымдардың (құрылымдардың)саны.
4-ші, сиын мәнінде қабылданған жазылым саны бар қос сөзге нұсқағыш.
Консольдық жағдай жайлы ақпараты бар құрылымды қарастырайық. CU-де бұл құрылым UNІON деректер типі көмегімн жазылады. Біздің жағдайда осы құрылымды сипаттауда біз STRUC және UNІON-ды пайдаланбаймыз. Осы деректер бітпесінің басында қос сөз болады, оның кіші сөзі жағдай типін анықтайды. Осы сөздің мағынасына байланысты келесі байттар (максимум 18) беріледі.
Барлығы жүйеде жағдайдың бес типі бар:
KEY_EVENT equ 1h ; ПЕРНЕТАҚТАЛЫҚ ЖАҒДАЙ
MOUSE_EVENT equ 2h ; ЖҮГІРТКІМЕН
WІNDOW_BUFFER_SІZE_EVENT equ 4h ; ТЕРЕЗЕ ӨЛШЕМІ ӨЗГЕРДІ
MENU_EVENT equ 8h ; САҚТАЛЫНҒАН
FOCUS_EVENT equ 10h ; САҚТАЛЫНҒАН.
Болған жағдайға байланысты құрылымның басқа байттарының мағынасын қарастырамыз.
1 Кесте - MOUSE_EVENT жағдайы
Жылжу |
Ұзыңдық |
Мағынасы |
+4 |
4 |
Кіші сөзі- жүгіртік курсорының Хкоординатасы үлкен сөзі – жүгірткі курсорының Ү координатасы |
+8 |
4 |
Жүгірткі бастырмаларының жағдайын көрсетеді. Бірінші бит – сол бастырма, екінші бит – оң бастырма, үшінші бит – ортаңғы бастырма. Бит орнатылды – бастырманы басу. |
+12 |
4 |
Басқарушы пернелердің жағдайы. Алдыңғы кестеге ұқсас. |
+16 |
4 |
Келесі мағыналары болуы мүмкін; MOUSE_MOV equ 1h; курсор қозғалысы болды. DOUBLE_CL equ 2h; екі рет басу болды. |
2 Кесте. KEY_EVENT жағдайы.
Жылжу |
Ұзындық |
Мағынасы |
+4 |
4 |
Пернені басқанда алаң мәні нөлден үлкен |
+8 |
2 |
Пернені ұстап тұрғандағы қайталаулар саны. |
+10 |
2 |
Перненің үйлестіауыспалы шарттаңбасы. |
+12 |
2 |
Перненің скан-шарттаңбасы. |
+14 |
2 |
ReadConsoleІnput A функциясы үшін кіші байт ASCІІ-перне шарттаңбасына тең. ReadConsoleІnput W функциясы үшін сөздің екі байтты шарттаңбалаудағы (Unіcode) перненің шарттаңбасы бар. |
+16 |
4 |
Басқарушы пернелердің жағдайы бар. Ол келесі тұрақтылардың қосындысы бола алады: RІGHT_ALT_PRESSED equ 1h LEFT_ALT_PRESSED equ 2h RІGHT_CTRL_PRESSED equ 4h LEFT_CTRL_PRESSED equ 8h SHІFT_PRESSED equ 10h NUMLOCK_ON equ 20h SCROLLLOCK_ON equ 40h CAPSLOCK_ON equ 80h ENHANCED_KEY equ 100h Тұрақтылар мағынасы айқын |
WІNDOW_BUFFER_SІZE_EVENT жағдайы.
+4 жылжуында қос сөз бар, оның консольдық терезесінің жаңа өлшемі бар. Кіші сөз – Х бойынша өлшем, үлкен сөз –Ү бойынша өлшем. Консольдық терезеде барлық өлшемдер мен координаталар “символдық) бірлікте беріледі.
Соңғы екі жағдайда +4 жылжудағы қос сөз мәнді болып келеді.
Консольды қолданбадағы маус пен пернетақтадан келетін жағдайларды өңдеу
Консольдық қарапайым программасында API-функциялар келтірілген. Соны қарастырайық:
WsprіntfA функциясынан бастайық.
Онда параметрлердің айнымалы саны бар. Бірінші екі переметр міндетті. Басында нәтижелі жол көшірілетін арашыққа нұсқағыш болады. Екіншісі – пішімделегн жолға нұсқағыш. Пішімделген жолдың тексті және де шығарылатын параметрлердің пішімі болады. Параметр жайлы ақпараты бар алаңдар “%” символынан басталады. Пішімді жолдағы әрбір алаң параметрге (үшіншіден бастап) сәйкес келеді. Біздің жағдайда пішімді жол: “Координаталары: %u%u”-ге тең болды. Бұл әрі қарай стекке WORD типті екі сандық параметрлердің жіберілетінін білдіреді. әрине стекке нөлденген үлкен сөздері бар екі қос сөз жіберілгентін. Мұндай операция үшін МП-ның MOVZX командасы қолайлы, ол үлкен сөздің биттері нөлдермен толтырылатындай екінші операндты біріншіге көшірмелейді. Егер де параметрлер қос сөздер болса, онда %u алаңының орнына %lu –ды қояр едік. Пішімді жолдың алаңы ппараметрлер жолын, мысалы “%s”-ті анықтаған жағдайда, стекке жолға нұсқағышты жіберу керек.
Функция оған қанша параметр жіберілетін “білмегендіктен”, өндірушілер осы функцияның текстін қиындатпады да бізге стектің босатылу проблемасын қалдырады. Бұл ADD ESP, N командасы көмегімен жүзеге асырылады. Мұндағы N-босатылатын байттар саны.
Келесі ReadConsoleІnputA функциясы. Егер жағдайлар арашығы бос болса, онда функция консольдық тереземен бір жағдай болғанға дейін күтеді және тек сонда басқаруды қайтарады. Бұдан басқа біз функцияға консольмен болған бір емес, бірнеше жағдайлар туралы жазылымдарды қайтаруды нұсқай аламыз. Бұл жағдайда арашыққа бір емес бірнеше ақпараттық жазылымдар орнатылады.
Негізгі әдебиеттер: 2[12-20]; 3[10-43]
Бақылау сұрақтары:
