Сначала MASM был коммерческим продуктом, но затем Microsoft стал распространять MASM в составе бесплатного DDK (Device Driver Kit — пакет разработчика драйверов), а также в составе Visual C++. Хотя Microsoft официально не объявлял MASM бесплатным продуктом, но фактически этот ассемблер можно получить и использовать бесплатно. В состав пакета ассемблера фирмы Microsoft входят следующие программы: ml64.exe (Masm and Link) — транслятор и dll-файлы к транслятору link.exe — компоновщик и dll-файлы к компоновщику вспомогательные программы и утилиты: lib.exe implib.exe nmake.exe h2inc.exe rc.exe cvtres.exe dumpbin.exe bin2db64.exe hiew32.exe Resource Ripper ResourceHacker Программа ml64.exe Транслирует и связывает один или более исходных ассемблерных файлов. Командная строка имеет вид ML64 [ключи] исходный_файл1.asm [[ключи] исходный_файл2.asm] ... [/link ключи компоновщика] Ключи командной строки чувствительны к регистру Переменные окружения (environment variables) ML64 можно задать некоторые характеристики для выходного объектного и затем исполняемого файла. Наборы переменных с именами и значениями, которые используют ОС и другие программы. Настроить список переменных двух наборов (пользователя и системных) в Windows можно так: правый клик на «Мой компьютер» → «Свойства» → закладка «Дополнительно» → «Переменные среды». Для установки переменной в одном сеансе запуска консоли можно воспользоваться командой SET из командной строки. INCLUDE Указывает путь поиска для включения файлов. ML Задает параметры командной строки по умолчанию. TMP Указывает путь для временных файлов. Ключи свойств будущей программы КлючДействиеОсобенности/F шестнадцатеричное значение Устанавливает размер стека в шестнадцатеричное значение байт (аналогичен ключу link /STACK:шестнадцатеричное значение), где шестнадцатеричное значение - значение в шестнадцатеричной системе счисления. /F и шестнадцатеричное значение должны разделяться пробелами. Размер указывается после пробела в байтах в шестнадцатеричном виде. Для Win-программ это число лучше сделать кратным 1000h. По умолчанию для стека резервируется 4kb (1000h). Но Windows динамически определяет необходимый объём стека 64-разрядных приложений. Для оптимизации имеет смысл задать размер стека, который всё равно будет использоваться программой. Тогда отпадает необходимость часто увеличивать стек динамическим путёмПрактически не применяется. То же, что опция /STACK компоновщика link.exe. Обычно используется значение по умолчанию = 1 Мбайт/Zp[выравнивание] Выравнивание структур на указанной границе байта. Выравнивание может быть 1, 2, 4, 8 или 16Может быть использован для установки принятого в windows выравнивания по умолчанию - на 8 байт. Однако обычно в применении нет необходимости, так как в windows используется два варианта выравнивания структур - на 4 и на 8 байт, и определять их выравнивание целесообразно непосредственно в описании структуры директивой STRUCT. Возможные значения для этой опции 1, 2, 4, 8 и 16Ключи модификации исходного текста КлючДействиеОсобенности/Cp Сохраняет регистр всех идентификаторов пользователейПрименение не обязательно, но возможно для дополнительного контроля синтаксиса. Вызывает ошибку "A2006: undefined symbol" при несовпадении регистра в объявлении идентификатора и обращении к нему. Позволяет избежать ошибок на этапе компоновки в случае, если идентификатор объявлен с неверным регистром./CxСохранить регистр символов, объявленных в директивах publics и externsНе применяется, так как компоновка Windows приложений чувствительна к регистру/Dидентификатор[=значение] Определить текстовую макрокоманду с данным именем. Если значение отсутствует, тогда идентификатор в тексте заменяется пробелом. Если значение содержит строку с пробелами, тогда строка заключается в кавычки. При помощи этого ключа можно добавлять к исходнику текстовые макросы в командной строкеПрименяется по усмотрению программиста. Аналог директив EQU или =. Если текст содержит пробелы, его следует взять в кавычки. Обычно используется в отладочном версии приложения для объявления имени DEBUG.Работа с именами файлов и путями КлючДействиеОсобенности/Feимя файла Задать имя исполняемого файла (exe, dll, sys)Не применяется, так как с учетом опции /c компилятор не создает исполняемого файла/Foимя файла Имя объектного файла (obj)Обычно не применяется. Позволяет задать obj-файлу имя, отличное от имени asm-файла./I путьУстановить путь для включаемых файлов. Позволяет задать максимум 10 ключей /I/XИгнорировать путь заданный переменной INCLUDEОбычно не применяется/Taимя файлаСобирает исходный файл, имя которого не заканчивается расширением .asmОбычно не применяется. Служит для компиляции файлов, имя которых имеет расширение, отличное от asmЛистинг КлючДействиеОсобенности/EP Генерация препроцессорной распечатки программы (посылается в stdout). Смотри /SfОбычно применять нет необходимости. Листинг препроцессора представляет собой исходный текст вместе с включаемыми файлами./Fl[имя файла] Генерировать листинг. Смотри /SfОбычно не применяется, так как средства MS Visual Studio, как правило, достаточны для работы с текстом приложенияНастройки листинга трансляции КлючДействиеОсобенности/SaВключить в листинг всю доступную информациюПрименяется редко, так как собственных средств MS Visual Studio обычно достаточно для работы с исходным и компилированным текстом программы, и в выдаче листинга нет необходимости./SfВключить листинг первого прохода в общий листинг/Sl ширинаУстанавливает ширину строки листинга в символах. Диапазон ― от 60 до 255 или 0. Значение по умолчанию ― 0. Действия ключа аналогично директиве PAGE число/Sn Не включать таблицу символов в листинг /Sp длина Установить длину страницы листинга в строках на страницу. Диапазон значения длина ― от 10 до 255 или 0. Значение по умолчанию ― 0/Ss строка Определяет строку подзаголовка для листинга. Действие ключа аналогично директиве SUBTITLE строка/St текстОпределяет текст заголовка для листинга. Действие ключа аналогично директиве TITLE текст/SxВключить в листинг все фрагменты условной компиляцииСопроводительные файлы КлючДействиеОсобенности/Fm[имя файла]Создать файл карты компоновщика (map)Не применяется, так как map-файл создается компоновщиком, а с учетом опции /c компилятор не вызывает компоновщик/Fr[имя файла] Генерировать файл .SBR браузера базы данных проекта PWBПрименение менее предпочтительно, чем /FR, так как в информацию броузера не включается сведения о локальных идентификаторах./FR[имя файла] Генерировать расширенный файл .SBR браузера базы данных проекта PWBПозволяет получать быстрый доступ к любому идентификатору во всем пространстве проекта и заголовочных файлов APIОшибки и предупреждения КлючДействиеОсобенности/wТо же самое, что и /W0 /WX/WXВозвратить код ошибки, если сгенерированы предупрежденияОбычно в применении нет необходимости. В случае возникновения предупреждений компиляция завершается неуспешно. /WуровеньУстановить уровень сообщений (уровень = 0, 1, 2, 3)Обычно в применении нет необходимости. Устанавливает перечень событий компиляции, трактуемых как предупрежденияОтладочная информация КлючДействиеОсобенности/ZfСделать все идентификаторы общимиОбычно не применяется./ZiВключение в объектный файл информации для отладчикаОбязательно применяется на этапе отладки. Формат отладочной информации MASM полностью совместим с используемым встроенным отладчиком MS Visual Studio/ZdВключение в объектный файл информации о номерах строк для отладчикаОбычно не применяется, так как на этапе отладки более целесообразно использовать опцию /ZiСвойства линковщика КлючДействиеОсобенности/Bl имя компоновщикаВыбрать другой компоновщик (не link.exe)Обычно не применяется, так как возможностей link.exe вполне достаточно. Используется опция /c/c Только трансляция исходного файла. Не компоноватьчтобы выполнять компоновку отдельным этапом./link Опции командной строки компоновщика и подключаемые библиотекиНе применяется, так как компоновка отключена опцией /cПрочие ключи ML64 КлючДействиеОсобенности/nologoМинимальный объем сообщений о ходе трансляциибаннерный текст смысловой нагрузки не несет./Zsвыполнить только проверку синтаксисаОбычно не применяется. Подавляет формирование объектного модуля/ZH:MD5Использовать MD5 для контрольной суммы в сведениях отладки/ZH:SHA_256Использовать SHA256 для контрольной суммы в сведениях отладки (по умолчанию в Visual Studio 2022 версии 17.0 и более поздних версиях)./Gy[-]отдельные функции для linker/errorReport:<option>Устарело. Отчеты об ошибках управляются параметрами отчеты об ошибках Windows (WER)/quietПодавляет сообщение "Сборка". Доступно в Visual Studio 17.6 и более поздних версиях./?Справка о синтаксисе командной строки ML64/helpВыводит список ключей с кратким пояснениемСсылки: Bitfry Дневники чайника © Svet(R)off Компиляция файлов .asm с помощью компилятора ml.exe ML and ML64 command-line reference The Microsoft macro assembler
Программа link.exe Компоновщик link компонует (объединяет) объектные файлы и библиотеки в исполняемый файл или динамически компонуемую библиотеку (DLL). При запуске компоновщика за пределами Visual Studio можно указать входные данные одним или несколькими способами: В командной строке Использование файлов команд В переменных среды Компоновщик сначала обрабатывает параметры, указанные в LINK переменной среды, а затем параметры в порядке, указанном в командной строке и в файлах команд. Если параметр повторяется с разными аргументами, последний обработанный имеет приоритет. Параметры применяются ко всей сборке; Никакие параметры не могут применяться к определенным входным файлам. Чтобы выполнить команду link.exe, используйте следующий синтаксис команды: link arguments Параметры arguments включения и имена файлов можно указать в любом порядке. Сначала обрабатываются параметры, а затем файлы. Используйте одно или несколько пробелов или вкладок для разделения аргументов. Аргументы link.exe командной строки можно передать в форму файла команды. Чтобы указать файл команды компоновщику, используйте следующий синтаксис: link @commandfile Имя commandfile текстового файла. Пробел или вкладка не разрешены между знаком (@) и именем файла. Нет расширения по умолчанию; Необходимо указать полное имя файла, включая любое расширение. Подстановочные знаки нельзя использовать. Можно указать абсолютный или относительный путь с именем файла. Не должно превышать MAX_PATH (260 символов). Компоновщик не использует переменную среды для поиска файла. В файле команд аргументы разделены пробелами или вкладками (как в командной строке) и новыми символами. В командном файле можно указать все или часть командной строки. В команде link.exe можно использовать несколько файлов команд. Компоновщик принимает входные данные в командной строке, как если бы он был указан в этом расположении в командной строке. Не удается вложить файлы команд. Компоновщик отражает содержимое файлов команд, если /NOLOGO не указано. Переменные среды link.exe Компоновщик распознает следующие переменные среды: LINK и _LINK_, если определено. Компоновщик добавляет параметры и аргументы, определенные в переменной среды, и добавляет параметры и аргументы, определенные в LINK переменной _LINK_ среды, к аргументам командной строки перед обработкой. LIB, если определено. Компоновщик использует LIB путь при поиске объекта, библиотеки или другого файла, указанного в командной строке или параметре /BASE . Он также использует LIB путь для поиска .pdb файла с именем в объекте. Переменная LIB может содержать одну или несколько спецификаций пути, разделенных точкой с запятой. Один путь должен указывать на \lib подкаталог установки Microsoft C++. PATH, если инструменту нужно запустить CVTRES и не удается найти файл в том же каталоге, что link.exe и сам. (link.exe требуется CVTRES связать .res файл.) PATH должен указывать на \bin подкаталог установки Microsoft C++. TMP, чтобы указать каталог при связывании OMF или .res файлов. Командная строка link.exe имеет вид LINK [ключи] объектные_файлы.obj [@commandfile] Значения ключей: КлючиДействие@Указывает файл с ключами/ALIGN:#Задает выравнивание каждой секции./ALLOWBIND[:NO]Указывает, что библиотека DLL не может быть привязана./ALLOWISOLATION[:NO]Задает поведение нахождения файлов манифеста./APPCONTAINERОпределяет, должно ли приложение выполняться в среде процесса контейнера приложений./ARM64XFUNCTIONPADMINX64Указывает минимальное количество байтов заполнения между функциями x64 в образах ARM64X.17.8/ASSEMBLYDEBUG[:DISABLE]Добавляет атрибут DebuggableAttribute в управляемый образ./ASSEMBLYLINKRESOURCE:имя файлаСоздает ссылку на управляемый ресурс./ASSEMBLYMODULE:имя файла[,[ name][, PRIVATE]]Указывает на то, что в сборку должен быть импортирован модуль MSIL./ASSEMBLYRESOURCE:имя файлаВнедряет файл управляемых ресурсов в сборку./BASE:{address[, size]| @имя файла, key}Задает базовый адрес для программы./CETCOMPATПомечает двоичный файл как совместимый с теневым стеком CET./CGTHREADSЗадает число потоков cl.exe, используемых для оптимизации и создания кода, если задано создание кода во время компоновки./CLRIMAGETYPE:{IJW| PURE| SAFE}Задает тип (IJW, pure или safe) CLR-образа./CLRLOADEROPTIMIZATION:{SD| MD| MDH| NONE}/CLRSUPPORTLASTERROR[:{NO| SYSTEMDLL}]Сохраняет последний код ошибки функций, вызываемых с помощью механизма P/Invoke./CLRTHREADATTRIBUTE:{STA| MTA| NONE}Указывает атрибут потока для применения к точке входа CLR-программы./CLRUNMANAGEDCODECHECK[:NO]Указывает, применяет SuppressUnmanagedCodeSecurity ли компоновщик атрибут к заглушкам, созданным компоновщиком P/Invoke, вызывающим из управляемого кода в собственные библиотеки DLL./DEBUG:имя файлаСоздает отладочную информацию./DEBUGTYPEУказывает, какие данные необходимо включить в отладочную информацию./DEFПередает компоновщику файл определения модуля (DEF)./DEFAULTLIB:libraryПроводит поиск по указанной библиотеке при разрешении внешних ссылок./DELAY:{NOBIND|UNLOAD}Управляет отложенной загрузкой библиотек DLL./DELAYLOAD:dllВключает отложенную загрузку указанной библиотеки DLL./DELAYSIGN[:NO]Частично подписывает сборку./DEPENDENTLOADFLAGЗадает флаги по умолчанию для зависимых загрузок DLL./DLLВыполняет сборку библиотеки DLL./DRIVER[:{UPONLY| WDM}]Создает драйвер режима ядра./DYNAMICBASE[:NO]Указывает, следует ли создавать исполняемый образ, который перебазирован во время загрузки с помощью функции случайности макета адресного пространства (ASLR)./DYNAMICDEOPTВключите динамической отладки C++ (предварительная версия) и шаг в любом месте с функцией по запросу deoptimization./ENTRY:symbolЗадает начальный адрес./ERRORREPORT:{NONE| PROMPT| QUEUE| SEND}Устарело. Отчеты об ошибках управляются параметрами отчеты об ошибках Windows (WER)./EXPORT:symbolЭкспортирует функцию./FILEALIGNВыравнивание разделов в выходном файле по нескольким значениям./FIXED[:NO]Создает программу, которая может загружаться только по предпочтительному базовому адресу./FORCE[:{MULTIPLE| UNRESOLVED}]Принудительное завершение компоновки даже в случае наличия неразрешенных или многократно определенных символов./FUNCTIONPADMIN[:size]Создает образ, для которого можно выполнять горячее обновление./GENPROFILE, /FASTGENPROFILEОба этих параметра указывают создание .pgd файла компоновщиком для поддержки оптимизации по профилю (PGO). /GENPROFILE и /FASTGENPROFILE используют разные параметры по умолчанию./GUARDВключает защиту потока управления./HEAP:reserve[, commit]Задает размер кучи в байтах./HIGHENTROPYVAОпределяет поддержку 64-разрядной функции Address Space Layout Randomization (ASLR) с высоким уровнем энтропии./IDLOUT:имя файлаУказывает имя файла и других выходных .idl файлов MIDL./IGNOREОтменяет вывод указанных предупреждений компоновщика./IGNOREIDLЗапрещает обработку сведений о атрибутах в .idl файл./ILKПереопределяет имя файла базы данных по умолчанию./IMPLIB:имя файлаПереопределяет имя библиотеки импорта по умолчанию./INCLUDE:symbolПринудительное использование ссылок на символы./INCREMENTAL[:NO]Управляет инкрементной компоновкой./INFERASANLIBSИспользует выведенные библиотеки санитизатора./INTEGRITYCHECKУказывает на то, что модуль требует проверки подписи во время загрузки./KERNELСоздание бинарного файла режима ядра./KEYCONTAINER:nameЗадает контейнер ключей для подписи сборки./KEYFILE:имя файлаЗадает ключ или пару ключей для подписи сборки./LARGEADDRESSAWARE[:NO]Сообщает компилятору, что приложение поддерживает адреса размером более 2 гигабайт/LIBPATH:dirУказывает путь для поиска перед путем среды библиотеки./LINKREPROУказывает путь для создания артефактов повторной подготовки ссылок./LINKREPROFULLPATHRSPСоздает файл ответа, содержащий абсолютные пути ко всем файлам, которые компоновщик взял в качестве входных данных./LINKREPROTARGETСоздает повторную версию ссылки только при создании указанного целевого объекта.16.1/LTCG[:{NOSTATUS| PGINSTRUMENT| PGOPTIMIZE| PGUPDATE| STATUS}]Задает создание кода во время компоновки./MACHINE:{ARM| EBC| IA64| MIPS| MIPS16| MIPSFPU| MIPSFPU16| SH4| THUMB| X64| X86}Указывает целевую платформу./MANIFEST[:NO]Создает параллельный файл манифеста и при необходимости включает его в двоичный файл./MANIFESTDEPENDENCY:manifest dependencyУказывает раздел зависимойAssembly <> в файле манифеста./MANIFESTFILE:имя файлаИзменяет имя файла манифеста по умолчанию./MANIFESTINPUTЗадает входной файл манифеста для обработки и внедрения компоновщиком в двоичный файл. Этот параметр можно использовать несколько раз, чтобы указать несколько входных файлов манифеста./MANIFESTUAC[:{NO| UAC fragment}]Указывает, следует ли внедрять в манифест программы сведения о контроле учетных записей./MAP[:имя файла]Создает файл сопоставления./MAPINFO:{EXPORTS}Включает указанные сведения в файл сопоставления./MERGE:from=toОбъединяет разделы./MIDL:@commandfileЗадает параметры командной строки MIDL./NATVISДобавляет визуализаторы отладчика из файла Natvis в базу данных программы (PDB)./NOASSEMBLYПодавляет создание сборки .NET Framework./NODEFAULTLIB[:library]Пропускает все (или только указанные) библиотеки по умолчанию при разрешении внешних ссылок./NOENTRYСоздает библиотеку DLL, содержащую только ресурсы./NOFUNCTIONPADSECTIONОтключает заполнение функции для функций в указанном разделе.17.8/NOLOGOОтключает загрузочный баннер./NXCOMPAT[:NO]Помечает исполняемый файл как файл, проверенный на совместимость с компонентом предотвращения выполнения данных Windows./OPT:{ICF[=iterations]| NOICF| NOREF| REF}Управляет оптимизацией LINK./ORDER:@имя файлаПомещает секции COMDAT в образ в предопределенном порядке./OUT:имя файлаЗадает имя выходного файла./PDB:имя файлаСоздает PDB-файл./PDBALTPATHИспользует альтернативное местоположение для сохранения файла PDB./PDBSTRIPPED:имя файлаСоздает PDB-файл, не имеющий закрытых символов./PGD:имя файлаЗадает .pgd файл для оптимизации с помощью профиля./POGOSAFEMODEУстаревшая сборка создает инструментированную сборку PGO с безопасным потоком./PROFILEСоздает выходной файл, который может быть использован для профилировщика производительности инструментов./RELEASEЗадает контрольную сумму в заголовке .exe ./SAFESEH[:NO]Указывает на то, что образ будет содержать таблицу безопасных обработчиков исключений./SECTION:name, [[!]{DEKPRSW}][, ALIGN=#]Переопределяет атрибуты секции./SOURCELINKУказывает файл SourceLink для добавления в PDB./STACK:reserve[, commit]Задает размер стека (в байтах)./STUB:filenameПрисоединяет программу-заглушку MS-DOS к программе Win32./SUBSYSTEM:{BOOT_APPLICATION| CONSOLE| EFI_APPLICATION| EFI_BOOT_SERVICE_DRIVER| EFI_ROM| EFI_RUNTIME_DRIVER| NATIVE| POSIX| WINDOWS| WINDOWSCE}[,#[.##]]Сообщает операционной системе, как запустить .exe файл./SWAPRUN:{CD| NET}Сообщает операционной системе, чтобы скопировать выходные данные компоновщика в файл буфера перед его выполнением./TIMEВыходные данные компоновщика передают сведения о времени./TLBID:#Указывает идентификатор ресурса библиотеки типов, создаваемой компоновщиком./TLBOUT:имя файлаУказывает имя файла и других выходных .tlb файлов MIDL./TSAWARE[:NO]Создает приложение, специально рассчитанное на запуск под управлением сервера терминалов./USEPROFILEИспользует обучающие данные по оптимизации с помощью профилей для создания оптимизированного образа./VERBOSE[:{ICF| LIB| REF| SAFESEH}]Печатает сообщения хода выполнения компоновщика./VERSION:#[.#]Присваивает номер версии./WHOLEARCHIVEВключает каждый файл объекта из указанных статических библиотек./WINMDВключает создание файлов метаданных среды выполнения Windows./WINMDFILEУказывает имя файла для выходного файла среда выполнения Windows метаданных (winmd), созданного параметром /WINMD компоновщика./WINMDKEYFILEЗадает ключ или пару ключей для подписи файла метаданных среды выполнения Windows./WINMDKEYCONTAINERУказывает контейнер ключей для подписания файла метаданных Windows./WINMDDELAYSIGNЧастично подписывает файл метаданных.winmd среда выполнения Windows путем размещения открытого ключа в winmd-файле./WX[:NO]Обрабатывает предупреждения компоновщика как ошибки.Ссылки: MSVC Linker options | Microsoft Learn link.exe ключи
Программа lib.exe Библиотечный менеджер, создающий и обслуживающий стандартные библиотеки времени выполнения. С помощью lib.exe можно выполнить все действия с lib-файлом: создание, добавление, удаление и замену модулей. Утилита lib.exe запускается командной строкой: LIB входная библиотека [ключи] [команды] [, [файл листинга] [, [выходная библиотека]]] [;] Значения ключей КлючДействие/DEF[:имя файла]Создание библиотеку импорта и файл экспорта./ERRORREPORT:{NONE| PROMPT| QUEUE| SEND}Устарело. Отчеты об ошибках. Дополнительные сведения см. в разделе Запуск программы LIB./EXPORT:symbolЭкспортирует функцию из программы./EXTRACT:membernameСоздание файл объекта (.obj), содержащий копию элемента существующей библиотеки./INCLUDE:symbolДобавляет символ в таблицу символов./LIBPATH:dirПереопределяет путь к библиотеке среды./LINKREPRO:dirСоздает артефакты, необходимые для воспроизведения lib.exe сбоя или внутренней ошибки./LINKREPROTARGET:имя файлаСоздает артефакты /LINKREPRO только при использовании lib.exe с указанным файлом./LINKREPROTARGET:имя файла/LIST[:имя файла]Отображает сведения о выходной библиотеке для стандартных выходных данных./LTCGВызывает создание библиотеки с помощью создания кода во время компоновки./MACHINE:{ARM64| ARM64X| EBC| X64| X86}Указывает целевую платформу для программы./NAME:имя файлаПри создании библиотеки импорта указывает имя библиотеки DLL, для которой создается библиотека импорта./NODEFAULTLIB[:library]Удаляет одну или несколько библиотек по умолчанию из списка библиотек, которые он выполняет поиск при разрешении внешних ссылок./NOLOGOПодавляет отображение сообщения об авторских правах LIB и номера версии и предотвращает эхо командных файлов./OUT:имя файлаПереопределяет имя выходного файла по умолчанию./REMOVE:membernameОкупит объект из выходной библиотеки./SUBSYSTEM:{BOOT_APPLICATION| CONSOLE| EFI_APPLICATION| EFI_BOOT_SERVICE_DRIVER| EFI_ROM| EFI_RUNTIME_DRIVER| NATIVE| POSIX| WINDOWS| WINDOWSCE}[,#[.##]]Сообщает операционной системе, как запустить программу, созданную путем связывания с выходной библиотекой./VERBOSEОтображает сведения о ходе сеанса, включая имена добавляемых .obj файлов./WX[:NO]Обработайте предупреждения как ошибки./WX[:nnnn[, nnnn...]]Создание lib-файлов из системных dll-файлов Стандартные библиотеки содержат объекты и создаются с помощью утилиты lib.exe. Библиотеки импорта содержат сведения об экспорте в другие программы и создаются либо компилятором link.exe при построении программы, содержащей экспорт, либо утилитой lib.exe. Назначение lib-файлов ― предоставление программе link.exe информации о внешних ссылках на WinAPI-функции внутри системных dll-файлов. lib-файл ― это архив, который хранит набор сопоставлений "внешний символ" ― ссылка на объектный (COFF или PE) файл. Этот "символ" на стадии линковки либо добавляется в исполняемый образ (в случае с COFF ― из перекомпилированного объектного файла), либо ― прописывается в таблице импорта (в случае с PE). То есть некоторый объем внешних ссылок транслируется в ваш exe или dll. Как из содержимого def- и inc-файлов создать lib-файл Подробно о создании def- и inc-файлов из системного dll-файла из папки %windir%\System32 рассказано в топике об утилите dumpbin.exe Допустим создаем user32.lib ― понадобится файл user32.def set FileName=user32 link -lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64 того же результата можно добиться строкой lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64 удаляем программный мусор if exist %FileName%.def del %FileName%.def if exist %FileName%.exp del %FileName%.exp
Утилита dumpbin.exe Программа используется для исследования загружаемых и объектных модулей COFF-формата и выводит информацию в текущую консоль. Утилита dumpbin.exe запускается командной строкой: DUMPBIN [options] [files] Ключи данной программы: КлючДействие/ALLвыводит всю доступную информацию о модуле, кроме ассемблерного кода/ARCHвыводит содержимое секции.arch заголовка модуля/ARCHIVEMEMBERSвыводит минимальную информацию о элементах объектной библиотеки/CLRHEADER/DEPENDENTSвыводит имена динамических библиотек, откуда данным модулем импортируются функции/DIRECTIVESвыводит содержимое секции.drective, создаваемой компилятором (только для объектных модулей)/DISASM[:{BYTES| NOBYTES}]дизассемблирует содержимое секций модуля с использованием и символьной информации, если она присутствует там/ERRORREPORT:{NONE| PROMPT| QUEUE| SEND}Отчеты об ошибках/EXPORTSвыдает все экспортируемые модулем имена/FPO/HEADERSвыдает заголовки модуля и всех его секций. В случае объектной библиотеки выдает заголовки всех составляющих ее объектных модулей/IMPORTS[:имя файла]выдает все имена, импортируемые данным модулем/LINENUMBERSвыдает номера строк объектного модуля, если таковые имеются/LINKERMEMBER[:{1| 2| 4| 8| 16| 32}]выдает все имена в объектной библиотеке, определяемые как public/LINKERMEMBER:1в порядке следования объектных модулей в библиотеке/LINKERMEMBER:2вначале выдает смещение и индекс объектных модулей, а затем список имен в алфавитном порядке для каждого модуля/LINKERMEMBERсочетание ключей 1 и 2/LOADCONFIG/NOLOGOПодавляет отображение сообщения об авторских правах и номера версии DUMPBIN. Предотвращает эхо командных файлов./NOPDB/OUT:имя файлаопределяет, что вывод осуществляется не в консоль, а в файл (/OUT:ED.TXT)/PDATAвыдает содержимое таблиц исключения/PDBPATH[:VERBOSE]/RANGE:vaMin[,vaMax] /RAWDATA[:{NONE| 1| 2| 4| 8}[,#]]выдает дамп каждой секции файла. Разновидности данного ключа: /RAWDATA:BYTE, /RAWDATA:SHORTS, /RAWDATA:LONGS, /RAWDATA:NONE, /RAWDATA:,number. Здесь number определяет ширину строк/RELOCATIONS/SECTION:name/SUMMARYвыдает минимальную информацию о секциях/SYMBOLSвыдает таблицу символов COFF-файла/TLS/UNWINDINFOСоздание inc-файлов из системных dll inc-файлы ― это текстовые файлы содержащие описания структур данных и констант Windows, а также макроопределения. inc-файлы формируются программистом по мере расширения используемых им средств операционной системы. Аналогичны заголовочным h/hpp-файлам используемых при программировании на C/C++, иногда можно сформировать inc-файлы из h-файлов используя утилиту h2inc.exe (ее можно найти в старых пакетах MASM). Для создания inc-, def- и lib-файлов используем bat-файл. В bat-файле создаем переменную %FileName% ― это имя "препарируемой dll". Обработку начнем с user32.dll и в результате получим user32.txt файл set FileName=user32 dumpbin.exe /EXPORTS %windir%\System32\%FileName%.dll /OUT:%FileName%.txt @echo EXPORTS >> %FileName%.def for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do ( if "%%a"=="Summary" goto :exit if "%%d"=="" ( @echo extern __imp_%FileName%_ordinal%%a:qword >> %FileName%.inc @echo %FileName%_ordinal%%a TEXTEQU ^<__imp_%FileName%_ordinal%%a^> >> %FileName%.inc @echo %FileName%_ordinal%%a=ordinal%%a @%%a NONAME >> %FileName%.def) else ( if not "%%d"=="(forwarded" ( @echo extern __imp_%%d:qword >> %FileName%.inc @echo %%d TEXTEQU ^<__imp_%%d^> >> %FileName%.inc @echo %%d=__imp_%%d >> %FileName%.def ))):exit link -lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64 Разбор bat-файла dumpbin.exe /EXPORTS %windir%\System32\%FileName%.dll /OUT:%FileName%.txt содержимое user32.txt Dump of file C:\Windows\System32\user32.dll File Type: DLL Section contains the following exports for USER32.dll 00000000 characteristics 4CE799CD time date stamp Sat Nov 20 17:50:05 2010 0.00 version 1500 ordinal base 1003 number of functions 830 number of names ordinal hint RVA name 1502 0 000083C0 ActivateKeyboardLayout 1503 1 0002AD40 AddClipboardFormatListener 1504 2 000235B8 AdjustWindowRect 1505 3 00017CE4 AdjustWindowRectEx .... 2341 33C 0007B430 wvsprintfA 2342 33D 00020BFC wvsprintfW 1500 0002B260 [NONAME] 1501 0002AE80 [NONAME] .... Summary 2000 .data A000 .pdata 10000 .rdata 1000 .reloc 5B000 .rsrc 81000 .text после просмотра user32.txt видно, что из user32.dll импортируется 846 функции, из них 826 функций импортируются по именам, 16 ― по ординалам, а функции DefDlgProcA, DefDlgProcW, DefWindowProcA, DefWindowProcW портируются в user32.dll из системной библиотеки NTDLL.dll Dump of file C:\Windows\System32\user32.dll File Type: DLL Section contains the following exports for USER32.dll 00000000 characteristics 4CE799CD time date stamp Sat Nov 20 17:50:05 2010 0.00 version 1500 ordinal base 1003 number of functions 830 number of names ordinal hint RVA name 1502 0 000083C0 ActivateKeyboardLayout <-- полезная информация начинается здесь Если перед началом обработки в каталоге уже существуют файлы user32.inc, user32.def, user32.lib оставшиеся от предыдущей обработки dll-файлов ― удаляем их. if exist %FileName%.inc del %FileName%.inc if exist %FileName%.def del %FileName%.def создаем файл user32.def, который должен начинаться со строки "EXPORTS" @echo EXPORTS >> %FileName%.def полезная информация начинается в user32.txt с 16 строки, поэтому skip=16 означает ― пропускаем первые 16 строк в user32.txt при построчном разборе файла user32.txt используем четыре первых слова в строке, которым присвоим имена %%a, %%b, %%c, %%d for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do если первый параметр равен "Summary" ― значит обработаны все функции, входящие в dll, мы прекращаем обработку, выходим из файла user32.txt и переходим на метку :exit if "%%a"=="Summary" goto :exit если четвертый параметр в файле user32.txt пустой ― перед нами импорт по ординалам %%a____%%b_____%%c_____%%d 1500____0002B260_[NONAME] сохраняем первое слово (ординал WinAPI-функции) в строке user32.txt в переменной %%a, обрамляем ее и помещаем в две новых строки в файл user32.inc extern __imp_user32_ordinal1500:qword user32_ordinal1500 TEXTEQU <__imp_user32_ordinal1500> и user32.def user32_ordinal1500=ordinal1500 @1500 NONAME если четвертый параметр непустой ― перед нами импорт по именам функций в очередной строке файла user32.txt %%a___%%b__%%c______%%d 1502____0_____000083C0__ActivateKeyboardLayout четвертое слово в строке (имя WinAPI-функции), сохраняем в переменной %%d, создаем две новых строки в файле user32.inc, предваряем %%d "extern __imp_" строку завершаем ":qword", добавляем "TEXTEQU", "__imp_", экранируем управляющие символы "<" и ">" (^<__imp_%%d^>) чтобы bat-файл воспринимал их, как обычные символы. extern __imp_ActivateKeyboardLayout:qword ActivateKeyboardLayout TEXTEQU <__imp_ActivateKeyboardLayout> и user32.def ActivateKeyboardLayout=__imp_ActivateKeyboardLayout если четвертый параметр равен "(forwarded", значит WinAPI-функция берется из другой dll и мы пропускаем такую строку. %%a___%%b____%%c________%%d 1657____94______DefDlgProcA__(forwarded to NTDLL.NtdllDialogWndProc_A) из содержимого файлов user32.def и user32.inc создаем файл user32.lib link -lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64 того же результата можно добиться строкой lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64
cvtres.exe Утилита cvtres.exe запускается командной строкой: __CVTRES__ [options]__[files]___ Ключи данной программы: КлючиДействие/DEFINE:symbol/FOLDDUPS/MACHINE:{ARM| EBC| IA64| X64| X86}/NOLOGOПодавляет отображение сообщения об авторских правах и номера версии CVTRES. Предотвращает эхо командных файлов/OUT:filename/READONLY/VERBOSEОтображает сведения о ходе сеанса, включая имена добавляемых obj-файлов rc.exe /v rsrc.rc Cvtres.exe /machine:x64 rsrc.res link.exe /SUBSYSTEM:WINDOWS %FileName%.obj rsrc.obj Cvtres.exe выполняет функции компилятора ресурсов. Cvtres.exe — это исполняемый файл, сокращённо обозначающий утилиту преобразования файлов ресурсов Microsoft в объектные файлы COFF. Утилита отвечает за преобразование файлов сценариев ресурсов (.rc) в объектные файлы COFF (Common Object File Format) (.obj). Является частью инструментов разработки Microsoft, в частности набора компиляторов C++. В процессе компиляции cvtres.exe принимает на вход файл сценария ресурсов и компилирует его в объектный файл, содержащий скомпилированные ресурсы. Это гарантирует, что ресурсы, указанные в скрипте ресурсов, будут правильно интегрированы в приложение, что позволит получать доступ к визуальным элементам, компонентам пользовательского интерфейса и другим ресурсам и использовать их во время выполнения. Cvtres.exe работает в фоновом режиме во время компиляции и обеспечивает эффективное связывание скомпилированных ресурсов с кодом приложения, в результате чего получается полностью функциональный и визуально привлекательный программный продукт. Файлы сценариев ресурсов передаются в cvtres.exe вместе с другими необходимыми файлами в процессе компиляции, и эти файлы сценариев ресурсов обрабатываются как входные данные. Cvtres.exe выполняет ряд задач, включая синтаксический анализ, компиляцию и создание файла объектов ресурсов. Сначала он анализирует файлы сценариев ресурсов, чтобы определить ресурсы и их свойства. Затем каждый ресурс компилируется в отдельный объектный файл, содержащий скомпилированное двоичное представление данных ресурса. Генерирует объектные файлы (.obj), содержащие скомпилированные ресурсы. Эти объектные файлы специфичны для каждого ресурса, определённого в скрипте ресурсов. Cvtres.exe поддерживает компиляцию многоязычных ресурсов, что позволяет разработчикам включать в свои приложения локализованные ресурсы для разных языков. Cvtres.exe предоставляет возможности для сжатия и оптимизации ресурсов, уменьшения их размера и повышения производительности во время выполнения. Это может быть особенно полезно при работе с большими или сложными ресурсами, поскольку позволяет эффективно использовать системные ресурсы. Cvtres.exe также может извлекать и изменять ресурсы из скомпилированных приложений. Это может быть полезно для решения таких задач, как извлечение значков, изменение текстовых строк или настройка определённых ресурсов в приложении.
Может кто не знает - MASM входит в состав VisualStudio. По крайней мере у меня, в кастрированном варианте студии, без IDE, под названием MS C++ BuildTools он точно есть. То есть, если я инициализирую консоль студийными переменными окружения (vcvarsall.bat), то становятся доступными не только компилятор С++, линкер и прочие инструменты, но и в том числе и ml.exe/ml64.exe (в зависимости от выбранной разрядности инициализируемой среды). Ну и, естественно, доступны все импорт-либы от С++, что очень радует. Правда утилиты h2inc.exe у меня почему-то нет, как нет и хедеров с декларациями WinAPI-шных вещей. И если proto написать не так уж сложно, то вот деклараций структур и констант ощеньна не хватает Было бы интересно узнать, доступен ли также ml.exe/ml64.exe в обычной IDE-шной версии студии (я так понимаю, в ней тоже должен быть скрипт vcvarsall.bat для возможности консольной работы с инструментами). Если это так и есть, то это очень здорово, и означает, что можно прямо вот так сходу сесть и написать крошечный exe-шник чисто на асме практически на любом виндовом компе, где есть студия (что весьма распространено среди разработчиков и не только).
Если запустить командную строку разработчика из Visual Studio, там есть ml.exe Также можно банально в студии компилировать .asm файлы
Dmitry_Milk, хидеры берите с пакета масм32 ; здесь немного инфы про плагин для подсветки и готовый проект шаблон https://habr.com/ru/articles/763636/
Почему нельзя собрать все в одном месте, чтобы .asm компилировался из батника? Сделать .html файл с информацией ключ -> действие для каждой утилиты.
Имеется в виду: чистая сборка masm 32-64, работающая на любой винде от 7 до 11. И чтобы была уверенность, что сборка без сюрпризов. Набор .exe, .dll, хедеров, и базовых примеров.
Обратитесь со своими пожеланиями в Microsoft. Ппока у них другое мнение, они запихали всё в студию. Здесь на сайте есть подробная инструкция где и что взять из студии и как это собрать в кучу.
bill_gates@microsoft.com? Если с днем благодарения их поздравить, быстрее вопрос решат? Лучше с наездом написать, чтобы подчеркнуть серьёзность и авторитет автора письма, или спокойно без претензий и угроз?
Вы шутите?) Негрософт от Си лет 20 как отказалась, винапи хочет убрать, перевести всех на дотнет и uwp или что там. А вы им про асм. Они категорически против "неуправляемого кода" уже лет так с 20.
Они всех подсадили на свои ide. В этом корень проблемы. Погромистам трудно проблему признать что это не удобно, и что реально написать чтото свое - кишка тонка, ведь тогда пошатнется их мания величия(столкновение с суровой реальностью), а это опять дискомфортно.
Целый цикл Сказки дядюшки Римуса о x64 написан на виндовом компе (сперва 64-разрядная XP, затем 7, затем 10). IDE в разделе IDE. Интегрированные среды разработки на любой вкус. А bat-ники и скрипты ― это уже зависит от ваших предпочтений...
К примеру, мне нужно чтобы при зажатом ctrl и клике на функцию в коде, открывалась новая вкладка, и показывался код с этой функцией: После клика: Сомневаюсь, что среди 'иде на любой вкус' есть хотябы это. Кроме вс кода, которая как раз от тех кто против 'неуправляемого кода'.