Компилятор 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, тем самым установили чувствительность к регистру символов. Это надо, для того чтобы избежать конфликтов включаемых файлов от разных авторов.