Win32asm обучение


Урок 10 - Преимущества MASM - часть 2


.WHILE edx==1

inc eax

.IF eax==7

.BREAK

.ENDIF

.ENDW

Если eax=7, цикл while будет прерван.

Директива continue осуществляет переход на код проверяющий условие цикла в конструкциях repeat и while.


10.2 - Invoke

Это самое большое преимущество над tasm и nasm. Invoke упрощает использование процедур и вызовов.

Обычный стиль:

push параметр_3

push параметр_2

push параметр_1

call procedure

Invoke стиль:

invoke procedure, параметр_1, параметр_2, параметр_3

Собранный код будет одинаковым, но invoke стиль проще и более надежнее. Чтобы использовать invoke для вызова процедуры, вы должны определить ее прототип:

PROTO STDCALL testproc:DWORD, :DWORD, :DWORD

Эта директива объявляет процедуру, названную testproc, которая берет 3 параметра размером DWORD.
Теперь, если вы сделаете это...

invoke testproc, 1, 2, 3, 4

...masm выдаст вам ошибку, что процедура testproc берет 3 параметра, а не 4. Masm также имеет контроль соответствия типов, т.е. проверяет, имеют ли параметры правильный тип (размер).

В invoke вы можете использовать ADDR вместо OFFSET. Это сделает адрес в правильной форме, когда код будет собран.

Процедуры определены подобно этому:

testproc PROTO STDCALL :DWORD, :DWORD, :DWORD

.code

testproc proc param1:DWORD, param2:DWORD, param3:DWORD

ret

testproc endp

Это создает процедуру, названную testproc, с тремя параметрами. Прототип используется, invoke.

testproc PROTO STDCALL :DWORD, :DWORD, :DWORD

.code

testproc proc param1:DWORD, param2:DWORD, param3:DWORD

mov ecx, param1

mov edx, param2

mov eax, param3

add edx, eax

mul eax, ecx

ret

testproc endp

Теперь процедура делает следующие вычисления. testproc(param1, param2, param3) = param1 * (param2 + param3). Значение результата возвращается в регистре eax.
Локальные переменные определяются как здесь:

testproc proc param1:DWORD, param2:DWORD, param3:DWORD

LOCAL var1:DWORD

LOCAL var2:BYTE

mov ecx, param1

mov var2, cl

mov edx, param2

mov eax, param3

mov var1, eax

add edx, eax

mul eax, ecx

mov ebx, var1

.IF bl==var2

xor eax, eax

.ENDIF

ret

testproc endp

Вы не можете использовать эти переменные вне процедуры. Они сохранены в стеке и удаляются при возврате из процедуры.

10.3 - Макрокоманды

Я не буду сейчас рассказывать о Macro. Возможно в более поздних версиях этого туториала, но сейчас они для нас не важны.


[наверх]




- Начало -  - Назад -  - Вперед -