Разное
Последние книги
Самое популярное
Все бесплатно
Все ссылки на файлы, расположенные на страницах сайта, добавлены пользователями и доступны для бесплатного скачивания. За содержание этих файлов администрация сайта ответственности не несет.
Навигация
Вопросы
Тpансляция ошибок в BDE
Категория: Базы данных
Категория: Базы данных
Получить версию программы VersionInfo
Категория: Приложение
Категория: Приложение
Преобразовать Римские символы в Арабские и наоборот
Категория: Текст и строки
Категория: Текст и строки
Показать удаленные записи в DBase
Категория: Базы данных
Категория: Базы данных
Узнать установлена ли BDE
Категория: Базы данных
Категория: Базы данных
Округление целого числа до 5
Категория: Математика
Категория: Математика
Объект экрана — Screen
Категория: Компоненты
Категория: Компоненты
Возвести в степень
Категория: Математика
Категория: Математика
Компоненты ToolBar и PageScroller
Категория: Компоненты
Категория: Компоненты
Компонент MainMenu
Категория: Компоненты
Категория: Компоненты
Assembler and Win32
Assembler&Win32. Курс молодого бойца. Урок 13.
Компилятор MASM
На всех предыдущих уроках
я рассказывал о компиляторе 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 ]
Линковка:
LINK [опции] [файлы] [@commandfile]
Я установил 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. На следующем уроке мы напишем первое оконное приложение на ассемблере.
Функции.
Основное преимущество 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, для экспортируемых функций. |
/DLL | DLL Выходной файл 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. На следующем уроке мы напишем первое оконное приложение на ассемблере.