Открыть в нех-редакторе, увидеть сигнатуру 'MZ' и догадаться, что это PE-файлы, не пожатые даже expand'ом. Просто вытащенные из cab'ов. Две версии ml64 это x86 и x64 версии. Остается отобрать нужные и переименовать.
2008 студия. Кстати после 2012 весь софт у них какой-то всратый. Чем дальше тем хуже. Еще бы .lib файлы с оригинальной студии достать. Много директорий с ними, хз какая правильная. Вы когда .asm файлы компилируете их переименовывайте. Потом обратно переименовывайте?
У меня фасм сам знает какое имя и расширение файла выбрать. А в фасм.г можно даже вписать имя выхлопного файла. Только контрол-ф9 давишь и все. Сортировка отобранных файлов это другой этап, где желательно тестировать приложение, я на себя такую обязанность не брал. Опять же чем первозданней вид файла, тем менее страшно запускать, не?
Код (Text): :: очистка экрана cls :: имя asm-файла без расширения set filename=1 :: здесь путь к папке masm64, у Вас он может быть другим set masm64_path=..\masm64\ :: если существует exe-файл с таким же именем ? удаляем его if exist %filename%.exe del %filename%.exe :: компиляция :: если во время компиляции будут ошибки, тогда они будут перечислены в файле errors.txt %masm64_path%bin\ml64 /c %filename%.asm >> errors.txt :: обнаружены ошибки компиляции ? выходим if errorlevel 1 exit :: линковка :: если во время линковки будут ошибки ? тогда они будут перечислены в файле errors.txt %masm64_path%bin\link /SUBSYSTEM:WINDOWS /entry:WinMain %filename%.obj >> errors.txt :: обнаружены ошибки линковки ? выходим if errorlevel 1 exit :: раз мы здесь ? значит ошибок нет ? удаляем "программный мусор" del %filename%.obj del errors.txt pause Там цифровые подписи есть. Без них было бы страшно. Речь не о фасме. Надо масм64 собрать.
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): .code mainCRTStartup proc ret mainCRTStartup endp end таким батом Код (Text): @echo off set appname=1 del %appname%.obj del %appname%.exe masm64\bin64\ml64.exe /c %appname%.asm masm64\bin64\link.exe /SUBSYSTEM:CONSOLE /MACHINE:X64 /nologo /LARGEADDRESSAWARE %appname%.obj
Похоже, что Microsoft прикрыли лавочку с свободным скачиванием платных версий, с ограничением по времени, без регистации. Возможно, что если зарегистрироваться у них на сайте, то скачивание платной версии и получися - не пробовал, ничего не могу сказать. У меня остались официальные, лично мной скачанные, установщики к VS 2017 Pro и к VS2022 Pro. Сейчас попробовал всё работает и скачивается без проблем. Могу скинуть куда-нибудь, если кому-нибудь нужно.Не думаю, что там какая-нибудь привязка по IP или ещё что-нибудь.
Здесь файлы с 2008 студии. https://www.sendspace.com/file/wfrr0j В masm64, если я правильно все понял рипнут полный набор файлов. В bin в первозданном виде все файлы студии. Оттуда можно рипать файлы для masm32. Заголовочные файлы на первое время скачивал отсюда https://dsmhelp.narod.ru/masm64.zip У нас есть 31 + уроков по масму64. С ехе разобрались. Сейчас не понятно что с .bat файлами. Проблему с рантаймами я скорее всего преувеличил. Если возникнет - будем думать. Есть один торрент, там можно скачать много разных версий. В том числе 2008 англ/ру.
Кстати если уж тягаться в удобстве с фасмом, можно пару директив в начале файла указывать комментарием, а вместо бата парсить файл нормальным интерпретатором типа питона. Таким образом исходник может содержать всю исчерпывающую информацию для сборки.
Код (Text): ;rc rsrc.rc ;cvtres /machine:ix86 rsrc.res ;ml64 /c /Zd /coff 1.asm ;ml64 /c /Zd /coff 2.asm ;ml64 /c /Zd /coff 3.asm ;ml64 /c /Zd /coff 4.asm ;link /SUBSYSTEM:CONSOLE 1.obj 2.obj 3.obj 4.obj rsrc.obj Например парсер находит по операторам 'rc', 'cvtres', 'ml64' и 'link' нужные строки, передает cmd.exe, забирая выхлоп и ошибки. При отсутствии нужных директив - выполняет дефолтное 'ml64 + link' с дефолтными параметрами. При отсутствии имени файла в строке, подставляет имя исходника с нужным расширением: Код (Text): ;ml64 /c ;link /SUBSYSTEM:CONSOLE Вообще вываливать выхлоп во временный файл нерационально, нормальный интерпретатор может куда угодно выхлоп передать, не шатая ресурс накопителя:
Research, set filename=1 <---Здесь ошибка должно быть set filename=%~n1. В командной строке asm.bat Hello.asm переменная %0 в bat-файле соответствует нулевому аргументу командной строки, т.е. имени самого bat-файла. Дальше bat-файл разворачивает %~n1 в имя файла без расширения asm. Потом переменная %filename% будет использована с расширениями obj, exe, dll или sys
Теперь есть bin, lib, include. Далее кладем их на диск c: в masm64: Выбираем один из уроков: Ии.... --- Сообщение объединено, 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 --- Сообщение объединено, 8 мар 2026 --- Сейчас не понятно что с .bat файлами. --- Сообщение объединено, 8 мар 2026 --- Сделал более наглядный пример зачем нужен build_asm.py Имя .asm файла при его выборе из нескольких .asm файлов будет выводиться в MessageBox Код (Python): from ctypes import wintypes, windll ##-------------------------------------------------------- def ShowMessage(s): MessageBox = windll.user32.MessageBoxW MessageBox(None, str(s), "", 0x00000040) ##-------------------------------------------------------- --- Сообщение объединено, 8 мар 2026 --- См. build_asm2
Mikl___, f13nd, GRAFik, Пытаюсь собрать tut_01 сырым скриптом из говна и палок: Код (Python): #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import subprocess import argparse import glob def find_files(path, ext): return glob.glob(os.path.join(path, "*" + ext)) def select_file(ext): files = find_files(".", ext) if not files: print(f"No {ext} files found in current directory.") sys.exit(1) print("Available files:") for i, f in enumerate(files, 1): print(f"{i}. {f}") while True: try: choice = int(input("Enter number: ")) if 1 <= choice <= len(files): return files[choice-1] else: print("Invalid number.") except ValueError: print("Please enter a number.") def main(): parser = argparse.ArgumentParser(description="Build MASM64 assembly file.") parser.add_argument("filename", nargs="?", help="Assembly file name (without .asm or with)") parser.add_argument("--masm64-root", help="Root directory of MASM64 (default: C:\\masm64)") parser.add_argument("--ml64", help="Path to ml64.exe") parser.add_argument("--link", help="Path to link.exe") parser.add_argument("--rc", help="Path to RC.exe") parser.add_argument("--stub", help="Path to stubby.exe") parser.add_argument("--include", help="Include directory") parser.add_argument("--lib", help="Lib directory") parser.add_argument("--entry", default="WinMain", help="Entry point (default: WinMain)") parser.add_argument("--subsystem", default="WINDOWS", help="Subsystem (default: WINDOWS)") parser.add_argument("--keep", action="store_true", help="Keep intermediate .obj and .res files") parser.add_argument("--no-largeaddressaware", action="store_true", help="Remove /LARGEADDRESSAWARE:NO (default: add it)") args = parser.parse_args() # Определяем корневой путь MASM64 if args.masm64_root: masm64_root = args.masm64_root else: masm64_root = os.environ.get("MASM64_ROOT", "C:\\masm64") # Формируем пути с приоритетом: аргумент > переменная окружения > значение по умолчанию из корня def get_path(arg, env_var, default_rel): if arg: return arg env = os.environ.get(env_var) if env: return env return os.path.join(masm64_root, default_rel) ml64_path = get_path(args.ml64, "ML64_PATH", "bin\\ml64.exe") link_path = get_path(args.link, "LINK_PATH", "bin\\link.exe") rc_path = get_path(args.rc, "RC_PATH", "bin\\rc.exe") stub_path = get_path(args.stub, "STUB_PATH", "bin\\stubby.exe") include_dir = get_path(args.include, "INCLUDE_DIR", "Include") lib_dir = get_path(args.lib, "LIB_DIR", "Lib") # Проверяем существование основных исполняемых файлов for exe, desc in [(ml64_path, "ml64"), (link_path, "link")]: if not os.path.isfile(exe): print(f"Error: {desc} not found at {exe}") sys.exit(1) # Обработка имени файла if args.filename: base = args.filename if base.lower().endswith('.asm'): base = base[:-4] asm_file = base + '.asm' if not os.path.isfile(asm_file): print(f"Error: {asm_file} not found.") sys.exit(1) else: asm_file = select_file(".asm") base = os.path.splitext(asm_file)[0] rc_file = base + '.rc' has_rc = os.path.isfile(rc_file) print(f"Building {asm_file}...") # Компиляция asm ml_cmd = [ml64_path, "/Cp", "/c", f"/I{include_dir}", asm_file] print("Running: " + " ".join(ml_cmd)) result = subprocess.run(ml_cmd) if result.returncode != 0: print("ML64 failed.") sys.exit(result.returncode) obj_file = base + '.obj' if not os.path.isfile(obj_file): print("Error: object file not created.") sys.exit(1) # Компиляция ресурсов, если есть res_file = base + '.res' if has_rc: if not os.path.isfile(rc_path): print(f"Warning: rc.exe not found at {rc_path}, skipping resource compilation.") has_rc = False else: rc_cmd = [rc_path, "/r", rc_file] print("Running: " + " ".join(rc_cmd)) result = subprocess.run(rc_cmd) if result.returncode != 0: print("RC failed.") sys.exit(result.returncode) if not os.path.isfile(res_file): print("Error: resource file not created.") sys.exit(1) # Линковка link_cmd = [ link_path, f"/SUBSYSTEM:{args.subsystem}", f"/LIBPATH:{lib_dir}", f"/entry:{args.entry}", obj_file ] if has_rc: link_cmd.append(res_file) if not args.no_largeaddressaware: link_cmd.append("/LARGEADDRESSAWARE:NO") link_cmd.extend([ "/ALIGN:16", "/SECTION:.text,W", "/BASE:0x400000", f"/STUB:{stub_path}" ]) print("Running: " + " ".join(link_cmd)) result = subprocess.run(link_cmd) if result.returncode != 0: print("LINK failed.") sys.exit(result.returncode) # Удаление промежуточных файлов, если не указано --keep if not args.keep: if os.path.isfile(obj_file): os.remove(obj_file) if has_rc and os.path.isfile(res_file): os.remove(res_file) print("Build successful.") if __name__ == "__main__": main()
У меня работает. Ну типа ты не реализовал сбор выхлопа и тут же он тебе понадобился. Код (Text): # Компиляция asm ml_cmd = [ml64_path, "/Cp", "/c", f"/I{include_dir}", asm_file] print("Running: " + " ".join(ml_cmd)) #result = subprocess.run(ml_cmd) #if result.returncode != 0: # print("ML64 failed.") # sys.exit(result.returncode) outpt='\n' with subprocess.Popen(ml_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True) as p: while p.poll() is None: time.sleep(0.5) while True: line=p.stderr.readline() if line!='': outpt+=line else: break while True: line=p.stdout.readline() if line!='': outpt+=line else: break if p.returncode != 0: print(f"ML64 failed.{outpt}") sys.exit(p.returncode)
Какая-то лажа с .inc файлами Код (Python): #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import subprocess import argparse import glob import time def find_files(path, ext): """Возвращает список файлов с заданным расширением в папке.""" return glob.glob(os.path.join(path, "*" + ext)) def select_file(ext): """Интерактивный выбор файла с расширением ext.""" files = find_files(".", ext) if not files: print(f"Файлы с расширением {ext} не найдены в текущей папке.") sys.exit(1) print("Доступные файлы:") for i, f in enumerate(files, 1): print(f"{i}. {f}") while True: try: choice = int(input("Введите номер: ")) if 1 <= choice <= len(files): return files[choice-1] else: print("Неверный номер.") except ValueError: print("Пожалуйста, введите число.") def run_command(cmd, description): """ Запускает внешнюю команду, выводит её stdout/stderr в реальном времени. При ошибке завершает скрипт с соответствующим кодом возврата. """ print(f"\n--- {description} ---") print("Выполняется: " + " ".join(cmd)) with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) as p: # Чтение потоков, пока процесс жив while p.poll() is None: out_line = p.stdout.readline() err_line = p.stderr.readline() if out_line: print(out_line, end='') if err_line: print(err_line, end='') time.sleep(0.1) # Дочитываем остатки for line in p.stdout: print(line, end='') for line in p.stderr: print(line, end='') if p.returncode != 0: print(f"ОШИБКА: {description} завершилась с кодом {p.returncode}") sys.exit(p.returncode) return p.returncode def main(): parser = argparse.ArgumentParser(description="Сборка MASM64 программы") parser.add_argument("filename", nargs="?", help="Имя файла .asm (можно без расширения)") parser.add_argument("--masm64-root", help="Корневая папка MASM64 (по умолчанию C:\\masm64)") parser.add_argument("--ml64", help="Полный путь к ml64.exe") parser.add_argument("--link", help="Полный путь к link.exe") parser.add_argument("--rc", help="Полный путь к RC.exe") parser.add_argument("--stub", help="Полный путь к stubby.exe") parser.add_argument("--include", action="append", help="Папка для поиска include-файлов (можно указывать несколько раз)") parser.add_argument("--lib", help="Папка с библиотеками (LIBPATH)") parser.add_argument("--entry", default="WinMain", help="Точка входа (по умолчанию WinMain)") parser.add_argument("--subsystem", default="WINDOWS", help="Подсистема (по умолчанию WINDOWS)") parser.add_argument("--keep", action="store_true", help="Не удалять промежуточные .obj и .res файлы") parser.add_argument("--no-largeaddressaware", action="store_true", help="Убрать флаг /LARGEADDRESSAWARE:NO (по умолчанию добавляется)") args = parser.parse_args() # --- Определение путей с приоритетом: аргумент > переменная окружения > значение по умолчанию --- if args.masm64_root: masm64_root = args.masm64_root else: masm64_root = os.environ.get("MASM64_ROOT", "C:\\masm64") def get_path(arg, env_var, default_rel): if arg: return arg env = os.environ.get(env_var) if env: return env return os.path.join(masm64_root, default_rel) ml64_path = get_path(args.ml64, "ML64_PATH", "bin\\ml64.exe") link_path = get_path(args.link, "LINK_PATH", "bin\\link.exe") rc_path = get_path(args.rc, "RC_PATH", "bin\\rc.exe") stub_path = get_path(args.stub, "STUB_PATH", "bin\\stubby.exe") lib_dir = get_path(args.lib, "LIB_DIR", "Lib") # --- Обработка include-путей (может быть несколько) --- include_dirs = [] if args.include: include_dirs = args.include else: env_include = os.environ.get("INCLUDE_DIR") if env_include: # Разделитель в Windows — точка с запятой include_dirs = [d.strip() for d in env_include.split(';') if d.strip()] else: # По умолчанию только папка Include в корне MASM64 include_dirs = [os.path.join(masm64_root, "Include")] # --- Проверка наличия основных исполняемых файлов --- for exe, desc in [(ml64_path, "ml64"), (link_path, "link")]: if not os.path.isfile(exe): print(f"Ошибка: {desc} не найден по пути {exe}") sys.exit(1) # --- Определение имени файла для сборки --- if args.filename: base = args.filename if base.lower().endswith('.asm'): base = base[:-4] asm_file = base + '.asm' if not os.path.isfile(asm_file): print(f"Ошибка: файл {asm_file} не найден.") sys.exit(1) else: asm_file = select_file(".asm") base = os.path.splitext(asm_file)[0] rc_file = base + '.rc' has_rc = os.path.isfile(rc_file) print(f"\nСборка {asm_file}...") # --- Шаг 1: компиляция ассемблерного файла --- ml_cmd = [ml64_path, "/Cp", "/c"] for inc in include_dirs: ml_cmd.append(f"/I{inc}") ml_cmd.append(asm_file) run_command(ml_cmd, "Компиляция ML64") obj_file = base + '.obj' if not os.path.isfile(obj_file): print("Ошибка: объектный файл не создан.") sys.exit(1) # --- Шаг 2: компиляция ресурсов (если есть .rc) --- res_file = base + '.res' if has_rc: if not os.path.isfile(rc_path): print(f"Предупреждение: RC.exe не найден по пути {rc_path}, ресурсы компилироваться не будут.") has_rc = False else: rc_cmd = [rc_path, "/r", rc_file] run_command(rc_cmd, "Компиляция ресурсов") if not os.path.isfile(res_file): print("Ошибка: файл ресурсов не создан.") sys.exit(1) # --- Шаг 3: линковка --- if not os.path.isfile(stub_path): print(f"Ошибка: stubby.exe не найден по пути {stub_path}") sys.exit(1) link_cmd = [ link_path, f"/SUBSYSTEM:{args.subsystem}", f"/LIBPATH:{lib_dir}", f"/entry:{args.entry}", obj_file ] if has_rc: link_cmd.append(res_file) if not args.no_largeaddressaware: link_cmd.append("/LARGEADDRESSAWARE:NO") link_cmd.extend([ "/ALIGN:16", "/SECTION:.text,W", "/BASE:0x400000", f"/STUB:{stub_path}" ]) run_command(link_cmd, "Линковка") # --- Шаг 4: удаление промежуточных файлов (опционально) --- if not args.keep: if os.path.isfile(obj_file): os.remove(obj_file) if has_rc and os.path.isfile(res_file): os.remove(res_file) print("\nСборка успешно завершена.") if __name__ == "__main__": main()
Среди файлов в C:\masm64\Include вообще нет такого файла win64a.inc Файлы брались отсюда: https://dsmhelp.narod.ru/masm64.zip По рекомендации https://wasm.in/threads/skazki-djadjushki-rimusa-o-x64.31832/