Win32asm обучение

  d8ef8794     

Преимущества MASM


        Win32Asm Tutorial

       



назад 10- Преимущества MASM вперед

10.0 - Преимущества masm

Если вы не используете masm, то можете пропустить этот раздел и попробовать преобразовать все примеры, или прочитать это и пробовать убедить себя, использовать masm. Конечно это ваш собственный выбор. Но masm делает действительно ассемблер намного проще.

10.1 - Конструкции сравнения и повтора

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

.IF, .ELSE, .ELSEIF, .ENDIF

.REPEAT, .UNTIL

.WHILE, .ENDW, .BREAK

.CONTINUE

If

Если у вас есть опыт в языках программирования, возможно вы видели что-то вроде if/else конструкций:

.IF eax==1

;eax равен 1

.ELSEIF eax=3

; eax равен 3

.ELSE

; eax не равен 1 и 3

.ENDIF

Эта конструкция очень полезна. Вам не нужно вставлять сравнения и переходы, а только вставте директиву .IF (не забудьте точку перед .IF и .ELSE и т.д.). Вложенности if позволяются:

.IF eax==1

.IF ecx!=2

; eax= 1 и ecx не равно 2

.ENDIF

.ENDIF

Это может быть сделано проще:

.IF (eax==1 && ecx!=2)

; eax = 1 и ecx не равно 2

.ENDIF

А вот и операторы, которые вы можете использовать:

== равно
!= не равно
> больше
< меньше
>= больше или равно
<= меньше или равно
& проверка бита
! инверсия ( NOT )
&& логическое 'И' ( AND )
|| логическое 'ИЛИ' ( OR )
CARRY? флаг переноса (cf) установлен?
OVERFLOW? флаг переполнения (of) установлен?
PARITY флаг паритета (pf) установлен?
SIGN? флаг знака (sf) установлен?
ZERO? флаг нуля (zf) установлен?

Repeat

Эта конструкция выполняет блок, пока условие не истинно:

.REPEAT

; код здесь

.UNTIL eax==1

Эта конструкция повторяет код между repeat и until, пока eax не станет равным 1.

While

Конструкция while это инверсия конструкции repeat. Она выполняет блок, пока условие истинно:

.WHILE eax==1

; код здесь

.ENDW

Вы можете использовать директиву .BREAK, чтобы прервать цикл и выйти.


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

Содержание раздела