Win32asm обучение


    d8ef8794     

Директива continue осуществляет переход на


.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. Возможно в более поздних версиях этого туториала, но сейчас они для нас не важны.
[наверх]

Содержание  Назад  Вперед