Пакет MASM64

Тема в разделе "WASM.X64", создана пользователем Mikl___, 26 ноя 2025.

  1. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    392
    E.D., это попытка(причём в правильном направлении), а не готовое, законченное решение, иначе оно было бы популярно, им бы пользовались.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.207
    rc.exe
    Утилита rc.exe запускается командной строкой:
    __RC__ [options]__file.rc___

    Параметр rc-файл указывает имя файла определения ресурса, содержащего имена, типы, имена файлов и описания ресурсов, которые необходимо скомпилировать.
    Ключи данной программы:
    КлючиДействие
    /?, /hОтображает список параметров командной строки
    /cОпределяет кодовую страницу, используемую преобразованием NLS
    /dОпределяет символ препроцессора, который можно протестировать с помощью директивы #ifdef
    Можно задать условное ветвление в файле скрипта ресурсов о том, определяется ли термин в командной строке RC с помощью вариант -D. Предположим, что в вашем приложении есть всплывающее окно меню, меню отладки, которое нужно появляться только во время отладка. Когда вы компилируете приложение для обычного использования, Меню отладки не включено. Ваш файл скрипта ресурсов содержит следующие операторы для определения меню отладки:
    Код (C):
    1. MainMenu MENU
    2. BEGIN
    3. ...
    4. #ifdef DEBUG
    5. POPUP &Debug
    6.   BEGIN
    7.   MENUITEM &Memory usage, ID_MEMORY
    8.   MENUITEM &Walk data heap, ID_WALK_HEAP
    9.   END
    10. #endif
    11. END
    При компиляции ресурсов для отладочной версии приложение, вы включаете меню отладки следующим образом команда:
    Код (Text):
    1. rc -R -D DEBUG myapp.rc
    Работа с именами файлов и путями
    КлючиДействие
    /fmИмя exe-файлаRC создает один языконезависимый RES-файл и один языкозависимый (MUI) RES-файл с помощью script-file. Этот параметр должен использоваться вместе с параметром /foИмя rc-файла. RC вызывает языконезависимый RES-файл resname.res и языкозависимый (MUI) RES-файл mresname.res
    /foИмя rc-файлаRC создает объект RES-файл с именем resname с помощью script-file. Если параметр /fmИмя exe-файла также задан, RC создает один RES-файл, не зависящий от языка, и один RES-файл, зависящий от языка (MUI).
    /xПредотвращает проверку INCLUDE переменной среды компилятором ресурсов (RC) при поиске файлов заголовков или файлов ресурсов
    /iВыполняет поиск указанного каталога перед поиском каталогов, указанных переменной среды INCLUDE. С помощью этой опции rc.exe ищет каталоги в следующей последовательности:
    1. Текущий каталог
    2. Каталог или каталоги, которые указаны с помощью /i в том порядке, в котором они появляются на командной строке
    3. Список каталогов, указанных INCLUDE переменная среды, в порядке, в котором переменная Перечисляет их, если только не указать опцию /x
    Оптимизация
    КлючиДействие
    /kovertypeПерекрывающиеся типы ресурсов, которые RC помещает как в независимые от языка RES-файлы, так и в зависящие от языка (MUI) RES-файлы. Типы ресурсов, указанные параметром /k, должны быть подмножеством тех, которые указаны параметром /j. Например, J2, J3, K3 указывает, что RC помещает тип ресурса 3 как в файлы, не зависящие от языка, так и в зависящие от языка (MUI) файлы. Если параметр /q также задан, этот параметр игнорируется, а сведения в файле конфигурации RC имеют приоритет
    Эта опция позволяет выбрать, оптимизирует ли RC ваши ресурсы для Предзагрузка.
    Отключает функцию оптимизации загрузки в rc. Если этот вариант не подойдёт, компилятор организует сегменты и ресурсы в исполняемом файле, чтобы вся предварительно загруженная информация оставалась непрерывной. Этот функция позволяет Windows быстрее загружать приложение.
    Без опции /K все сегменты данных, неотбрасываемые сегменты кода и сегмент кода входной точки будут предварительно загружены, если только какой-либо сегмент и информация о его перемещении превышает 64 КБ. Если атрибут PRELOAD не назначен этим параметрам сегментов в файле module-definition (.def), когда вы связываете свое приложение, компилятор добавит атрибут предзагрузки и отобразят предупреждение. Ресурсы и сегменты будут иметь один и тот же сегмент выравнивание. Это выравнивание должно быть как можно меньше, чтобы предотвратить Последний исполняемый файл не станет слишком большим. Вы можете Задайте выравнивание с помощью опции /alignment в линкере

    КлючиДействие
    /g1Если задано значение /g1, rc создает файл MUI, если единственный локализуемый ресурс, включенный в файл MUI, является ресурсом версии. Если параметр /g1 не задан, rc не создаст файл MUI, если единственный локализуемый ресурс, включенный в файл MUI, является ресурсом версии
    /jloctypeЛокализуемые типы ресурсов, которые RC размещает в зависимом от языка (MUI) файле .RES. Если параметр /q также задан, этот параметр игнорируется, а сведения в файле конфигурации RC имеют приоритет
    /llangidЗадает язык по умолчанию для компиляции. Например, -l409 эквивалентен включению следующей инструкции в верхней части файла скрипта ресурса: LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
    Дополнительные сведения см. в разделе "Идентификаторы языка"
    /nNull завершает все строки в строковой таблице
    /qMui.RCConfigФайл конфигурации RC, который соответствует формату файла конфигурации RC. Формат файла конфигурации RC позволяет компонентам самостоятельно описывать сведения о ресурсах, такие как управление версиями ресурсов, путь к файлу MUI, типы ресурсов и элементы. Этот файл указывает, какие ресурсы включаются в нейтральный по языку .RES файл, а какие ресурсы включаются в файл, зависящий от языка (MUI) .RES. Этот параметр и сведения, указанные в файле конфигурации RC, переопределяют параметры командной строки /j и /k.
    /rИгнорируется. Ключ /r оставлен для поддержки совместимости с существующими makefile файлами
    /uНе определен символ препроцессора
    /vОтображает сообщения, которые сообщают о ходе выполнения компилятора
    Обычно rc не отображает сообщения, сообщающие о его прогрессе по мере компиляции. Однако можно заставить компилятор отображать эти данные сообщения с этой опцией
    Ссылка:
    RC - Компилятор ресурсов - Digital Mars
     
    GRAFik нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.207
    Утилита h2inc.exe
     
    Последнее редактирование: 6 дек 2025
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.207
    Утилита bin2db64.exe
     
  5. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    392
    Предлагаю для начала нашего небольшого эксперимента сделать такую систему:

    1. Masm 64/32 (stable, safe) - которую не страшно будет запустить.
    2. Базовые примеры. Перед добавлением примера - согласуем.
    3. IDE. Интегрированные среды разработки (подключение).
    4. Базовые утилиты (с описанием их команд/функций) в .html/.txt.
    Критерий добавления - охват. Закрываем информационные пустоты.

    Сделать -> посетить места.

    Будем решать возникающие при этом проблемы по мере их [поступления].
    При этом нужно будет следить чтобы в sdk, obj, lib и т д не было скрытого исполняемого кода.
    --- Сообщение объединено, 5 мар 2026 ---
    Если дело сдвинется с мертвой точки. Будут собраны: 1. Masm 64/32 (stable, safe). 2. Базовые примеры.
    Предложу конструктивную помощь. До этого момента бессмысленно что-то обсуждать и заниматься мартышкиным трудом.
    --- Сообщение объединено, 5 мар 2026 ---
    32fd6f5cf8e6a397931b480b91b84834.jpg
    --- Сообщение объединено, 5 мар 2026 ---
    Для обмена файлами сборки предлагаю использовать гугл-диск там нужно будет в одном месте поставить галочку чтобы расшарить доступ.
     
    Последнее редактирование: 5 мар 2026
    GRAFik, Mikl___ и deepfacer нравится это.
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    410
    Кто решится поэксперементировать с MASM64/32 и Visual Studio совет(может кто не знает): скачать установщик с офицального сайта к нужной версии, а потом с помощью этого установщика, скачать себе какую-нибудь Visual Studio Professional 2022 или Enterprise 2022 (плюс от этого - можно выбрать нужное и не качать лишнего), а можно и на 2026 замахнуться, народ уже работает на ней. Где взять лекарство, я думаю, все знают, а кто не знает - подскажем, научим. :)

    И еще небольшое ИМХО - батники для компиляции делать максимально упрощёнными, типа:

    ml64 /c Proba_1_.asm

    link Proba_1_.obj kernel32.lib user32.lib /SUBSYSTEM:WINDOWS /entry:WinMain

    В VS - ещё пара строчек вверху добавится.
     
    Research нравится это.
  7. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    392
    Еще одна весомая причина сделать сборку - не выкачивать каждый раз мегатонны говна из интернета.

    1. Masm 64/32 (stable, safe) - которую не страшно будет запустить.
    2. IDE. Интегрированные среды разработки (подключение).
    3. Базовые примеры на ассемблере. Показывающие те или иные стороны/возможности.
     
    Последнее редактирование: 6 мар 2026
    deepfacer нравится это.
  8. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    410
    Я тоже раньше так думал, но потом оказалось, что VS "под боком" всё равно нужна, так почему её не задействовать в компиляции MASM64/32. Да и потом, ну сделает Mikl___ сборку, а завтра плюнет и не будет делать, а VS она всегда будет, а обновить её, а заодно и MASM64/32 - вообще, не проблема. И потом, в VS ведь можно и линковать asm-файлы с C/C++ проектом, полученые от MASM64/32. И отлаживать ассемблерный код на ней можно и подсветку синтаксиса организовать с помощью плагина. Так что, вес студии себя окупает, как оказалось, к моему удивлению. Попробуйте - вдруг вам понравится. :)
     
  9. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    392
    По моим ответам может показаться что мне понравится VS?
    Надо было еще больше сделать.
     
    Последнее редактирование: 6 мар 2026
    deepfacer нравится это.
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.207
    IMHO я против того, чтобы bat-файл был максимально упрощен. Bat-файл (опять же IMHO) должен быть один на всю систему и привязан к расширению asm. Под Windows из asm могут быть скомпилированы следующие файлы SYS, DLL, EXE-GUI и EXE-CONSOLE. Причем если уж вам так охота, то нужно еще разделить на Win64 и Win32. Bat-файл должен получить имя asm-файла и, желательно, в первой строке asm-файла должно быть указано, какой тип файла вы желали бы получить.

    Как это сделано в FASM

    С целью управления форматом сгенерированного кода FASM использует директиву "format". Директива "format", за которой следует идентификатор, позволяет выбрать формат выходного файла. Директива помещается в начало asm-файла. Формат выходного файла "по-умолчанию" ― простой двоичный файл (flat binary file), его также можно выбрать с помощью директивы "format binary". За этой директивой может следовать ключевое слово "as" и строка в кавычках, указывающая расширение для выходного файла. Если имя выходного файла не было указано в командной строке, ассемблер будет использовать это расширение при создании выходного файла с именем asm-файла.
    Директивы "use16" и "use32" заставляют ассемблер генерировать 16-разрядный или 32-разрядный код, опуская настройку по умолчанию для выбранного выходного формата. "use64" позволяет генерировать код для long mode режима x64.
    Ниже описаны различные выходные форматы с указаниями, специфичными для этих форматов:
    Формат выходного
    файла
    ДирективаПримечание
    простой двоичный файлformat binary
    MZ-COMuse16
    org 100h
    MZ-EXEformat MZПо умолчанию код собирается в 16-разрядном формате
    Portable Executable 32 разряда
    Windows приложенияformat PE CONSOLEмогут следовать дополнительные настройки формата
    format PE GUIмогут следовать дополнительные настройки формата
    format PE GUI DLLмогут следовать дополнительные настройки формата
    Windows kernel mode
    драйвера
    format PE NATIVEмогут следовать дополнительные настройки формата
    Portable Executable 64 разряда
    format PE64 CONSOLEмогут следовать дополнительные настройки формата
    format PE64 GUIмогут следовать дополнительные настройки формата
    Dinamic Link Libraryformat PE64 GUI DLLмогут следовать дополнительные настройки формата
    format PE64 NATIVEмогут следовать дополнительные настройки формата
    Executable and Linking Format (ELF) — формат исполняемых двоичных файлов, используемый в UNIX-подобных ОС
    format ELFбудет сгенерирован 32-разрядный код
    format ELF64будет сгенерирован 64-разрядный код
    Common Object File Format (COFF) — формат исполняемых файлов, файлов объектного кода и динамических библиотек
    format MS COFFбудет сгенерирован 32-разрядный код
    format MS64 COFFбудет сгенерирован 64-разрядный код
    Unified Extensible Firmware Interface (UEFI) — «единый расширяемый интерфейс программного обеспечения» — интерфейс между ОС и микропрограммами, управляющими низкоуровневыми функциями оборудования
    format EFI
    format EFIboot
    format EFIruntime
    Windows SubsystemValue
    (hex)
    DescriptionПример
    IMAGE_SUBSYSTEM_NATIVE1Device drivers and native Windows processesformat PE native
    IMAGE_SUBSYSTEM_WINDOWS_GUI2The Windows graphical user interface subsystemformat PE GUI
    IMAGE_SUBSYSTEM_WINDOWS_CUI3The Windows character subsystemformat PE console
    IMAGE_SUBSYSTEM_EFI_APPLICATION0xAAn Extensible Firmware Interface applicationformat EFI
    IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER0xBAn EFI driver with boot servicesformat EFIboot
    IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER0xCAn EFI driver with run-time servicesformat EFIruntime
    format PE GUI 4.0 DLL at 7000000h on 'stub.exe'

    • сперва ключевое слово для настройки целевой подсистемы
    • далее могут следовать минимальная версия системы, под которую написано приложение и ее подверсия (версия и подверсией будут разделены точкой)
      • ключевое слово "DLL" создает файл вывода как динамически подключаемую библиотеку (Dinamic Link Library)
      • ключевое слово "WDM" создает файл вывода как Windows Driver Model (WDM-драйвер)
      • ключевое слово "large" отмечает, что приложение может работать с адресами, размер которых свыше 2 гигабайт
      • ключевое слово "NX" сигнализирует, что у исполняемого файла есть ограничению на исполнение кода, находящегося в неисполняемых разделах (сегменты данных, стека, ресурсах и т.п.), запрет исполнения, добавленный в таблицы страниц для предотвращения выполнения данных как кода. Используется для предотвращения уязвимости типа «переполнение буфера», позволяющей выполнять вредоносный код.
      • Далее может следовать оператор "at" и числовое выражение, указывающее адрес базового образа PE файла
      • Далее опционально может следовать оператор "on" со следующей за ним строкой в кавычках, содержащей имя файла, являющимся MZ-stub для PE программы (если указанный файл не в формате MZ, то он трактуется как простой двоичный исполняемый файл и конвертируется в формат MZ). По умолчанию код для этого формата 32-разрядный
    • Для выбора формата Common Object File Format используйте:
      • директиву "format COFF или "format MS COFF", зависит от того, хотите ли вы создать классический (DJGPP) или Microsoft-ский вариант файла COFF. Настройка кода по умолчанию для этого формата — 32-разрядная.
      • Для создания файла в формате Microsoft COFF для архитектуры x64 используйте "format MS64 COFF" в таком случае по умолчанию будет сгенерирован код для long mode.
     
    Последнее редактирование: 6 мар 2026
    GRAFik нравится это.
  11. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    410
    Коль уж речь зашла по FASM, хотел попутно поинтересоваться. А в MASM что-то подобное, наверное, не получится скомпилировать? MASM же бинарный формат не генерирует ? Или я что-то недопонимаю ?

    Код (ASM):
    1. ; PE Format Walkthrough
    2. ; http://sulaiman.thefreebizhost.com
    3. ; Created by : Sulaiman Chang
    4.  
    5. ; References:
    6. ; 1. Create PE from scratch http://flatassembler.net/viewtopic.php?t=1309
    7. ; 2. LUEVELSMEYER's description about PE file format
    8. ; 3. Microsoft PSDK July 2000 Edition
    9. ; 4. Iczelion's PE Tutorial
    10.  
    11. IMAGE_DOS_HEADER:                ;start : 00 (0) to 3F (63)
    12.     .e_magic    dw    0x5A4D        ;00 01
    13.     .e_cblp dw    0x0080        ;02 03
    14.     .e_cp        dw    0x0001        ;04 05
    15.     .e_crlc dw    0x0000        ;06 07
    16.     .e_cparhdr    dw    0x0004        ;08 09
    17.     .e_minalloc    dw    0x0010        ;10 11
    18.     .e_maxalloc    dw    0xFFFF        ;12 13
    19.     .e_ss        dw    0x0000        ;14 15
    20.     .e_sp        dw    0x0140        ;16 17
    21.     .e_csum dw    0x0000        ;18 19
    22.     .e_ip        dw    0x0000        ;20 21
    23.     .e_cs        dw    0x0000        ;22 23
    24.     .e_lfarlc    dw    0x0040        ;24 25
    25.     .e_ovno dw    0x0000        ;26 27
    26.     .e_res        rw    4        ;28 29 | 30 31 | 32 33 | 34 35
    27.     .e_oemid    dw    0x0000        ;36 37
    28.     .e_oeminfo    dw    0x0000        ;38 39
    29.     .e_res2 rw    10        ;40 41 | 42 43 | 44 45 | 46 47 | 48 49 | 50 51
    30.     .e_lfanew    dd    0x00000080    ;52 53 | 54 55 | 56 57 | 58 59
    31.                         ;60 61 62 63
    32. ;=====================================================================================================
    33. DOS_STUB:                ;start : 40 (64) to 7F (127)
    34.     use16                ;DOS-STUB is a 16-bit program
    35.                     ;push    cs <- we save 1 byte here
    36.                     ;pop    ds <- we save another 1 byte here
    37.                     ;our DS is less 100h from CS, DS received PSP address
    38.     mov    dx,0x100 + 0x0B ;our db message starts at 0x0B because we save 3 bytes already
    39.     mov    ah,0x9
    40.     int    0x21
    41.     mov    ah,0x4C     ;save 1 byte here because we need to use AH only for function
    42.     int    0x21
    43.    
    44.     db    'This program cannot be run in DOS mode.',13,10,'$'
    45.  
    46.     rb    0x80 - $        ;0x80 - 0x75 = rb 0xB
    47. ;=====================================================================================================
    48. IMAGE_NT_HEADERS:                    ;start : 80 (128) to 1EF (495)
    49.     .Signature        db    'PE',0,0    ;128 131
    50.    
    51.  
    52.     IMAGE_FILE_HEADER:                ;start : 84 (132) to 97 (151)
    53.         .Machine                dw    0x014C        ;132 133 for intel 386
    54.         .NumberOfSection            dw    0x0003        ;134 135
    55.         .TimeDateStamp            dd    %t        ;136 139
    56.         .PointerToSymbolTable        dd    0        ;140 143
    57.         .NumberOfSymbols            dd    0        ;144 147
    58.         .SizeOfOptionalHeader        dw    0x00E0        ;148 149
    59.         .Characteristic         dw    0x818F        ;150 151
    60.    
    61.  
    62.     IMAGE_OPTIONAL_HEADER:            ;start    : 98 (152) to F7 (247) * till IMAGE_DATA_DIRECTORY
    63.                                         ;offset
    64.         .Magic                    dw    0x010B        ;152 153
    65.         .MajorLinkerVersion            db    0x01        ;154
    66.         .MinorLinkerVersion            db    0x37        ;155
    67.         .SizeOfCode                dd    0        ;156 159
    68.         .SizeOfInitializedData        dd    0        ;160 163
    69.         .SizeOfUninitializedData        dd    0        ;164 167
    70.         .AddressOfEntryPoint            dd    0x2000        ;168 171 = base + 2000 = 402000 (.code section)
    71.         .BaseOfCode                dd    0        ;172 175
    72.         .BaseOfData                dd    0        ;176 179
    73.         .ImageBase                dd    0x00400000    ;180 183 (default)
    74.         .SectionAlignment            dd    0x00001000    ;184 187 4096 bytes
    75.         .FileAlignment            dd    0x00000200    ;188 191 512 bytes (default)
    76.         .MajorOperatingSystemVersion    dw    1        ;192 193
    77.         .MinorOperatingSystemVersion    dw    0        ;194 195
    78.         .MajorImageVersion            dw    0        ;196 197
    79.         .MinorImageVersion            dw    0        ;198 199
    80.         .MajorSubsystemVersion        dw    4        ;200 201
    81.         .MinorSubsystemVersion        dw    0        ;202 203
    82.         .Win32VersionValue            dd    0        ;204 207
    83.         .SizeOfImage                dd    0x00004000    ;208 211
    84.         .SizeOfHeaders            dd    0x00000200    ;212 215
    85.         .CheckSum                dd    0x0000EF20    ;216 219
    86.         .Subsystem                dw    2        ;220 221 IMAGE_SUBSYSTEM_WINDOWS_GUI
    87.         .DllCharacteristics            dw    0        ;222 223
    88.         .SizeOfStackReserve            dd    0x00001000    ;224 227 4096 bytes
    89.         .SizeOfStackCommit            dd    0x00001000    ;228 231 4096 bytes
    90.         .SizeOfHeapReserve            dd    0x00100000    ;232 235 1048576 bytes
    91.         .SizeOfHeapCommit            dd    0        ;236 239
    92.         .LoaderFlags                dd    0        ;240 243
    93.         .NumberOfRvaAndSizes            dd    0x10        ;244 247 16 decimal
    94.        
    95.         IMAGE_DATA_DIRECTORY:        ;start : F8 (248) to 177 (375) * till IMAGE_SECTION_TABLE
    96.             rq    1            ;248 255
    97.             .ImportTableVA        dd    0x00003000        ;256 263
    98.             .ImportTableSize        dd    0x00000090
    99.             rq    14            ;we don't need them also    ;263 + 112 = 375
    100.  
    101.         IMAGE_SECTION_TABLE:                            ;start : 178 (376) to 1EF (495)
    102.             SECTION_1:
    103.                 .Name                dq    '.data' ;start : 178 (376)
    104.                 .VirtualSize            dd    0x0000001D
    105.                 .VirtualAddress     dd    0x00001000    ;-> in memory, it is 401000
    106.                 .SizeOfRawData        dd    0x00000200
    107.                 .PointerToRawData        dd    0x00000200    ;-> in our file, it is 0x200 (512) (offset from zero)
    108.                 .PointerToRelocations    dd    0
    109.                 .PointerToLineNumbers    dd    0
    110.                 .NumberOfRelocations        dw    0
    111.                 .NumberOfLineNumbers        dw    0
    112.                 .Characteristic     dd    0xC0000040    ;end   : 19F (415)
    113.             SECTION_2:
    114.                 .Name                dq    '.code' ;start : 1A0 (416)
    115.                 .VirtualSize            dd    0x0000001C
    116.                 .VirtualAddress     dd    0x00002000    ;-> in memory, it is 402000
    117.                 .SizeOfRawData        dd    0x00000200
    118.                 .PointerToRawData        dd    0x00000400    ;-> in our file, it is 0x400 (1024) (offset from zero)
    119.                 .PointerToRelocations    dd    0
    120.                 .PointerToLineNumbers    dd    0
    121.                 .NumberOfRelocations        dw    0
    122.                 .NumberOfLineNumbers        dw    0
    123.                 .Characteristic     dd    0x60000020    ;end   : 1C7 (455)
    124.             SECTION_3:
    125.                 .Name                dq    '.idata'    ;start : 1C8 (456)
    126.                 .VirtualSize            dd    0x00000090
    127.                 .VirtualAddress     dd    0x00003000    ;-> in memory, it is 403000
    128.                 .SizeOfRawData        dd    0x00000200
    129.                 .PointerToRawData        dd    0x00000600    ;-> in our file, it is 0x600 (1536) (offset from zero)
    130.                 .PointerToRelocations    dd    0
    131.                 .PointerToLineNumbers    dd    0
    132.                 .NumberOfRelocations        dw    0
    133.                 .NumberOfLineNumbers        dw    0
    134.                 .Characteristic     dd    0x40000040    ;end   : 1EF (495)
    135. ;                                                   |
    136. ;our SECTION_1 <PointerToRawData> points at 0x200 or (512) bytes from zero           |
    137. ;since we are currently in file offset 1EF  -------------------------------------------+
    138. ;we need to "rb 0xF" or "rq 2" so that our address from 1F0 to 1FF are filled.
    139.             rq    2                            ;start : 1F0 (496) to 1FF (511)
    140.            
    141.             ;file offset   = 0x200
    142.             ;memory offset = 0x401000 = (IMAGE_OPTIONAL_HEADER.ImageBase) + (SECTION_1.VirtualAddress)
    143.             ;=========================================================================================
    144.             SECTION_1_RAW_DATA:                        ;start : 200 (512) to 3FF (1023)
    145.             org 0x401000
    146.                 msgText db    'Message Text',0        ;\  ;512 524
    147.                                             ; } we use 1D (29) bytes here
    148.                 msgCaption    db    'Message Caption',0        ;/  ;525 540
    149.                
    150.                 ; 541 to 1023 should be filled
    151.                 ; (1023 - 541) + 1 = 483 bytes
    152.                
    153.                 ; we NEED to + 1 because 1023 is not INCLUDED when
    154.                 ; we use it to minus 541.
    155.                 rb    483                ;because our .code raw data start at 400 (1024)
    156.                                     ;and because our IMAGE_OPTIONAL_HEADER > FileAlignment is 0x200 (512) bytes
    157.  
    158.             ;file offset   = 0x400
    159.             ;memory offset = 0x402000 = (IMAGE_OPTIONAL_HEADER.ImageBase) + (SECTION_2.VirtualAddress)
    160.             ;=========================================================================================
    161.             org 0x2000
    162.             SECTION_2_RAW_DATA:                            ;start : 400 (1024) to 5FF (1535)
    163.                 use32                                ;we are using 32-bit instruction
    164.                 push    0x40            ;6A 40                ;MB_OK + MB_ICONASTERIK + MB_APPLMODAL
    165.                 push    msgCaption        ;68 0D 10 40 00     ;push msgCaption
    166.                 push    msgText     ;68 00 00 40 00     ;push msgText
    167.                 push    0            ;6A 00                ;push HWND_DESKTOP
    168.                 call    dword [0x0040307A]    ;FF 15 7A 30 40 00        ;call MessageBoxA
    169.                 push    0            ;6A 00                ;push zero for ExitProcess parameter
    170.                 call    dword [0x0040305C]    ;FF 15 5C 30 40 00        ;call ExitProcess
    171.                
    172.                 ;we have used 1C (28) bytes here
    173.                 ;1052 to 1535 should be filled
    174.                 ;(1535 - 1052) + 1 = 484 bytes
    175.                 rb    484
    176.  
    177.             ;file offset   = 0x600
    178.             ;memory offset = 0x403000 = (IMAGE_OPTIONAL_HEADER.ImageBase) + (SECTION_3.VirtualAddress)
    179.             ;=========================================================================================
    180.             org 0x3000
    181.             SECTION_3_RAW_DATA:                        ;start : 600 (1536) to 7FF (2047)
    182.                 IMAGE_IMPORT_DESCRIPTOR_1:
    183.                     .OriginalFirstThunk    dd    0x00003054    ;3000 3003
    184.                     .TimeDateStamp    dd    0        ;3004 3007
    185.                     .ForwarderChain dd    0        ;3008 300B
    186.                     .Name            dd    0x0000303C    ;300C 300F
    187.                     .FirstThunk        dd    0x0000305C    ;3010 3013
    188.                 IMAGE_IMPORT_DESCRIPTOR_2:
    189.                     .OriginalFirstThunk    dd    0x00003072    ;3014 3017
    190.                     .TimeDateStamp    dd    0        ;3018 301B
    191.                     .ForwarderChain dd    0        ;301C 301F
    192.                     .Name            dd    0x00003049    ;3020 3023
    193.                     .FirstThunk        dd    0x0000307A    ;3024 3027
    194.                
    195.                         ;terminated with IMAGE_IMPORT_DESCRIPTIOR that filled with 0 zeros
    196.                 rd    5    ;the structure size of IMAGE_IMPORT_DESCRIPTOR
    197.                                             ;3028 to 303B
    198.                
    199.             ;Our DLL Name
    200.             .KERNEL32    db    'KERNEL32.DLL',0            ;303C to 3048
    201.             .USER32 db    'USER32.DLL',0            ;3049 to 3053
    202.  
    203.             IMAGE_THUNK_DATA32_1:
    204.                 .ForwarderString    dd    0x00003064        ;3054 3057
    205.                 .Function        dd    0            ;3058 305B
    206.                 .Ordinal        dd    0x00003064        ;305C 305F
    207.                 .AddressOfData    dd    0            ;3060 3063
    208.  
    209.                 IMAGE_IMPORT_BY_NAME_1:
    210.                     .Hint        dw    0            ;3064 3065
    211.                     .Name        db    'ExitProcess',0 ;3066 3071
    212.  
    213.             IMAGE_THUNK_DATA32_2:
    214.                 .ForwarderString    dd    0x00003082        ;3072 3075
    215.                 .Function        dd    0            ;3076 3079
    216.                 .Ordinal        dd    0x00003082        ;307A 307D
    217.                 .AddressOfData    dd    0            ;307E 3081
    218.  
    219.                 IMAGE_IMPORT_BY_NAME_2:
    220.                     .Hint        dw    0            ;3082 3083
    221.                     .Name        db    'MessageBoxA',0 ;3084 308F
    222.  
    223.             ;308F = 143 bytes used
    224.             ;must filled 2047 - (1536 + 143) = 368 + 1 = 369 bytes
    225.             rb 367
    226.             db 0
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.207
    GRAFik,
    лучше о таких вещах спрашивать в отдельных топиках, но отвечу.
    MASM генерирует бинарный файл, это COM, но для этого нужен linker старой версии. Или можно использовать FASM, NASM, PoAsm. А конкретно в этом исходнике 32-разрядный PE с ExitProcess, MessageBoxA с заголовком и импортом. Exe в 369 байт. У меня есть такая же фигня в 96 байт
     
  13. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    410
    Т.е. если взять линкер старой версии и скомпилировать COM-файл, то можно получить такой же исполняемый PE-файл как у FASM в примере, который я запостил выше?
     
  14. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    392
    Можно добавить в примеры для ассемблера, чтобы каждый мог скомпилировать этот ехе сам из исходника.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.207
    GRAFik, да...
    Research,
    добавлю. А сейчас давайте вернемся к главной теме. К bat-файлу. К тому, что написано выше, вопросы, предложения, опровержения, возражения есть?
     
  16. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    392
    С bat файлом легко определится когда есть примеры для компиляции и safe-stable сборка.
    Что целесообразно в .bat добавить а что не целесообразно относительно результата.

    Можно сделать следующим образом: я на windows 7 скачиваю vs. И кто-то еще независимо от меня скачивает vs. Потом с помощью форума оттуда из vs вытаскиваются нужные файлы и сравнивается их хэш. Если хэши у обоих людей совпали значит ничо не добавлялось. Делается это всего 1 раз. И вместе с файлами в txt и здесь на форуме сохраняются правильные хэши.

    Нужно 2 человека с windows 7. Откуда будем скачивать vs?
     
    Последнее редактирование: 6 мар 2026
  17. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    410
    У меня лично никаких возражений нет. Просто я подумал, что новичкам для входа в тему, нужно и в ассемблер вникать, да ещё и с премудростями bat-файлов разбираться. Ну, я думаю, кому нужно разберуться. Так-то там ничего такого сверхсложного нет.
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.207
    Как когда-то сказал Инди-Клерк у ассемблера достаточно высокий порог вхождения. Так что, если кому-то нужно → придется разбираться...
    Если вопросов, предложений, опровержений, возражений пока нет, то первое что понадобится, это создать ассоциации asm-файлов с файлом asm.bat Чтобы не повторяться, посмотрите как это делается в Сказках дядюшки Римуса о x64 → глава первая, → Братец Кролик создает ассоциации ассемблерных файлов с файлом asm.bat
     
  19. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    392
    Сделал небольшую программу для подсчета хеша файлов. Чтобы проверить сборки ms файлов.
    Работает без установки доп. библиотек, нужен только установленный python.

    Это самый неприятный этап, но он неизбежность и его нужно пройти.

    Чтобы каждый мог проверить что файлы компилятора и т.д. чистые.

    Код (Text):
    1. import hashlib
    2. from tkinter import Tk, messagebox
    3. from tkinter.filedialog import askopenfilename
    4.  
    5. def print_s(s1, s2):
    6.     messagebox.showinfo(s1, s2)
    7.  
    8. def ShowMessage(s):
    9.     print_s("MessageBox", s)
    10.  
    11. def OpenFile(file_name, ext):
    12.     Tk().withdraw()
    13.     files = [('All Files', '*.*'), (f"All {ext}", f"*.{ext}")]
    14.     return askopenfilename(initialfile="", initialdir=file_name,
    15.                            filetypes=files, defaultextension=f".{ext}")
    16.  
    17. def compute_file_hash(filename, algorithm='sha256', blocksize=8192):
    18.     hash_obj = hashlib.new(algorithm)
    19.     with open(filename, 'rb') as f:
    20.         while data := f.read(blocksize):
    21.             hash_obj.update(data)
    22.     return hash_obj.hexdigest()
    23.  
    24. if __name__ == "__main__":
    25.     filename = OpenFile('', '*')
    26.     algo = 'sha256'
    27.     file_hash = compute_file_hash(filename, algo)
    28.     ShowMessage(f"Хеш ({algo}) файла '{filename}': {file_hash}")
    Могу сделать чтобы хэши и имена файлов сохранялись в текстовый файл. Чтобы проще было проверять.

    Жду ссылку откуда будем скачивать vs и список файлов который будем экспортировать.

    На этом непростом этапе будем проверять совместимость с другими версиями Win.

    После того как появится нормальная сборка можно обсуждать формат bat файла. От простого к сложному.

    Есть такая ссылка:
    https://learn.microsoft.com/en-us/cpp/assembler/masm/masm-for-x64-ml64-exe?view=msvc-170

    На ней есть:
    https://learn.microsoft.com/en-us/visualstudio/install/install-visual-studio

    Предлагается скачать Visual Studio 2026. Есть сомнения что она пойдет на win 7.
    --- Сообщение объединено, 6 мар 2026 ---
    Финальная в версия с сохранением информации в файл. Этого будет достаточно:
    Код (Text):
    1. import hashlib, os
    2.  
    3. from tkinter import Tk, messagebox
    4. from tkinter.filedialog import askopenfilename
    5.  
    6. def print_s(s1, s2):
    7.     messagebox.showinfo(s1, s2)
    8.  
    9. def ShowMessage(s):
    10.     print_s("MessageBox", s)
    11.  
    12. def WriteStr(filename, Str):
    13.     with open(filename, "a", encoding="utf-8") as f:
    14.         f.write(Str)
    15.      
    16. def ExtractFileName(file_name):
    17.     return os.path.basename(file_name)
    18.  
    19. def OpenFile(file_name, ext):
    20.     Tk().withdraw()
    21.     files = [('All Files', '*.*'), (f"All {ext}", f"*.{ext}")]
    22.     return askopenfilename(initialfile="", initialdir=file_name,
    23.                            filetypes=files, defaultextension=f".{ext}")
    24.  
    25. def compute_file_hash(filename, algorithm='sha256', blocksize=8192):
    26.     hash_obj = hashlib.new(algorithm)
    27.     with open(filename, 'rb') as f:
    28.         while data := f.read(blocksize):
    29.             hash_obj.update(data)
    30.     return hash_obj.hexdigest()
    31.  
    32. if __name__ == "__main__":
    33.     algo = 'sha256'
    34.     filename = OpenFile('', '*')
    35.     file_hash = compute_file_hash(filename, algo)
    36.     ShowMessage(f"Хеш ({algo}) файла '{filename}': {file_hash}")
    37.     WriteStr("output.txt", f"{ExtractFileName(filename)}:{file_hash}\n")
    --- Сообщение объединено, 6 мар 2026 ---
    Когда будет раздражать вывод ShowMessage каждый раз, его можно закоментировать.
     
    Последнее редактирование: 6 мар 2026
  20. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    569
    Я обычно проще делаю
    Код (Text):
    1. ml64 Proba_1_.asm /link kernel32.lib user32.lib /SUBSYSTEM:WINDOWS /entry:WinMain
    - два раза имя не придется писать

    И еще использую директивы includelib прямо в asm-файле, тогда (особенно если утилита консольная) вообще остается только точку входа указывать.

    Жаль, что как в masm32 нельзя ее указать прямо возле end.
     
    Последнее редактирование: 6 мар 2026