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

Компилятор MASM

MASM создан специально для написания программ на ассемблере для Win32. В нём есть макросы и специальные директивы для упрощения программирования.

Функции.

Основное преимущество MASM это макрос invoke, он позволяет вызывать API функции по-обычному с проверкой количества и типа параметров. Это почти тот же call, как в TASM, но этот макрос проверяет количество параметров и их типы. Вот так вызывается функция:

Invoke <функция>, <параметр1>, <параметр2>, <\параметр3>

Чтобы использовать 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.codetestproc proc param1:DWORD, param2:DWORD, param3:DWORD ....rettestproc endp

Это создает процедуру, названную testproc, с тремя параметрами. Прототип используется, invoke. Все параметры можно использовать в коде процедуры, они автоматически извлекутся из стека. Также в процедурах можно использовать локальные переменные.

testproc proc param1:DWORD, param2:DWORD, param3:DWORDLOCAL var1:DWORDLOCAL var2:BYTEmov ecx, param1mov var2, clmov edx, param2mov eax, param3mov var1, eaxadd edx, eaxmul eax, ecxmov ebx, var1.IF bl==var2xor eax, eax.ENDIF rettestproc endp

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

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

If - Она имеет тот же самый синтаксис, что и в TASM.

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

.REPEAT; код здесь.UNTIL eax==1

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

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

.WHILE eax==1; код здесь.ENDW

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

.WHILE edx==1inc eax.IF eax==7.BREAK.ENDIF.ENDW

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

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

Теперь наша первая программа видоизменяется следующим образом:

.486 .model flat, stdcall option casemap :none includelib .\masm32\lib\kernel32.lib includelib .\masm32\lib\user32.libMessageBoxA PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORDExitProcess PROTO STDCALL :DWORD .data ttl db '11111',0 .codestart: invoke MessageBoxA,0,offset ttl,offset ttl,0 invoke ExitProcess,0end start

При компиляции в TASM пути к статическим библиотекам указываются при компиляции, в MASM пути к статическим библиотекам мы указываем в тексте программы точно так же как и пути к включаемым файлам с помощью директивы includelib.

Прототипы каждой из библиотек есть в одноимённых включаемых файлах в папке include. Теперь не надо писать прототипы функций самому, они уже есть:

includelib .\masm32\lib\kernel32.lib includelib .\masm32\lib\user32.lib include .\masm32\include\kernel32.inc include .\masm32\include\user32.inc

В этих включаемых файлах определены функции без букв A или W в конце. Теперь не надо указывать эти буквы в конце.

Директива option нужна для задания некоторых настроек компиляции. Опция casemap задаёт чувствительность к регистру символов. Мы указали none, тем самым установили чувствительность к регистру символов. Это надо, для того чтобы избежать конфликтов включаемых файлов от разных авторов.