Виклик функцій WinAPI в середовищі MASM32

MASM32 використовує набір макросів, що дозволяє наблизити синтаксис асемблера до синтаксису мов високого рівня і зменшити кількість помилок Кожен макрос має імя і формальні параметри, проте, на відміну від класичних макросредств асемблера, імена формальних параметрів можуть бути забезпечені додатковими модифікаторами Наприклад, розглянемо макрос з імям Prim, який має 4 параметри, з них перший обовязковий, другий за

замовчуванням инициализируется заданим значенням, третій описаний стандартним чином, а замість четвертого в тіло макросу може бути підставлено рядок, зазначена в макровизове:

Pr ± m MACRO pl: REQ, р2: = , p3, p4: VARARG

Ключове слово REQ вказує, що параметр є обовязковим Якщо при макровизове другий параметр не буде вказано, то він буде дорівнює значенню за замовчуванням Модифікатор VARARG вказується тільки для останнього параметра і означає, що цей параметр при макропідстановки замінюється на решту рядок фактичних параметрів, включаючи коми між ними Для даного прикладу мож-но вказати більше 4 параметрів, і тоді весь текст починаючи з 4 параметра асоціюється з формальним параметром р4, замість якого підставиться в тіло макросу

Розглянемо приклади макросів Для API-функцій як аргументи часто буває необхідно описати рядок символів, що закінчується нулем Це робить макрос:

szText MACRO Name, Text: VARARG LOCAL хи jmp 1 ±> 1

Name db Text, 0 хи: ENDM

Для повернення з функції результату її роботи через ЕАХ вико-ється макрос:

return MACRO  arg mov eax,   arg ret ENDM

У MASM присутня підтримка високорівневих операторів передачі управління Вони часто використовуються для полегшення сприйняття вихідного коду Макрос IF з директивами ELSE, ELSEIF, ENDIF використовуються для організації розгалужень, директиви WHILE / ENDW і REPEAT / UNTIL [CXZ] дозволяють організувати цикли BREAK виробляє вихід з циклу, a CONTINUE перехід на нову ітерацію

Зручність умовного і циклічного макросів полягає в можливості використання у виразах знаків порівнянь і логічних операцій, що звязують мнемоніки регістрів та імен змінних

Використання макросу IF дозволяє організувати перебір значень у віконній функції, аналогічний оператору switch Він має син-таксис:

. IF условіе1

оператори 1 [ ELSEIF] условіе2

оператори2

[ELSE]

оператори N ENDIF

Цей макрос генерує порівняння і умовні переходи таким чином, щоб при істинності условія1 виконувалися оператори1 до тих пір, поки не зустрінеться наступний ELSEIF, ELSE, або ENDIF Макроси IF можуть бути вкладеними Оператор ELSEIF використовується для виділення блоку операторів, що виконуються, якщо попередні умови в IF і ELSEIF помилкові, а умова в поточному ELSEIF істинно Усередині IF можуть бути декілька блоків ELSEIF ELSE визначає виконуваний блок операторів, якщо всі попередні умови були помилкові ENDIF закриває поточний IF

Макрос REPEAT виконує тіло макросу, поки умова не стане істинним, наприклад, наступний макрос повторює код між repeat і until, поки значення регістра ebx не стане рівним 5:

.REPEAT

; тіло макросу

.UNTIL ebx=5

Макрос WHILE служить для організації виконання тіла макросу доти, поки умова істинно:

. WHILE ebx = 5 тіло макросу ENDW

Щоб перервати цикл і вийти з нього, використовується директива BREAK:

mov eax,2

.WHILE ebx=5

inc eax

.IF eax==4

.BREAK

.ENDIF

.ENDW

Якщо ЕАХ = 4, цикл буде перервано

У макросах REPEAT і WHILE для переходу на перевірку умови циклу використовується директива CONTINUE

Для спрощення виклику API-функцій використовується макрос invoke Нехай необхідно викликати API-функцію з імям FunctionName, що має 4 параметра Четвертий і другий параметри являють собою адреси деяких обєктів Традиційний виклик функції має вигляд:

push offset par4

push рагЗ

push offset par2

push parl

call FunctionName

З використанням invoke виклик має вигляд:

invoke FunctionName,par1,ADDR par2,par3,ADDR par4

Розглянемо програму на MASM32, що виводить вікно повідомлення з кнопкою ОК, текстом і заголовком

.model flat, stdcall

option casemap :none   case sensitive

include \masm32\include\windowsinc

include \masm32\include\user32inc

include \masm32\include\kernel32inc

szText MACRO Name, Text:VARARG

LOCAL 1И

jmp 1И

Name db Text, 0 1И:

ENDM

includelib \masm32\lib\user32lib

includelib \masm32\lib\kernel32lib code start:

szText  szDlgTitie, &quotFirst MASM&quot

szText  szMsg,&quotAssembler   &quot

invoke MessageBox,0,ADDR  szMsg,ADDR  szDlgTitle,

MB_OK invoke ExitProcess,0 end start

Використовуємо плоску модель памяті і стандартний виклик підпрограм, згідно з яким параметри поміщаються в стек в порядку справа наліво, а забираються з стека підпрограмою за рахунок ret N Для роботи програми до неї необхідно включити файл windowsinc, що містить опис всіх констант, макровизначень і структур Windows, що використовуються в системі Наприклад, визначення структури повідомлення на Асемблері має вигляд:

MSG   STRUCT

hwnd

DWORD

message

DWORD

wParam

DWORD

lParam

DWORD

time

DWORD

pt

POINT

&lt&gt&nbsp

MSG  ENDS

Визначення структури для реєстрації класу вікна WNDCLASS:

WNDCLASS STRUCT

style

DWORD

lpfnWndProc

DWORD

cbClsExtra

DWORD

cbWndExtra

DWORD

hlnstance

DWORD

hi con

DWORD

hCursor

DWORD

hbrBackground

DWORD

lpszMenuName

DWORD

lp s z ClassName

DWORD

WNDCLASS ENDS

Якщо програмісту не потрібні всі описи з windowsinc, він повинен явно включити в програму тільки потрібні опису системних констант і структур даних

Включаються в програму kernel32inc і user32inc містять описи прототипів всіх функцій, що містяться відповідно у використовуваних бібліотеках функцій kernel321ib і user321ib Прототипи потрібні для полегшення перевірки при трансляції кількості та розмірів параметрів процедури Описи прототипів мають вигляд:

Імя_процедури PROTO спісок_опісаній_тіпов

Спісок_опісаній_тіпов складається з розділених комами конструкцій, що починаються двокрапкою, за яким слід ключове слово, що характеризує розмір параметра DWORD, WORD, BYTE Наприклад, прототипи розглянутих WinMain і WndProc мають вигляд:

WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

Якщо програмісту потрібні не всі функції з бібліотек, а тільки деякі, він повинен явно описати прототипи використовуваних зовнішніх процедур і підключити тільки бібліотеки без файлів з розширенням inc

З урахуванням вищевикладеного, опис функції WinMain на MASM32 має вигляд:

hWnd    dd    

WinMain proc hlnst:DWORD, hPrevInst :DWORD, CmdLine:DWORD, CmdShow :DWORD

LOCAL wc:WNDCLASSEX

LOCAL msg:MSG

szText szClassName,&quotMy_Class&quot

szText szAppName, Application заповнення полів wc

mov wclpfnWndProc, offset WndProc адресу WndProc

push hlnst

pop wchlnstance

mov wclpszClassName, offset szClassName

invoke LoadIcon,hlnst,500

mov wchlcon, eax

invoke LoadCursor,NULL,IDC_ARROW

mov wchCursor,eax

invoke RegisterClassEx, ADDR wc реєстрація класу вікна

invoke CreateWindowEx, NULL, addr szClassName, addr szAppName,  WS_OVERLAPPEDWINDOW, 100,100, 400, 200, NULL, NULL, hlnst, NULL

mov hWnd, eax

invoke ShowWindow, hWnd, SW_SHOWNORMAL

invoke UpdateWindow, hWnd

.while TRUE

invoke GetMessage, addr msg, NULL, 0, 0

.break if (eax)

invoke    TranslateMessage, addr msg invoke    DispatchMessage, addr msg

.endw

mov eax, msgwParam

ret WinMain endp

Віконна функція на MASM32:

WndProc proc hWin:DWORD, uMsg: DWORD, wParam:DWORD, lParam :DWORD if uMsg == WM_CLOSE

szText TheText,&quotPlease Confirm Exit&quot invoke MessageBox,hWin,ADDR TheText,

ADDR szDisplayName, MB_YESNO if eax == IDNO return 0 endif elseif uMsg = WM_DESTROY

invoke PostQuitMessage,NULL return 0 endif invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp

Процес компіляції програм на MASM32 здійснює Mlexe, a редагуванням звязків займається Linkexe

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*