Дневники чайника

Подробное описание ml.exe
(до версии 7.10)

Прежде всего, ml.exe - это транслятор языка Макро ассемблера.

Если упростить, главная задача этой программы: из исходника перевести все команды Ассемблера, набранные текстом в байты машинных команд.

Сам ml.exe не создаёт готовую программу под конкретную операционную систему и её формат. Он делает промежуточный, так называемый объектный файл (с расширением obj). Но после этого ml.exe может вызвать линковщик. Так мы получим готовую программу.

Как и большинство трансляторов разных языков программирования, ml.exe - это программа с интерфейсом командной строки.

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

Вид строки:

ml [ключи] список_файлов [/link <ключи_линковщика>]

Где:

ключи_линковщика - параметры командной строки, которые будут переданы линковщику.

/link - параметр, с которым указываются ключи_линковщика (см. таблицы ключей).

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

ключи - параметры компиляции, перечисленные ниже (ключи чувствительны к регистру).

Параметры, которые вы используете постоянно, можно добавить в переменную окружения ML. Транслятор будет учитывать эти опции всегда.

Форматы трансляции

Главная характеристика трансляции - это тип выходного объектного файла.

ML.EXE 7-й версии умеет создавать только два вида obj-файлов.

MS COFF - объектный формат, который по устройству очень близок к PE-формату. MS COFF-формат используется для компиляции программ под Win32.

Intel OMF - объектный формат, который в основном используется для создания exe-модулей под DOS.

Более ранние версии транслятора MASM умеют создавать ещё и

Tiny model, она используется для создания com-программ. Формат подходит только для небольших DOS-программ, умещающихся в 64kb вместе c данными и стеком.
Ключи формата трансляции
Ключ и форматЧто делаетДля чего это нужноПримечание
/coff
Включает MS COFF-формат (MS Common Object File Format) Для создания обычных Win32-программ С 7-й версии ml.exe этот ключ можно не указывать, так как COFF-формат сделали по умолчанию
/omf
Включает объектный формат Intel OMF (Intel Object Module Format) Omf-формат используется для компиляции DOS-программ. Этот ключ появился только в 7-й версии.
Раньше OMF был по умолчанию.
/Zs
Транслятор только проверяет синтаксис исходника ML.EXE просто выдаёт список ошибок. Даже в том случае если ошибок нет, сама трансляция не состоится -


Свойства будущей программы

Дополнительно можно задать некоторые характеристики для выходного объектного и затем исполняемого файла.
Ключи свойств будущей программы
Ключ и форматЧто делаетДля чего это нужноПримечание
/F <hex-число>
Устанавливает резерв стека. Размер указывается после пробела в байтах в шестнадцатиричном виде. Для Win32-программ это число лучше сделать кратным 1000h По умолчанию для стека резервируется 4kb (1000h). Но Windows динамически определяет необходимый объём стека 32-битных приложений. Для оптимизации имеет смысл задать размер стека, который всё равно будет использоваться программой. Тогда отпадает необходимость часто увеличивать стек динамическим путём Вместо этого ключа можно использовать ключ "/STACK" для link.exe
/FPi
Добавляет в программу код эмулятора команд математического сопроцессора 80x87 Старые процессоры (до 80486DX) не имели встроенного блока сопроцессора, поэтому для того, чтобы программу с FPU-инструкциями можно было запустить на древних компьютерах без сопроцессора (например 486SX), была создана специальная библиотека с кодом, эмулирующим инструкции с плавающей запятой Сегодня этот ключ практически не используется
/G<c|d|z>
Определяет соглашение о вызове функций:
с - уговор Pascal
d - уговор С
z - уговор Stdcall
Этот ключ определяет множество параметров вызова функций (вид имён функций, порядок аргументов, выравнивание стека). В программах Win32 всегда используется соглашение Stdcall. Почти все Win32-API сами выравнивают стек. Исключением является лишь API wsprintf, она определена отдельно с соглашением C Вместо этого ключа можно использовать директиву ".model" или "OPTION LANGUAGE:" в исходном файле
/H<число>
Устанавливает максимальную длину внешних имён (число символов в десятичном виде) В Win32-библиотеках имена экспортируемых (внешних) функций могут быть очень длинными, и ограничивать их нет смысла. Возможное использование ключа - разве что для совместимости со старыми программами и системами -
/safeseh
Помечает объектный файл как не содержащий SEH (структурных обработчиков исключений) или содержащий только SEH'и объявленные с директивой .SAFESEH.
Такая возможность появилась только в 7-й версии ml.exe
Позволяет создавать объектные файлы с использованием безопасных обработчиков структурных исключений (safe SEH). Методика Safe SEH разработана MS для предотвращения использования обработчиков исключений (SEH) вредоносным кодом. Этот ключ нет смысла использовать в составе с MASM32 (до текущего v9). Чтобы из таких obj-файлов создавать исполняемые модули с safe SEH, нужно использовать link.exe версии 7 и старше с ключом /SAFESEH. Кроме того, нужны соответствующие lib-файлы. Так что для полезного использования этого ключа придётся как минимум подключать к исходнику новые lib-файлы из Visual С++. Если ваш исходник вообще не содержит SEH, то после компиляции PE-exe или dll достаточно включить бит 10 в DLL-флагах (MAGE_DLLCHARACTERISTICS_NO_SEH = 400h), чтобы модуль считался Safe SEH.
/Zp[число]
Устанавливает выравнивание внутри всех структур (число может быть 1,2,4 и 8) Позволяет автоматически выравнивать все члены относительно первого внутри всех структур до границы в 1,2,4 или 8 байт. Положение первых членов не выравнивается. Вместо этого ключа в исходнике можно использовать поле [alignment] в директиве STRUCT для каждой структуры отдельно


Трактовка исходного кода

Можно заставить в ходе трансляции "доработать" исходник. Изменить идентификаторы (имена меток, переменных...) или добавить макросы. При этом исходный файл на диске меняться не будет.
Ключи модификации исходного текста
Ключ и форматЧто делаетДля чего это нужноПримечание
/Cp
Оставляет неизменным регистр для всех пользовательских идентификаторов Этот ключ позволяет считать все имена типа Тыква, ТЫКВА и тыква разными. В исходниках для Win32 такая возможность используется всегда Вместо этого ключа удобнее использовать директиву "option casemap:none" в исходном файле. Ключи не отменяют директивы, поэтому /Cp ничего не изменит, если в исходнике есть "option casemap:all или notpublic"
/Cu
Поднимает регистр для всех пользовательских идентификаторов Фактически, этот ключ ничего не даёт. Так как и без него все имена типа Тыква, ТЫКВА и тыква приводятся к виду ТЫКВА Вместо этого ключа можно использовать директиву "option casemap:all" в исходном файле
/Cx
Оставляет неизменным регистр только для идентификаторов, объявленных публичными или внешними Этот ключ позволяет оставить для линковщика внешние и публичные имена типа Тыква, ТЫКВА и тыква как они есть.
Сейчас этот ключ практически не используется
Вместо этого ключа можно использовать директиву "option casemap:notpublic" в исходном файле
/D<имя>[=значение]
Определяет макрос в командной строке.
Имя - идентификатор,
значение - код макроса (если с пробелами, то должен быть в кавычках)
При помощи этого ключа можно добавлять к исходнику текстовые макросы в командной строке Макросы могут быть такими же, как с директивой "EQU" или "TEXTEQU" в исходном файле.
Описание синтаксиса смотри в файлах помощи к MASM32
/Zm
Включает режим максимальной совместимости с MASM 5.10 Для компиляции очень старых исходников, написанных под MASM до версии 5.10 Вместо этого ключа можно использовать директиву "option M510" в исходном файле


Работа с именами файлов и путями

Ключ и форматЧто делаетДля чего это нужно
/Fe<файл>
Задаёт альтернативное имя для исполняемого файла Можно оставлять старые версии готовой программы нетронутыми и давать им каждый раз новые номера. Этот ключ удобно использовать в bat-файлах для автоматизации бекапов
/Fo<файл>
Задаёт альтернативное имя для объектного файла Если мы хотим, чтоб промежуточный объектный файл имел имя, отличное от исходника, то нужно указать желаемое имя в поле <файл>
/I<путь>
Задаёт пути для включаемых файлов Допустим, в исходнике такая строка:
include windows.inc
Транслятор будет искать windows.inc в текущей папке, а затем в путях, указанных в переменных окружения PATH и INCLUDE. Но с данным ключом ещё и в <пути> (доступно до 10 штук /I).
Слишком часто в исходниках конкретизируют путь так:
include \masm32\include\windows.inc
При такой записи файл windows.inc будет искаться только на текущем диске с этим путём и ключ "/I", к сожалению, работать не будет
/X
Игнорирует переменную окружения INCLUDE Данный ключ используется для того, чтобы не искать inc-файлы MASM'a там, где находятся сторонние подключаемые файлы.
Транслятор без ключей /I и /X ищет включаемые файлы по указанному в исходнике пути. Если он не установлен: в текущей папке и затем в двух переменных окружения: PATH и INCLUDE.
Последнюю определяет под себя не только транслятор ml.exe, но и другие компиляторы (например C++)
/Ta<файл>
Задаёт имя исходника с расширением, отличным от asm Назначение для меня неясно, потому что сегодня можно компилировать исходник с любым расширением и без этого ключа


Листинг

ML.EXE может выдавать текстовые файлы с информацией о ходе трансляции, это и называется листингом.

Файлы листинга можно использовать в разных целях, например для:

Листинг
Ключ и форматЧто делаетДля чего это нужно
/EP
Отправляет листинг препроцессора на поток вывода stdout (консольный вывод) С этим ключом мы получим листинг первого прохода - текст исходного файла и всех подключённых к нему после обработки препроцессором. Текст выводится в окно консоли.
Если перенаправить вывод в файл, то мы получим самостоятельный исходник (не нуждающийся в доп. inc-файлах), однако такой файл уже не будет содержать исходных макросов и, как правило, он получается больше мегабайта.
Бывает полезно для отладки макросов и при переносе на другую машину (с другой версией MASM'a) или для "глубокого" архива
/Fl[файл]
Создаёт файл листинга трансляции Создаётся текстовый файл, который помогает понять, во что транслируется каждая строка исходников.
Чтобы найти свой текст в листинге транслятора (отчёт обычно больше 3Mb), лучше сразу искать свои комментарии


Настройки листинга трансляции
Ключ и форматЧто делает
/Sa
Самый полный формат листинга. Задаёт для листинга все опции формата
/Sf
Добавляет в листинг первичный проход транслятора
/Sc
Добавляет в листинг перед каждой машинной командой количество тактов, за которое она выполняется (информация на основе директив ряда ...".386",".486"... из исходника)
/Sg
Фактически, на сегодня этот ключ ничего не меняет
/Sl<ширина>
Устанавливает длину строки листинга от 60 до 255 символов (по умолчанию значение 0 - не ограниченно)
/Sp<высота>
Устанавливает количество строк в условной странице листинга от 10 до 255 (по умолчанию значение 0 - не ограниченно). На таблицу символов не распространяется
/St<текст>
Добавляет в листинг заголовок
/Ss<текст>
Добавляет в листинг подзаголовки
/Sx
Включает в листинг не выполненные фрагменты условий
/Sn
Исключает из листинга таблицу символов


Сопроводительные файлы

Ключ и форматЧто делаетДля чего это нужноПримечание
/Fm[файл]
Просит линковщик создать map-файл Фактически этот текстовый файл является отчётом линковщика.
В map-файлах указываются данные о секциях, импорте, экспорте и т.п.
Вместо этого ключа можно использовать ключ "/MAP[:filename]" для link.exe
/FR[файл]
Создаёт sbr-файл для браузера объектов с расширенной информацией Имеет смысл использовать с Visual Studio. Sbr - это промежутачные файлы, которые затем можно преобразовать (с помощью bscmake.exe) в bsc-файлы проводника объектов VS. -
/Fr[файл]
Создаёт sbr-файл для браузера объектов с ограниченной информацией Назначение смотри выше.
Ограниченная - это значит не включается информация о локальных идентификаторах (локальные метки, переменные и т.п.)
-


Ошибки и предупреждения

Каждая ошибка трансляции имеет свой номер - код ошибки. Коды распределяются так:

A1???       - фатальные ошибки
A2???       - нефатальные ошибки
A3000-A6??? - предупреждения
Ключи свойств ошибок и предупреждений
Ключ и форматЧто делаетДля чего это нужно
/AT
Включает набор сообщений об ошибках для com-программ (tiny model). Tiny model не поддерживается с 7-й версии ml.exe, но ключ остался Этот ключ - не эквивалент директивы ".MODEL tiny" в исходном файле, однако с ним ml.exe передаст линковщику опцию /T (/TINY).
Ключ /TINY не совместим с Incremental Linker. Он просто вызовет ошибку линковки
/WX
Рассматривает предупреждения транслятора как ошибки Если возникнут предупреждения, то с этим ключом трансляция прекращается после вывода списка ошибок
/W<число>
Устанавливает уровень предупреждений (число может быть 0,1,2 или 3) Ключ: Показывает ошибки:
/W0 - A1000-A2???
/W1 - A1000-A4???
/W2 - A1000-A5???
/W3 - A1000-A6???
/w
равен /W0 -


Отладочная информация

ML.EXE может поместить в объектный файл имена наших переменных, функций и другие идентификаторы пользователя. Кроме того, линковщик может связать каждую строку исходника с участком маш. кода, в который она была транслирована. Всё это называется отладочной информацией.
Ключи отладочной информации
Ключ и форматЧто делаетДля чего это нужно
/Zi
Создаёт полную отладочную информацию Используется на этапе отладки программы. Транслятор включает в объектный файл полную отладочную информацию, которую линковщик (только с ключом /DEBUG) формирует в отладочный в pdb-файл (program database) и связывает с исполняемым модулем. С таким файлом в отладчике можно будет видеть исходник и всю информацию типа имён функций, переменных, меток и т.д.
/Zf
Сделает только идентификаторы публичными Можно использовать для обеспечения сторонних программистов отладочной информацией (например для SDK). Транслятор включает в объектный файл отладочную информацию об идентификаторах, которую линковщик (только с ключом /DEBUG) формирует в отладочный pdb-файл и связывает с исполняемым модулем. С таким pdb-файлом в отладчике можно будет видеть информацию типа имён функций, переменных, меток, но не исходник
/Zd
В отладочной информации будут только номера строк исходника Раньше использовался для совместимости со старыми отладчиками, сегодня уже не имеет смысла


Свойства линковщика

Ключ и форматЧто делаетДля чего это нужно
/Bl<линковщик>
Для сборки программы будет использоваться альтернативный линковщик по указанному пути Разные версии линковщиков обладают разными возможностями (новые могут не поддерживать старые форматы). Для расширения возможностей этот ключ позволяет использовать линковщики с разными именами. Если используется /Bl, то ключи линковщику будут передаваться из поля ключи_линковщика
/link <ключи_линковщика>
Задает командную строку линковщика Через этот параметр транслятор передаёт любые ключи, операторы и имена файлов линковщику. Используется для того, чтобы управлять альтернативным линковщиком
/c
Транслирует без линковки Этот ключ используется для создания только объектных файлов.
Часто нужно проводить линковку отдельно.


Информация ML

Ключ и форматЧто делаетДля чего это нужноПримечание
/nologo
Отключает вывод текста приветствия Удобно использовать прежде всего с IDE (интегрированными средами разработки) Если вы используете только одну версию ml.exe, то этот ключ лучше всего добавить в переменную окружения ML
/help
Выводит список ключей с кратким пояснением Чтобы напоминать себе о том, как много всего ключей =) Из-за ошибки (связанной с UNICODE) многие версии ml.exe не принимают стандартного ключа /?. Альтернативой может быть либо /help, либо -?.


Bitfry

<<Вернуться на главную

Hosted by uCoz