Пакет MASM64

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

  1. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Открыть в нех-редакторе, увидеть сигнатуру 'MZ' и догадаться, что это PE-файлы, не пожатые даже expand'ом. Просто вытащенные из cab'ов. Две версии ml64 это x86 и x64 версии. Остается отобрать нужные и переименовать.
     
    Mikl___ нравится это.
  2. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    455
    2026-03-07_05-45-14.png
    2008 студия. Кстати после 2012 весь софт у них какой-то всратый. Чем дальше тем хуже.
    Еще бы .lib файлы с оригинальной студии достать. Много директорий с ними, хз какая правильная.
    Вы когда .asm файлы компилируете их переименовывайте. Потом обратно переименовывайте?
     
    Последнее редактирование: 7 мар 2026
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    У меня фасм сам знает какое имя и расширение файла выбрать. А в фасм.г можно даже вписать имя выхлопного файла. Только контрол-ф9 давишь и все. Сортировка отобранных файлов это другой этап, где желательно тестировать приложение, я на себя такую обязанность не брал. Опять же чем первозданней вид файла, тем менее страшно запускать, не?
     
  4. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    455
    Код (Text):
    1. :: очистка экрана
    2. cls
    3. :: имя asm-файла без расширения
    4. set filename=1
    5. :: здесь путь к папке masm64, у Вас он может быть другим
    6. set masm64_path=..\masm64\
    7. :: если существует exe-файл с таким же именем ? удаляем его
    8. if exist %filename%.exe del %filename%.exe
    9. :: компиляция
    10. :: если во время компиляции будут ошибки, тогда они будут перечислены в файле errors.txt
    11. %masm64_path%bin\ml64 /c %filename%.asm >> errors.txt
    12. :: обнаружены ошибки компиляции ? выходим
    13. if errorlevel 1 exit
    14. :: линковка
    15. :: если во время линковки будут ошибки ? тогда они будут перечислены в файле errors.txt
    16. %masm64_path%bin\link /SUBSYSTEM:WINDOWS /entry:WinMain %filename%.obj >> errors.txt
    17. :: обнаружены ошибки линковки ? выходим
    18. if errorlevel 1 exit
    19. :: раз мы здесь ? значит ошибок нет ? удаляем "программный мусор"
    20. del %filename%.obj
    21. del errors.txt
    22. pause
    2026-03-07_05-58-52.png
    Там цифровые подписи есть. Без них было бы страшно.
    Речь не о фасме. Надо масм64 собрать.
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    masm64\bin64\ml64.exe (FL_ml64_exe_105147_105147_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8)
    masm64\bin64\link.exe (FL_link_exe_105145_105145_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8)
    masm64\bin64\mspdb80.dll (FL_mspdb80_dll_107301_____X86.3643236F_FC70_11D3_A536_0090278A1BB8 из 2005 студии, в 2008 не нашел)
    конпилят такой файл
    Код (Text):
    1. .code
    2. mainCRTStartup proc
    3.    ret
    4. mainCRTStartup endp
    5. end    
    таким батом
    Код (Text):
    1. @echo off
    2. set appname=1
    3. del %appname%.obj
    4. del %appname%.exe
    5. masm64\bin64\ml64.exe /c  %appname%.asm
    6. masm64\bin64\link.exe /SUBSYSTEM:CONSOLE /MACHINE:X64 /nologo /LARGEADDRESSAWARE %appname%.obj
     
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    418
    Похоже, что Microsoft прикрыли лавочку с свободным скачиванием платных версий, с ограничением по времени, без регистации. Возможно, что если зарегистрироваться у них на сайте, то скачивание платной версии и получися - не пробовал, ничего не могу сказать.

    У меня остались официальные, лично мной скачанные, установщики к VS 2017 Pro и к VS2022 Pro. Сейчас попробовал всё работает и скачивается без проблем. Могу скинуть куда-нибудь, если кому-нибудь нужно.Не думаю, что там какая-нибудь привязка по IP или ещё что-нибудь.
     
  7. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    455
    Здесь файлы с 2008 студии.
    https://www.sendspace.com/file/wfrr0j
    В masm64, если я правильно все понял рипнут полный набор файлов.
    В bin в первозданном виде все файлы студии. Оттуда можно рипать файлы для masm32.

    Заголовочные файлы на первое время скачивал отсюда https://dsmhelp.narod.ru/masm64.zip

    У нас есть 31 + уроков по масму64. С ехе разобрались. Сейчас не понятно что с .bat файлами.

    Проблему с рантаймами я скорее всего преувеличил. Если возникнет - будем думать.

    Есть один торрент, там можно скачать много разных версий. В том числе 2008 англ/ру.

    2026-03-07_07-50-37.png
     
    Последнее редактирование: 7 мар 2026
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Кстати если уж тягаться в удобстве с фасмом, можно пару директив в начале файла указывать комментарием, а вместо бата парсить файл нормальным интерпретатором типа питона. Таким образом исходник может содержать всю исчерпывающую информацию для сборки.
     
  9. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    455
    Например?
     
  10. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    418
    Research, извиняюсь за ложную тревогу - перепутал файлы. :)
     
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Код (Text):
    1. ;rc rsrc.rc
    2. ;cvtres /machine:ix86 rsrc.res
    3. ;ml64 /c /Zd /coff 1.asm
    4. ;ml64 /c /Zd /coff 2.asm
    5. ;ml64 /c /Zd /coff 3.asm
    6. ;ml64 /c /Zd /coff 4.asm
    7. ;link /SUBSYSTEM:CONSOLE 1.obj 2.obj 3.obj 4.obj rsrc.obj
    Например парсер находит по операторам 'rc', 'cvtres', 'ml64' и 'link' нужные строки, передает cmd.exe, забирая выхлоп и ошибки. При отсутствии нужных директив - выполняет дефолтное 'ml64 + link' с дефолтными параметрами. При отсутствии имени файла в строке, подставляет имя исходника с нужным расширением:
    Код (Text):
    1.  
    2. ;ml64 /c
    3. ;link /SUBSYSTEM:CONSOLE
    Вообще вываливать выхлоп во временный файл нерационально, нормальный интерпретатор может куда угодно выхлоп передать, не шатая ресурс накопителя:
    изображение_2026-03-07_095949032.png
     
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.223
    Research,
    set filename=1 <---Здесь ошибка должно быть set filename=%~n1. В командной строке asm.bat Hello.asm переменная %0 в bat-файле соответствует нулевому аргументу командной строки, т.е. имени самого bat-файла. Дальше bat-файл разворачивает %~n1 в имя файла без расширения asm. Потом переменная %filename% будет использована с расширениями obj, exe, dll или sys
     
  13. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    455
    Теперь есть bin, lib, include.

    Далее кладем их на диск c: в masm64:
    2026-03-08_00-55-34.png
    2026-03-08_00-55-53.png

    Выбираем один из уроков:
    2026-03-08_00-58-00.png

    Ии....

    2026-03-08_00-55-21.png
    --- Сообщение объединено, 8 мар 2026 ---
    Вообще созрела одна идея. Я понял как должно быть. Для обхода всех неудобств будет одно единственное неудобство - нужно будет установить python. В основе вероятнее всего будут файлы с 2008 студии. Бессмысленно изобретать велосипед и искать чтото еще в других версиях vs.

    Попозже напишу скрипт, как должно быть, для максимального удобства.
    Скрипт кладется рядом с .asm файлами которые нужно будет собрать в .exe/.dll/ и т. д.
    --- Сообщение объединено, 8 мар 2026 ---
    Нужно добавить в build_asm.py:

    masm64_path
    ml64.exe
    link

    ...
    --- Сообщение объединено, 8 мар 2026 ---
    чтобы выбрать tut_03.asm нужно нажать два раза build_asm.py, внутри него написать цифру 2, и нажать enter. Вместо .bat файлов рядом с .asm копируется build_asm.py
    2026-03-08_01-33-10.png 2026-03-08_01-33-10.png
    --- Сообщение объединено, 8 мар 2026 ---
    Сейчас не понятно что с .bat файлами.
    --- Сообщение объединено, 8 мар 2026 ---
    Сделал более наглядный пример зачем нужен build_asm.py
    Имя .asm файла при его выборе из нескольких .asm файлов будет выводиться в MessageBox
    Код (Python):
    1. from ctypes import wintypes, windll
    2.  
    3. ##--------------------------------------------------------
    4.  
    5. def ShowMessage(s):
    6.     MessageBox = windll.user32.MessageBoxW
    7.     MessageBox(None, str(s), "", 0x00000040)
    8.  
    9. ##--------------------------------------------------------
    --- Сообщение объединено, 8 мар 2026 ---
    См. build_asm2
     

    Вложения:

    • build_asm.rar
      Размер файла:
      587 байт
      Просмотров:
      74
    • build_asm2.rar
      Размер файла:
      3,4 КБ
      Просмотров:
      73
    • build_asm2.rar
      Размер файла:
      3,4 КБ
      Просмотров:
      71
    Последнее редактирование: 8 мар 2026
  14. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    160
    Mikl___, f13nd, GRAFik,

    1587913270122520932.jpg

    Пытаюсь собрать tut_01 сырым скриптом из говна и палок:

    Код (Python):
    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3.  
    4. import os
    5. import sys
    6. import subprocess
    7. import argparse
    8. import glob
    9.  
    10. def find_files(path, ext):
    11.     return glob.glob(os.path.join(path, "*" + ext))
    12.  
    13. def select_file(ext):
    14.     files = find_files(".", ext)
    15.     if not files:
    16.         print(f"No {ext} files found in current directory.")
    17.         sys.exit(1)
    18.     print("Available files:")
    19.     for i, f in enumerate(files, 1):
    20.         print(f"{i}. {f}")
    21.     while True:
    22.         try:
    23.             choice = int(input("Enter number: "))
    24.             if 1 <= choice <= len(files):
    25.                 return files[choice-1]
    26.             else:
    27.                 print("Invalid number.")
    28.         except ValueError:
    29.             print("Please enter a number.")
    30.  
    31. def main():
    32.     parser = argparse.ArgumentParser(description="Build MASM64 assembly file.")
    33.     parser.add_argument("filename", nargs="?", help="Assembly file name (without .asm or with)")
    34.     parser.add_argument("--masm64-root", help="Root directory of MASM64 (default: C:\\masm64)")
    35.     parser.add_argument("--ml64", help="Path to ml64.exe")
    36.     parser.add_argument("--link", help="Path to link.exe")
    37.     parser.add_argument("--rc", help="Path to RC.exe")
    38.     parser.add_argument("--stub", help="Path to stubby.exe")
    39.     parser.add_argument("--include", help="Include directory")
    40.     parser.add_argument("--lib", help="Lib directory")
    41.     parser.add_argument("--entry", default="WinMain", help="Entry point (default: WinMain)")
    42.     parser.add_argument("--subsystem", default="WINDOWS", help="Subsystem (default: WINDOWS)")
    43.     parser.add_argument("--keep", action="store_true", help="Keep intermediate .obj and .res files")
    44.     parser.add_argument("--no-largeaddressaware", action="store_true", help="Remove /LARGEADDRESSAWARE:NO (default: add it)")
    45.     args = parser.parse_args()
    46.  
    47.     # Определяем корневой путь MASM64
    48.     if args.masm64_root:
    49.         masm64_root = args.masm64_root
    50.     else:
    51.         masm64_root = os.environ.get("MASM64_ROOT", "C:\\masm64")
    52.  
    53.     # Формируем пути с приоритетом: аргумент > переменная окружения > значение по умолчанию из корня
    54.     def get_path(arg, env_var, default_rel):
    55.         if arg:
    56.             return arg
    57.         env = os.environ.get(env_var)
    58.         if env:
    59.             return env
    60.         return os.path.join(masm64_root, default_rel)
    61.  
    62.     ml64_path = get_path(args.ml64, "ML64_PATH", "bin\\ml64.exe")
    63.     link_path = get_path(args.link, "LINK_PATH", "bin\\link.exe")
    64.     rc_path = get_path(args.rc, "RC_PATH", "bin\\rc.exe")
    65.     stub_path = get_path(args.stub, "STUB_PATH", "bin\\stubby.exe")
    66.     include_dir = get_path(args.include, "INCLUDE_DIR", "Include")
    67.     lib_dir = get_path(args.lib, "LIB_DIR", "Lib")
    68.  
    69.     # Проверяем существование основных исполняемых файлов
    70.     for exe, desc in [(ml64_path, "ml64"), (link_path, "link")]:
    71.         if not os.path.isfile(exe):
    72.             print(f"Error: {desc} not found at {exe}")
    73.             sys.exit(1)
    74.  
    75.     # Обработка имени файла
    76.     if args.filename:
    77.         base = args.filename
    78.         if base.lower().endswith('.asm'):
    79.             base = base[:-4]
    80.         asm_file = base + '.asm'
    81.         if not os.path.isfile(asm_file):
    82.             print(f"Error: {asm_file} not found.")
    83.             sys.exit(1)
    84.     else:
    85.         asm_file = select_file(".asm")
    86.         base = os.path.splitext(asm_file)[0]
    87.  
    88.     rc_file = base + '.rc'
    89.     has_rc = os.path.isfile(rc_file)
    90.  
    91.     print(f"Building {asm_file}...")
    92.  
    93.     # Компиляция asm
    94.     ml_cmd = [ml64_path, "/Cp", "/c", f"/I{include_dir}", asm_file]
    95.     print("Running: " + " ".join(ml_cmd))
    96.     result = subprocess.run(ml_cmd)
    97.     if result.returncode != 0:
    98.         print("ML64 failed.")
    99.         sys.exit(result.returncode)
    100.  
    101.     obj_file = base + '.obj'
    102.     if not os.path.isfile(obj_file):
    103.         print("Error: object file not created.")
    104.         sys.exit(1)
    105.  
    106.     # Компиляция ресурсов, если есть
    107.     res_file = base + '.res'
    108.     if has_rc:
    109.         if not os.path.isfile(rc_path):
    110.             print(f"Warning: rc.exe not found at {rc_path}, skipping resource compilation.")
    111.             has_rc = False
    112.         else:
    113.             rc_cmd = [rc_path, "/r", rc_file]
    114.             print("Running: " + " ".join(rc_cmd))
    115.             result = subprocess.run(rc_cmd)
    116.             if result.returncode != 0:
    117.                 print("RC failed.")
    118.                 sys.exit(result.returncode)
    119.             if not os.path.isfile(res_file):
    120.                 print("Error: resource file not created.")
    121.                 sys.exit(1)
    122.  
    123.     # Линковка
    124.     link_cmd = [
    125.         link_path,
    126.         f"/SUBSYSTEM:{args.subsystem}",
    127.         f"/LIBPATH:{lib_dir}",
    128.         f"/entry:{args.entry}",
    129.         obj_file
    130.     ]
    131.     if has_rc:
    132.         link_cmd.append(res_file)
    133.     if not args.no_largeaddressaware:
    134.         link_cmd.append("/LARGEADDRESSAWARE:NO")
    135.     link_cmd.extend([
    136.         "/ALIGN:16",
    137.         "/SECTION:.text,W",
    138.         "/BASE:0x400000",
    139.         f"/STUB:{stub_path}"
    140.     ])
    141.  
    142.     print("Running: " + " ".join(link_cmd))
    143.     result = subprocess.run(link_cmd)
    144.     if result.returncode != 0:
    145.         print("LINK failed.")
    146.         sys.exit(result.returncode)
    147.  
    148.     # Удаление промежуточных файлов, если не указано --keep
    149.     if not args.keep:
    150.         if os.path.isfile(obj_file):
    151.             os.remove(obj_file)
    152.         if has_rc and os.path.isfile(res_file):
    153.             os.remove(res_file)
    154.  
    155.     print("Build successful.")
    156.  
    157. if __name__ == "__main__":
    158.     main()
     
    Последнее редактирование: 8 мар 2026
  15. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    У меня работает. Ну типа ты не реализовал сбор выхлопа и тут же он тебе понадобился.
    Код (Text):
    1.     # Компиляция asm
    2.     ml_cmd = [ml64_path, "/Cp", "/c", f"/I{include_dir}", asm_file]
    3.     print("Running: " + " ".join(ml_cmd))
    4.     #result = subprocess.run(ml_cmd)
    5.     #if result.returncode != 0:
    6.     #    print("ML64 failed.")
    7.     #    sys.exit(result.returncode)
    8.     outpt='\n'
    9.     with subprocess.Popen(ml_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True) as p:
    10.         while p.poll() is None:
    11.             time.sleep(0.5)
    12.         while True:
    13.             line=p.stderr.readline()
    14.             if line!='':
    15.                 outpt+=line
    16.             else:
    17.                 break
    18.         while True:
    19.             line=p.stdout.readline()
    20.             if line!='':
    21.                 outpt+=line
    22.             else:
    23.                 break
    24.         if p.returncode != 0:
    25.             print(f"ML64 failed.{outpt}")
    26.             sys.exit(p.returncode)
     
  16. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    160
    Какая-то лажа с .inc файлами
    Код (Python):
    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3.  
    4. import os
    5. import sys
    6. import subprocess
    7. import argparse
    8. import glob
    9. import time
    10.  
    11. def find_files(path, ext):
    12.     """Возвращает список файлов с заданным расширением в папке."""
    13.     return glob.glob(os.path.join(path, "*" + ext))
    14.  
    15. def select_file(ext):
    16.     """Интерактивный выбор файла с расширением ext."""
    17.     files = find_files(".", ext)
    18.     if not files:
    19.         print(f"Файлы с расширением {ext} не найдены в текущей папке.")
    20.         sys.exit(1)
    21.     print("Доступные файлы:")
    22.     for i, f in enumerate(files, 1):
    23.         print(f"{i}. {f}")
    24.     while True:
    25.         try:
    26.             choice = int(input("Введите номер: "))
    27.             if 1 <= choice <= len(files):
    28.                 return files[choice-1]
    29.             else:
    30.                 print("Неверный номер.")
    31.         except ValueError:
    32.             print("Пожалуйста, введите число.")
    33.  
    34. def run_command(cmd, description):
    35.     """
    36.    Запускает внешнюю команду, выводит её stdout/stderr в реальном времени.
    37.    При ошибке завершает скрипт с соответствующим кодом возврата.
    38.    """
    39.     print(f"\n--- {description} ---")
    40.     print("Выполняется: " + " ".join(cmd))
    41.     with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) as p:
    42.         # Чтение потоков, пока процесс жив
    43.         while p.poll() is None:
    44.             out_line = p.stdout.readline()
    45.             err_line = p.stderr.readline()
    46.             if out_line:
    47.                 print(out_line, end='')
    48.             if err_line:
    49.                 print(err_line, end='')
    50.             time.sleep(0.1)
    51.         # Дочитываем остатки
    52.         for line in p.stdout:
    53.             print(line, end='')
    54.         for line in p.stderr:
    55.             print(line, end='')
    56.     if p.returncode != 0:
    57.         print(f"ОШИБКА: {description} завершилась с кодом {p.returncode}")
    58.         sys.exit(p.returncode)
    59.     return p.returncode
    60.  
    61. def main():
    62.     parser = argparse.ArgumentParser(description="Сборка MASM64 программы")
    63.     parser.add_argument("filename", nargs="?", help="Имя файла .asm (можно без расширения)")
    64.     parser.add_argument("--masm64-root", help="Корневая папка MASM64 (по умолчанию C:\\masm64)")
    65.     parser.add_argument("--ml64", help="Полный путь к ml64.exe")
    66.     parser.add_argument("--link", help="Полный путь к link.exe")
    67.     parser.add_argument("--rc", help="Полный путь к RC.exe")
    68.     parser.add_argument("--stub", help="Полный путь к stubby.exe")
    69.     parser.add_argument("--include", action="append", help="Папка для поиска include-файлов (можно указывать несколько раз)")
    70.     parser.add_argument("--lib", help="Папка с библиотеками (LIBPATH)")
    71.     parser.add_argument("--entry", default="WinMain", help="Точка входа (по умолчанию WinMain)")
    72.     parser.add_argument("--subsystem", default="WINDOWS", help="Подсистема (по умолчанию WINDOWS)")
    73.     parser.add_argument("--keep", action="store_true", help="Не удалять промежуточные .obj и .res файлы")
    74.     parser.add_argument("--no-largeaddressaware", action="store_true", help="Убрать флаг /LARGEADDRESSAWARE:NO (по умолчанию добавляется)")
    75.     args = parser.parse_args()
    76.  
    77.     # --- Определение путей с приоритетом: аргумент > переменная окружения > значение по умолчанию ---
    78.     if args.masm64_root:
    79.         masm64_root = args.masm64_root
    80.     else:
    81.         masm64_root = os.environ.get("MASM64_ROOT", "C:\\masm64")
    82.  
    83.     def get_path(arg, env_var, default_rel):
    84.         if arg:
    85.             return arg
    86.         env = os.environ.get(env_var)
    87.         if env:
    88.             return env
    89.         return os.path.join(masm64_root, default_rel)
    90.  
    91.     ml64_path = get_path(args.ml64, "ML64_PATH", "bin\\ml64.exe")
    92.     link_path = get_path(args.link, "LINK_PATH", "bin\\link.exe")
    93.     rc_path = get_path(args.rc, "RC_PATH", "bin\\rc.exe")
    94.     stub_path = get_path(args.stub, "STUB_PATH", "bin\\stubby.exe")
    95.     lib_dir = get_path(args.lib, "LIB_DIR", "Lib")
    96.  
    97.     # --- Обработка include-путей (может быть несколько) ---
    98.     include_dirs = []
    99.     if args.include:
    100.         include_dirs = args.include
    101.     else:
    102.         env_include = os.environ.get("INCLUDE_DIR")
    103.         if env_include:
    104.             # Разделитель в Windows — точка с запятой
    105.             include_dirs = [d.strip() for d in env_include.split(';') if d.strip()]
    106.         else:
    107.             # По умолчанию только папка Include в корне MASM64
    108.             include_dirs = [os.path.join(masm64_root, "Include")]
    109.  
    110.     # --- Проверка наличия основных исполняемых файлов ---
    111.     for exe, desc in [(ml64_path, "ml64"), (link_path, "link")]:
    112.         if not os.path.isfile(exe):
    113.             print(f"Ошибка: {desc} не найден по пути {exe}")
    114.             sys.exit(1)
    115.  
    116.     # --- Определение имени файла для сборки ---
    117.     if args.filename:
    118.         base = args.filename
    119.         if base.lower().endswith('.asm'):
    120.             base = base[:-4]
    121.         asm_file = base + '.asm'
    122.         if not os.path.isfile(asm_file):
    123.             print(f"Ошибка: файл {asm_file} не найден.")
    124.             sys.exit(1)
    125.     else:
    126.         asm_file = select_file(".asm")
    127.         base = os.path.splitext(asm_file)[0]
    128.  
    129.     rc_file = base + '.rc'
    130.     has_rc = os.path.isfile(rc_file)
    131.  
    132.     print(f"\nСборка {asm_file}...")
    133.  
    134.     # --- Шаг 1: компиляция ассемблерного файла ---
    135.     ml_cmd = [ml64_path, "/Cp", "/c"]
    136.     for inc in include_dirs:
    137.         ml_cmd.append(f"/I{inc}")
    138.     ml_cmd.append(asm_file)
    139.     run_command(ml_cmd, "Компиляция ML64")
    140.  
    141.     obj_file = base + '.obj'
    142.     if not os.path.isfile(obj_file):
    143.         print("Ошибка: объектный файл не создан.")
    144.         sys.exit(1)
    145.  
    146.     # --- Шаг 2: компиляция ресурсов (если есть .rc) ---
    147.     res_file = base + '.res'
    148.     if has_rc:
    149.         if not os.path.isfile(rc_path):
    150.             print(f"Предупреждение: RC.exe не найден по пути {rc_path}, ресурсы компилироваться не будут.")
    151.             has_rc = False
    152.         else:
    153.             rc_cmd = [rc_path, "/r", rc_file]
    154.             run_command(rc_cmd, "Компиляция ресурсов")
    155.             if not os.path.isfile(res_file):
    156.                 print("Ошибка: файл ресурсов не создан.")
    157.                 sys.exit(1)
    158.  
    159.     # --- Шаг 3: линковка ---
    160.     if not os.path.isfile(stub_path):
    161.         print(f"Ошибка: stubby.exe не найден по пути {stub_path}")
    162.         sys.exit(1)
    163.  
    164.     link_cmd = [
    165.         link_path,
    166.         f"/SUBSYSTEM:{args.subsystem}",
    167.         f"/LIBPATH:{lib_dir}",
    168.         f"/entry:{args.entry}",
    169.         obj_file
    170.     ]
    171.     if has_rc:
    172.         link_cmd.append(res_file)
    173.     if not args.no_largeaddressaware:
    174.         link_cmd.append("/LARGEADDRESSAWARE:NO")
    175.     link_cmd.extend([
    176.         "/ALIGN:16",
    177.         "/SECTION:.text,W",
    178.         "/BASE:0x400000",
    179.         f"/STUB:{stub_path}"
    180.     ])
    181.  
    182.     run_command(link_cmd, "Линковка")
    183.  
    184.     # --- Шаг 4: удаление промежуточных файлов (опционально) ---
    185.     if not args.keep:
    186.         if os.path.isfile(obj_file):
    187.             os.remove(obj_file)
    188.         if has_rc and os.path.isfile(res_file):
    189.             os.remove(res_file)
    190.  
    191.     print("\nСборка успешно завершена.")
    192.  
    193. if __name__ == "__main__":
    194.     main()
     
  17. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Переменную окружения с путем к инклудам ("INCLUDE") не зарегистрировал видимо.
     
  18. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    160
    Последнее редактирование: 8 мар 2026
  19. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Ну типа немая сцена, занавес.
    изображение_2026-03-08_040111108.png
     
  20. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    160