Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11639
Последний выпуск: 19.06.2015

Компилятор MASM

Автор: Руслан Аблязов
6 октября 2006 года

На всех предыдущих уроках я рассказывал о компиляторе TASM, потому что он стандартный и ненавороченный. Но более популярный компилятор это 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
.code
testproc proc param1:DWORD, param2:DWORD, param3:DWORD
	....
ret
testproc endp

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

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

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

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

If - Об этой конструкции я рассказывал на 10 уроке. Она имеет тот же самый синтаксис, что и в TASM.

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.

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

    .486                      
    .model flat, stdcall      
    option casemap :none      

includelib .\masm32\lib\kernel32.lib 
includelib .\masm32\lib\user32.lib
MessageBoxA PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORD
ExitProcess PROTO STDCALL :DWORD
      
.data
	ttl db '11111',0      		
.code
start:
	invoke MessageBoxA,0,offset ttl,offset ttl,0
	invoke ExitProcess,0
end 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, тем самым установили чувствительность к регистру символов. Это надо, для того чтобы избежать конфликтов включаемых файлов от разных авторов.

Компиляция.

Ассемблирование:

	ML [ /опции ] filelist [ /link linkoptions ]
/cассемблирование без линковки

В основном вы будете использовать эту опцию, так как вы будете использовать внешний линкер (например link.exe), для компоновки ваших файлов.

/coffгенерировать объектный файл в COFF формате

Это генерирует формат файла для компоновщика microsoft.

/Fo<file>имя объектного файла

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

/G<c|d|z>Использует вызовы Pascal, C, или Stdcall

выберите тип вызовов для ваших процедур.

/ZiДобавить символьную отладочную информацию

Установите эту опцию, если хотите использовать отладчик.

/I<name>Установить include путь

Определяет ваш include путь

Линковка:

LINK [опции] [файлы] [@commandfile]
/DEBUGОтладка

Это создаст информацию для отладки. Используйте эту опцию, когда вы хотите использовать отладчик.

/DEBUGTYPE:CV|COFFТип отладки: codeview / coff

Выбирает выходной формат отладочной информации. Это зависит от вашего отладчика. Softice и visual c++ отладчики оба могут обрабатывать CV (codeview)

/DEF:имя_файлаDEF файл

Указывает файл определения (.def). Используется с dll, для экспортируемых функций.

/DLLDLL

Выходной файл DLL, а не EXE.

/LIBPATH:pathПуть к библиотекам

Указывает путь к файлам библиотек (*.lib).

/I<имя>Устанавливает путь для inc-файлов

Указывает путь для inc-файлов, по умолчанию.

/OUT:имя_файлаOut:имя_файла

Может изменить имя выходного файла.

/SUBSYSTEM:{...}Подсистема

Выбирает ОС на которой должна выполнятся программа: NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX

Я установил masm в папку d:\masm\masm32, в папке d:\masm находятся все тексты наших программ *.asm. А для компиляции я создал bat файл, который компилирует файл current.asm:

;======[CUT HERE]=====
d:\masm\masm32\bin\ml.exe /c /coff current.asm
d:\masm\masm32\bin\link.exe /subsystem:windows current.obj
pause
;=======[CUT HERE]========

В результате после запуска это файл у нас в папке d:\masm готовая скомпилированная программа current.exe.

Вот и конец этого урока. В этом уроке я рассказал про макрософтский компилятор MASM. На следующем уроке мы напишем первое оконное приложение на ассемблере.


Назад | Оглавление | Далее

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
67K
05 января 2011 года
BOTER
0 / / 05.01.2011
+3 / -3
Мне нравитсяМне не нравится
11 января 2011, 12:20:16
Опечатка, должно быть не:
includelib .\masm32\lib\kernel32.lib
includelib .\masm32\lib\user32.lib
а:
includelib .\lib\kernel32.lib
includelib .\lib\user32.lib
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог